Tkinterでのラベルの更新


ラベルの更新をしたいのですが、１つの関数で2回更新したいのですがsleepのような時間の要する関数を使ってもラベルのテキストは更新されないのです。それは、mainloopの最後に到達したときに更新されるからかなと考えたのですが、更新させる方法はありますでしょうか？

以下のコードは直面した問題を抽象化したものです。sleepは時間のかかる処理とでも置き換えてください。実際にこのコードを実行すると、この問題に直面すると思います。

[code]

    from Tkinter import *
    import time
    
    class Window:
        def __init__(self):
            self.flg = False
            self.root = Tk()
            self.txt = StringVar()
            Button(self.root, text="test", command=self.changeLabel).pack()
            self.txt.set("hoge")
            Label(self.root, textvariable=self.txt).pack()
    
        def changeLabel(self):
            self.txt.set("hogehoge")
            time.sleep(2) # sleepのような時間のかかる処理がしたい
            self.txt.set("hogehogehoge")
    
    if __name__ == '__main__':
        w = Window()
        w.root.mainloop()
    
[/code]

よろしくお願いします。




スレッドを分けるのが適切と思います。

[code]

    from Tkinter import *
    import threading
    from time import sleep
    
    class Window:
        def __init__(self):
            self.flg = False
            self.root = Tk()
            self.txt = StringVar()
            Button(self.root, text="test", command=self.changeLabel ).pack()
            self.txt.set("hoge")
            Label(self.root, textvariable=self.txt).pack()
    
        def changeLabel(self):
            self.txt.set("Start...")
            t = threading.Thread(target=FunctionThatTakeALotOfTime, args=(self,))
            t.start()
    
    def FunctionThatTakeALotOfTime(w):
        sleep(2)
        w.txt.set("Finished!")
    
    if __name__ == '__main__':
        w = Window()
        w.root.mainloop()
    
[/code]

処理の内容によっては、必要に応じて同時に2つ以上関数が実行されないような処理を追加してください。(処理実行中はコマンド実行ボタンを無効化するなど。)




スレッドを分けるのが適切と思います。

[code]

    from Tkinter import *
    import threading
    from time import sleep
    
    class Window:
        def __init__(self):
            self.flg = False
            self.root = Tk()
            self.txt = StringVar()
            Button(self.root, text="test", command=self.changeLabel ).pack()
            self.txt.set("hoge")
            Label(self.root, textvariable=self.txt).pack()
    
        def changeLabel(self):
            self.txt.set("Start...")
            t = threading.Thread(target=FunctionThatTakeALotOfTime, args=(self,))
            t.start()
    
    def FunctionThatTakeALotOfTime(w):
        sleep(2)
        w.txt.set("Finished!")
    
    if __name__ == '__main__':
        w = Window()
        w.root.mainloop()
    
[/code]

処理の内容によっては、必要に応じて同時に2つ以上関数が実行されないような処理を追加してください。(処理実行中はコマンド実行ボタンを無効化するなど。)

