我创建了一个tkinter文本小部件并希望重定向系统标准输出到文本小部件。我部分地实现了这个功能,但我面临多处理的问题。在
下面是一个你可以玩的python3玩具
import sys
import tkinter as tk
from multiprocessing import Pool
root = tk.Tk()
root.geometry('600x400+30+30')
textArea = tk.Text(root, bg='gray', width=70, height=20)
textArea.pack()
tk.Button(root, text='click me', command=lambda: print('Dont touch\n me!')).pack()
class redirectStd():
def __init__(self, textWidget):
self.textBoard = textWidget
self.flush = sys.stdout.flush
def write(self, msg):
self.textBoard.insert('end', msg)
sys.stdout = redirectStd(textArea)
sys.stderr = redirectStd(textArea)
def f(x):
print('calculate:', x, '** 2')
return x ** 2
def testParallel():
print('start testing')
with Pool(processes=2) as p:
res = p.map(f, [1, 4, 0, 7, 3, 5])
print(res)
tk.Button(root, text='test multiprocessing', command=testParallel).pack()
root.mainloop()
这将正常运行。但是,def f(x)
中的打印不会打印文本小部件中的任何内容。在
如果class redirectStd
块中的注释self.flush = sys.stdout.flush
,则会导致错误,该错误会抱怨redirectStd中未定义flush。在这个阶段,我还没有找到如何为redirectStd定义flush方法。完整的错误消息是
有人能为这个问题提供一些解决办法吗?谢谢!在
我认为您使用多线程的方式可能有问题,请查看下面的文档
https://docs.python.org/2/library/multiprocessing.htmlhttps://docs.python.org/2/library/multiprocessing.html#multiprocessing-programming
我用稍微不同的方法解决了你的问题,希望这有帮助
相关问题 更多 >
编程相关推荐