Python - Tkinter - 消息小部件并不总是更新

Python - Tkinter - Message widget not always updating

我已经编写了一个小应用程序,我已经在 Tkinter 中使用一个简单的 GUI 来运行它,并且所有功能都可以正常运行,但我想添加一点润色。

我有一个消息小部件,用于向用户提供状态更新,基本上只是单行文本错误或让他们知道后台正在发生的事情。我可以使用 StringVar 更改消息小部件中的文本,但我 运行 遇到的问题是每次我告诉它时它似乎都不会更新。

具体来说,我在应用程序中有一个按钮可以解析一堆数据,通常需要几秒钟才能完成。当用户按下按钮时,消息小部件会按照我的意愿更新为 "processing..." 文本,但是如果按下该按钮时消息小部件中先前显示过文本,则新文本会出现在它的顶部.由于 "processing" 文本比之前的文本短,因此 window 最终会显示两条文本消息中的一部分,直到解析完成。

为了解决这个问题,我尝试在将消息更改为 "processing" 之前将消息小部件的变量更新为空白,但行为保持不变。我对 Tkinter 很陌生,更新内容的文档对我来说意义不大。

这是我的代码的一个极其简化的版本,我希望它能说明问题。

    import Tkinter as tk

class Application(tk.Frame):
    def __init__(self, master=None):
        tk.Frame.__init__(self, master)
        self.grid()
        self.createWidgets()

    def createWidgets(self):
        self.text = tk.StringVar()
        self.text.set("A semi long text string abcdefghijklmnopqrstuvwxyz")

        text_entry = tk.Entry(self, width = 50)
        text_entry.grid(row = 0, column = 0, pady = 5, padx = 10)
        status_msg = tk.Message(self, width = 300, textvariable = self.text)
        status_msg.grid(row = 2, column = 0, sticky = tk.W, pady = 5)
        btn_submit = tk.Button(self, text="Test Button", width = 12, command = self.test)
        btn_submit.grid(row = 1, column = 0, pady = 5, padx = 10)


    def test(self):
        self.text.set("")
        self.master.update_idletasks()
        self.text.set("Starting to process...")
        self.master.update_idletasks()
        for i in range(5000):
            print i
        self.text.set("Complete!")

root = tk.Tk()
app = Application(master=root)
app.master.title('Tk test')
app.master.geometry('400x100')
app.mainloop()

编辑:为了更好地解释我试图摆脱的情况,这里是处理过程中消息小部件的屏幕截图。您可以看到 "Processing Keys..." 但在那之后您可以看到之前的消息文本仍然存在于单词 valid 之前的位置(这是之前消息的一部分,我根本不想在那里。 message widget screenshot

EDIT2:我已经将上面的代码完全替换为确实复制了我 运行 在我的程序中遇到的问题的代码(至少就显示的消息文本而言),消息文本永远不会更改为“”(空白),而是处理消息最终会显示在前一条消息的顶部,其中一些消息会同时显示。

此外,最初我让循环转到 10000,我注意到在那种情况下 Windows 实际上显示应用程序 window 在完成之前没有响应。我真的不确定这是否与我遇到的问题有关。

我不确定它是否是问题的正确解决方案,但我发现了一种似乎可以完成工作的解决方法,至少就小部件外观而言是这样。

编辑按钮从self.text.set("")self.text.set(" ")调用的测试函数中的第一行,在下一条消息出现之前成功清除window中的消息文本,从而删除处理过程中丑陋的重叠。