将输出从 Python 记录器重定向到 tkinter 小部件

2024-04-09

花了一些时间重定向 stdout 并将输出记录到 tkinter 文本小部件后,我决定需要一些帮助。我的代码如下:

#!/usr/bin/env python
from Tkinter import *
import logging
from threading import Thread

class IODirector(object):
    def __init__(self,text_area):
        self.text_area = text_area

class StdoutDirector(IODirector):
    def write(self,str):
        self.text_area.insert(END,str)
    def flush(self):
        pass

class App(Frame):

    def __init__(self, master):
        self.master = master
        Frame.__init__(self,master,relief=SUNKEN,bd=2)
        self.start()

    def start(self):
        self.master.title("Test")
        self.submit = Button(self.master, text='Run', command=self.do_run, fg="red")
        self.submit.grid(row=1, column=2)
        self.text_area = Text(self.master,height=2.5,width=30,bg='light cyan')
        self.text_area.grid(row=1,column=1)

    def do_run(self):
        t = Thread(target=print_stuff)
        sys.stdout = StdoutDirector(self.text_area)
        t.start()

def print_stuff():
    logger = logging.getLogger('print_stuff')
    logger.info('This will not show')
    print 'This will show'
    print_some_other_stuff()

def print_some_other_stuff():
    logger = logging.getLogger('print_some_other_stuff')
    logger.info('This will also not show')
    print 'This will also show'

def main():    
    logger = logging.getLogger('main')
    root = Tk()
    app = App(root)
    root.mainloop() 

if __name__=='__main__':
    main()

我知道可以基于文本小部件定义一个新的日志记录处理程序,但我无法让它工作。函数“print_stuff”实际上只是许多不同函数的包装器,所有函数都设置了自己的记录器。我需要帮助定义一个新的“全局”日志记录处理程序,以便可以从每个拥有自己的记录器的函数实例化它。任何帮助深表感谢。


只是为了确保我理解正确:

您希望将日志消息打印到 STDout 和 Tkinter 文本小部件,但日志记录不会在标准控制台中打印。

如果这确实是您的问题,请按以下步骤操作。

首先让我们在 Tkinter 中创建一个非常简单的控制台,它实际上可以是任何文本小部件,但为了完整性我将其包括在内:

class LogDisplay(tk.LabelFrame):
"""A simple 'console' to place at the bottom of a Tkinter window """
    def __init__(self, root, **options):
        tk.LabelFrame.__init__(self, root, **options);

        "Console Text space"
        self.console = tk.Text(self, height=10)
        self.console.pack(fill=tk.BOTH)

现在让我们重写日志处理程序以重定向到参数中的控制台,并仍然自动打印到 STDout:

class LoggingToGUI(logging.Handler):
""" Used to redirect logging output to the widget passed in parameters """
    def __init__(self, console):
        logging.Handler.__init__(self)

        self.console = console #Any text widget, you can use the class above or not

    def emit(self, message): # Overwrites the default handler's emit method
        formattedMessage = self.format(message)  #You can change the format here

        # Disabling states so no user can write in it
        self.console.configure(state=tk.NORMAL)
        self.console.insert(tk.END, formattedMessage) #Inserting the logger message in the widget
        self.console.configure(state=tk.DISABLED)
        self.console.see(tk.END)
        print(message) #You can just print to STDout in your overriden emit no need for black magic

希望能帮助到你。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将输出从 Python 记录器重定向到 tkinter 小部件 的相关文章

