我想创建一个框,告知用户该应用程序实际正在执行的操作。我创建了一个文本小部件,以显示我在应用程序的关键点编写的打印语句,以便它可以作为日志框。
为此,我将stdout重定向到小部件本身的子类“升级”,使用了此处另一篇帖子中的write方法。这确实有效,但我注意到一个问题,使盒子几乎无用。
如果运行代码,您可以看到句子一次性出现。对我来说更令人困惑的是,“wait2”函数的句子不仅一起出现,而且甚至调用函数“wait1”的打印语句也在进程结束时显示。
为什么会发生这种行为?我该怎么做才能看到按照执行顺序在框中显示的语句?
为此,我将stdout重定向到小部件本身的子类“升级”,使用了此处另一篇帖子中的write方法。这确实有效,但我注意到一个问题,使盒子几乎无用。
如果运行代码,您可以看到句子一次性出现。对我来说更令人困惑的是,“wait2”函数的句子不仅一起出现,而且甚至调用函数“wait1”的打印语句也在进程结束时显示。
为什么会发生这种行为?我该怎么做才能看到按照执行顺序在框中显示的语句?
from Tkinter import *
import sys
import time
root = Tk()
class addwritemethod(object):
def __init__(self, widget):
self.widget = widget
def write(self, string):
self.widget.configure(state="normal")
self.widget.insert("end", string)
self.widget.see("end")
self.widget.configure(state="disabled")
def wait1():
print "Can you see me?"
wait2()
def wait2():
for i in range(10):
time.sleep(5)
print "Long time no see!"
t_go = Button(root, text= "Start!", width =12, command = wait1)
t_go.pack(side = LEFT, padx = 20, pady = 20)
tlog = Text(root,wrap = "word")
tlog.pack(side="top", fill="both", expand=True)
tlog.configure(state="disabled")
sys.stdout = addwritemethod(tlog)
mainloop()
编辑:感谢回答我的人,并向他们道歉:我没有提供所有必需的信息。 我在测试代码中使用time.sleep()只是为了展示行为。在真实的应用程序中,我使用Paramiko通过ssh传输文件,不使用sleep()。 也许我选择了错误的例子,但结果是一样的,所有的打印语句同时显示。
time.sleep()
与许多东西(包括tkinter
)不兼容。在tkinter
中使用延迟,请使用after()
。 - TigerhawkT3