在写入时更新Tkinter文本小部件,而不是在类完成后更新

Rya*_*ons 5 python buffer text tkinter

我是绑定的,因为这是在分类机器上写的,我无法复制+粘贴在这里.作为一个新手,我的方法可能是非正统的.

我有一个用Tkinter编写的GUI,里面有几个按钮.每个按钮都链接到一个类,该类实际上运行一个简短的脚本.单击该按钮时,我会启动一个log_window只是Tkinter文本小部件的类.然后创建一个全局变量链接loglog_window刚刚创建的我,并作为脚本运行我管sys.stdout/stderrlog(我创建了这个专门写入方法).一切都是犹太的,除了log_window文本小部件不会用我的管道标准输出更新,直到调用它的类完成.但是,如果我只是print在类中,它将按照调用的顺序打印.

import Tkinter
from Tkinter import *
import time

class log_window:
    def __init__(self,master):
        self.textframe = Tkinter.Frame(master)
        self.text = Text(self.textframe)
        self.text.pack()
        self.textframe.pack()
    def write(self,text):
        self.text.insert(END,text)

class some_func1: # This effectively waits 5 seconds then prints both lines at once
    def __init__(self,master):
        log.write("some text")
        time.sleep(5)
        log.write("some text")

class some_func2: # This prints the first object, waits 5 seconds, then prints the second
    def __init__(self,master):
        print "some text"
        time.sleep(5)
        print "some text"

if __name__ == '__main__':
    global log    
    root = Tk()
    log = log_window(root)
    root.after(100,some_func1, root)
    root.after(100,some_func2, root)
    root.mainloop()
Run Code Online (Sandbox Code Playgroud)

对不起,如果我的例子有点闷,但我认为这是重点.我做的是管道,通过Popen和一些系统调用,但他们不是问题的一部分,所以我只强调什么,我想,是问题的LCD.

Tho*_*s K 8

我不知道Tkinter的并发性的细节,但是摆弄,如果你把它放在一边

master.update_idletasks()
Run Code Online (Sandbox Code Playgroud)

每次调用后log.write,它都会在cue上更新.你可以给log一个.flush()方法来做(比如文件句柄),或者你可以log.write在写完之后调用它.