我有一个简单的 Tkinter GUI,它在单独的线程中运行一个函数,并通过重定向标准输出将输出打印到 Text 小部件。
我想要一个滚动条来伴随文本框。但是,出现滚动条似乎会以某种方式破坏工作,并且 GUI 会冻结。
我有一个包装器来根据这个答案重定向标准输出:
class StdOutRedirector(object):
def __init__(self, widget):
self.widget = widget
def write(self, str):
self.widget.configure(state = 'normal')
self.widget.insert(END, str)
self.widget.see(END)
self.flush()
self.widget.configure(state = 'disabled')
def flush(self):
self.widget.update_idletasks()
我的图形用户界面:
class Console(Frame):
def __init__(self, master):
Frame.__init__(self, master, bg = 'gray', padx = 5, pady = 5)
self.master = master
self.old_stdout = sys.stdout
self.output = Text(self.master, height = 30, width = 80, state = 'disabled')
self.outScroll = Scrollbar(self.master, orient = 'vertical', command = self.output.yview)
self.output.configure(yscrollcommand = self.outScroll.set)
self.output.grid(row = 0, column = 1)
self.outScroll.grid(row = 0, column = 2, sticky = 'nesw')
def run(self):
self.script_thread = threading.Thread(target = auto)
sys.stdout = StdOutRedirector(self.output)
self.script_thread.start()
self.script_thread.join()
sys.stdout = self.old_stdout
def auto():
for i in range(40):
print(i)
time.sleep(0.1)
如果我的 GUI 中有滚动条,我只会看到一个打印语句,然后 Tk 应用程序会冻结。但是,如果我关闭滚动条,我可以毫无问题地看到整个打印输出。
此外,如果我不在单独的线程中调用该函数,滚动条似乎没有问题。
关于滚动条正在做什么以导致单独线程出现问题的任何想法?
谢谢,肖恩