0

我有一个简单的 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 应用程序会冻结。但是,如果我关闭滚动条,我可以毫无问题地看到整个打印输出。

此外,如果我不在单独的线程中调用该函数,滚动条似乎没有问题。

关于滚动条正在做什么以导致单独线程出现问题的任何想法?

谢谢,肖恩

4

0 回答 0