在tkinter GUI类的方法中运行while循环,同时仍允许UI运算符

时间:2014-05-02 04:01:10

标签: python tkinter tk python-multithreading

在我的程序中,我在GUI类中有一个方法,我想定期更新GUI。下面是我的代码所做的简化版本。

from tkinter import *
from time import sleep

class GUI_Class:
    def __init__(self, parent):
        self.var = IntVar()
        scale = Scale(parent, to = 1, variable = self.var)
        scale.pack()
        self.label = Label(parent, bg = "white")
        self.label.pack()
        button = Button(parent)
        button.pack()
        button.bind("<Button-1>",lambda event:self.change_colour()) 
    def change_colour(self):
        if self.var.get() == 1:
            counter = 0
            while self.var.get() == 1 and counter != 20:
                self.label.configure(bg = "red")
                self.label.update_idletasks()
                sleep(0.5)
                self.label.configure(bg = "blue")
                self.label.update_idletasks()
                sleep(0.5)
                counter += 1
        else:
            self.label.configure(bg = "white")

root = Tk()
GUI = GUI_Class(root) 
root.mainloop()

问题在于,当用于更改GUI的while循环正在运行时,程序在等待while循环结束时丢失所有功能。我已经查看了其他人的问题的答案,并且所有的答案都提示线程,但是在答案的示例中,它始终是另一个类在单独的线程中运行的方法。虽然我可以创建一个单独的类,其命令读取GUI.label.configure(bg =“color)并在其自己的线程中运行它,评估此程序用于表示类之间必须有最小的交互,因此有一个类的整个目的是改变在另一个类中创建的GUI的布局可以降低我的等级。我想知道的是,是否有办法在单独的线程中运行方法到它所属的类,因此我的while循环运行GUI的其余部分仍在运行,即标签在蓝色和红色之间闪烁时用户可以将比例更改为0,按下按钮并停止循环?

1 个答案:

答案 0 :(得分:1)

Tkinter提供了一种after方法,允许您安排在几毫秒后运行的命令。在after处理程序中,您可以检查您的状态,进行适当的修改并安排对同一个处理程序的另一个调用。这是你永远不会阻止正在运行的UI线程,而是安排定期调用方法。

after方法返回可用于取消计划任务的令牌。因此,如果您保留该令牌,则可以将其传递给after_cancel方法以取消未完成的预定呼叫。