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

时间:2015-04-07 22:02:40

标签: python tkinter

我已经编写了一个小应用程序,并且我已经在Tkinter中使用了一个简单的GUI,并且所有功能都应该如此,但我想添加一些优点。

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

具体来说,我在应用程序中有一个解析大量数据的按钮,通常需要几秒钟才能完成。当用户按下按钮时,消息小部件更新为"处理..."我想要它的文本,但如果在按下该按钮时消息小部件中显示了先前的文本,则新文本将显示在其上方。作为"处理"文本比前一个文本短,窗口最终会显示一些文本消息,直到解析完成。

为了解决这个问题,我尝试将消息小部件的变量更新为空白,然后将消息更改为"处理"但行为保持不变。我对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()

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

EDIT2:我完全取代了上面的代码,确切地复制了我在程序中遇到的问题(至少就显示的消息文本而言),消息文本永远不会更改为"" (空白),而是处理消息最后显示在上一条消息之上,并显示其中一些消息。

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

1 个答案:

答案 0 :(得分:0)

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

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