多线程tkinter应用中如何重定向print到text,text组件每秒刷新一次
时间: 2023-06-05 07:06:06 浏览: 268
篇'-strapdown inertial navigation technology_2ed
可以使用Python的logging模块,将print输出信息写入到日志文件中,然后使用tkinter的text组件实现定时读取日志文件的内容,并显示到界面上。具体实现可以参考以下代码:
```python
import logging
import threading
import time
import tkinter as tk
class TextHandler(logging.Handler):
"""Custom logging handler that writes logs to the Text widget."""
def __init__(self, text):
logging.Handler.__init__(self)
self.text = text
def emit(self, record):
msg = self.format(record)
def append():
self.text.configure(state='normal')
self.text.insert(tk.END, msg + '\n')
self.text.configure(state='disabled')
self.text.yview(tk.END)
self.text.after(0, append)
class App(tk.Frame):
"""Main application class."""
def __init__(self, master=None):
tk.Frame.__init__(self, master)
self.pack()
self.create_widgets()
self.create_logger()
def create_widgets(self):
self.text = tk.Text(self)
self.text.pack(fill='both', expand=True)
def create_logger(self):
self.logger = logging.getLogger()
self.logger.setLevel(logging.INFO)
handler = TextHandler(self.text)
self.logger.addHandler(handler)
self.log_thread = threading.Thread(target=self.log_loop)
self.log_thread.daemon = True
self.log_thread.start()
def log_loop(self):
while True:
time.sleep(1)
self.logger.info('Test log message')
if __name__ == '__main__':
app = App()
app.mainloop()
```
这个应用使用了多线程技术,创建了一个单独的线程来执行日志输出操作,以免阻塞tkinter的GUI线程。在创建Logger对象时,我们指定了一个自定义的TextHandler,将print输出信息写入到Text组件中。同时,定时读取日志文件的内容,并显示到界面上。
阅读全文