随机推荐

  • 为什么使用 Nuxt v3 静态生成时 会输出两次后面的内容?

    我在用vue fontawesome https github com FortAwesome vue fontawesome与 Nuxt 3 一起使用 如上所述here https fontawesome com docs web use
  • Reactjs - 从应用程序中的任何位置获取组件

    我想知道是否有一种方法可以通过使用某种类型的 id 或类型来获取组件 就像在 DOM 操作中所做的那样 就像是 var Avatar React createClass render function React renderCompone
  • Rythm 模板引擎和 GAE

    有人设法让 Rythm 模板引擎与 Google Appengine 一起使用吗 Thanks 现在的节奏 版本1 0 0 20120505 http rythmengine com public rythm 1 0 0 20120505
  • 如何查询SOLR中的空字段?

    我有一个很大的 solr 索引 我注意到一些字段没有正确更新 索引是动态的 这导致某些字段具有空的 id 字段 我已经尝试过这些查询 但它们不起作用 id id NULL id null id id id TO 有没有办法查询空字段 Tha
  • 按字母顺序获取地图中的键的简单方法

    在 Go 中 让映射中的键按字母顺序排序的最简单方法是什么 这是我能做到的最短方法 package main import container vector import fmt import sort func main m map st
  • 可以放在桌子的底部吗?

    我想用一个 tfoot 表中的标签在语义上是正确的 但它一直显示在我的表的顶部 有没有办法让它显示在底部 正如其他人所说 tfoot是在之前定义的tbody但之后渲染 这是设计使然 不会改变语义 桌子有头 脚和身体 这些的顺序并不重要 Th
  • simple_form 提交的默认disable_with

    我想更改 simple form 中提交按钮的默认行为 这样我就不需要为所有表单显式指定 disable with gt true 如何在 simple form rb 中进行此特定更改 这在较新版本的 Rails 中略有不同 因为不推荐设
  • 纯js按属性名称开头选择元素

    语境 HTML div div div div p p 我想选择属性名称以以下开头的所有元素ng 使用 jQuery 以下链接是最接近此问题的线程 jQuery 如何按属性名称开头选择值 https stackoverflow com qu
  • java.net.UnknownHostException:www.google.com

    我正在开发一个健全性检查网络应用程序 我尝试使用 HttpUrlConnection 方法获取 url 响应 但收到 UnknownHostException System setProperty java net preferIPv4St
  • 使用 Kerberos、Web API 和 MVC 的示例项目

    是否有完整的 Visual Studio 解决方案 其中包含具有使用 Kerberos 进行身份验证的 MVC 应用程序的项目 这反过来又调用 ASP Net Web API 服务项目 在同一解决方案中 在服务调用期间将凭据委托给服务 Ge
  • UILabel - 已弃用方法“adjustsLetterSpacingToFitWidth”的替代方法

    因此 在我的代码中 我正在检查我的字符是否适合我的标签 并有以下行 return self adjustsLetterSpacingToFitWidth 这被放置在一个实现中UILabel 有人能告诉我确切的替代方案是什么吗 文档说 使用N
  • 具有 Linq-to-SQL 的 ADO.NET 数据服务

    在将 linq to sql 与 ado net 数据服务结合使用时 我遇到了一个奇怪的错误 我有一个连接到远程数据库的简单 silverlight 应用程序 我首先添加了 linq to sql 类并将一个表拖到设计器上 然后我添加了 A
  • 从 Pyspark 中包含时间戳的字符串列中提取日期

    我有一个数据框 其日期格式如下 date May 6 2016 5 59 34 AM 我打算以以下格式从中提取日期YYYY MM DD 所以结果应该是上述日期 2016 05 06 但是当我提取时使用以下内容 df withColumn p
  • Spark 无法再执行作业。执行器创建目录失败

    我们已经有一个小型 Spark 集群运行了一个月 它已经成功执行了作业 或者让我为该集群启动一个 Spark shell 无论我向集群提交作业还是使用 shell 连接到集群 错误总是相同的 root SPARK HOME bin spar
  • Javascript 按布尔属性对对象数组进行排序

    有关实际问题 请参阅最后的编辑 a false true true true true true true true true true true true true true true true true true true true t
  • 如何仅显示可组合项几秒钟?

    我有一个Text可组合在一个Box Box modifier Modifier Text text BlaBla 如何仅显示框 文本几秒钟 您可以使用LaunchedEffect并使用布尔标志延迟并在指定时间后将其设置为 false Com
  • 求 3d 中 2 个任意立方体的交集

    所以 我想找出一个函数 可以让您确定两个任意旋转和大小的立方体是否相交 如果立方体的旋转不是任意的 而是锁定到特定的轴 则相交很简单 您可以通过检查它们的边界来检查它们是否在所有三个维度上相交 以查看它们在所有三个维度上是否相交或在彼此之内
  • 方法和可选参数

    我在 Apple 文档中读到 我们可以在 Objective C 方法调用中使用可选参数 Apple 文档中的示例 采用可变数量参数的方法也是可能的 尽管它们有点罕见 额外的参数用逗号分隔 在方法名称末尾之后 与冒号不同 逗号不是 被视为名
  • 在 vb.net 中进行数学计算,就像在 javascript 中进行 Eval 一样

    有没有什么方法可以解析 vb net 中的字符串 例如内置方法 可以像 Eval 一样进行数学运算 例如 3 7 3 5 作为字符串将返回 2 我不是要求你为我编写这个代码 我只是想知道是否有built in这样做的方法 如果没有我会自己编
  • 将输出从 Python 记录器重定向到 tkinter 小部件

    花了一些时间重定向 stdout 并将输出记录到 tkinter 文本小部件后 我决定需要一些帮助 我的代码如下 usr bin env python from Tkinter import import logging from thre