【发布时间】:2016-03-24 10:29:02
【问题描述】:
如果用户被告知应用程序实际在做什么,我想创建一个框。 我创建了一个 Text Widget 来显示我在应用程序的关键点中编写的打印语句,以便它可以用作日志。
为此,我将标准输出重定向到小部件本身的子类,该小部件本身使用 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()。 -
对不起,我没有正确解释这只是一个测试,表明打印语句是一次打印的。在实际应用中,我不使用 sleep(),而是使用 Paramiko。