【发布时间】:2021-01-02 18:49:49
【问题描述】:
我正在尝试为我的 python 应用程序创建一个 GUI,我正在努力让 Text Widget 表现得像一个标准输出。更具体地说,我希望小部件在请求时立即显示信息,而不是在一切完成后显示。
为了演示,考虑一下:
import sys
import time
import multiprocessing as mp
import multiprocessing.queues as mpq
from threading import Thread
from tkinter import *
class StdoutQueue(mpq.Queue):
def __init__(self, *args, **kwargs):
ctx = mp.get_context()
super(StdoutQueue, self).__init__(*args, **kwargs, ctx=ctx)
def write(self,msg):
self.put(msg)
def flush(self):
sys.__stdout__.flush()
def text_catcher(text_widget,queue):
while True:
text_widget.insert(END, queue.get())
def test_child(q):
sys.stdout = q
print('child running')
def test_parent(q):
sys.stdout = q
print('parent running')
time.sleep(5.)
mp.Process(target=test_child,args=(q,)).start()
if __name__ == '__main__':
gui_root = Tk()
gui_txt = Text(gui_root)
gui_txt.pack()
q = StdoutQueue()
gui_btn = Button(gui_root, text='Test', command=lambda: test_parent(q),)
gui_btn.pack()
monitor = Thread(target=text_catcher, args=(gui_txt, q))
monitor.daemon = True
monitor.start()
gui_root.mainloop()
点击Test 按钮不会立即打印'parent running' 并在5 秒后打印'child running',而是等待5 秒并同时打印两个字符串。
有什么方法可以得到想要的行为?
【问题讨论】:
标签: python python-3.x multithreading tkinter