我想在用户被告知应用程序实际操作的情况下创建一个框。
我创建了一个文本小部件,以显示我在应用程序关键点上编写的打印语句,以便可以将其用作日志框。

为此,我使用写方法将stdout重定向到“升级”的小部件本身的子类,如我在另一篇文章中所见。
确实可以,但是我注意到一个问题,使包装盒几乎无用。

如果您运行代码,则可以看到这些句子全部一次出现。更令我困惑的是,不仅是“ wait2”功能的句子
看起来像是togheter,但在过程结束时甚至显示了调用函数“ 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()。
也许我选择了错误的示例,但结果是相同的,所有打印品都同时显示。

最佳答案

当您调用sleep时,应用程序将完全执行此操作:它进入睡眠状态。睡觉时无法更新显示。通常,永远不要在GUI中调用sleep

话虽这么说,一种快速的解决方法是确保在将某些内容打印到日志后调用update,以便Tkinter有机会更新屏幕。在self.widget.update_idletasks()的末尾添加write(重画屏幕被视为“空闲任务”)。

这不是一个适当的解决方法,但足以说明为什么未显示数据。正确的解决方案涉及不要求睡眠。有许多与此相关的堆栈溢出示例,几乎所有示例都涉及到after方法。

10-07 19:28
查看更多