Python 在tkinter UI类的方法中运行while循环,同时仍允许用户界面运行操作符

Python 在tkinter UI类的方法中运行while循环,同时仍允许用户界面运行操作符,python,tkinter,tk,python-multithreading,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()

在我的程序中,我的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()
从tkinter导入*
从时间上导入睡眠
类GUI_类:
定义初始化(自身,父级):
self.var=IntVar()
scale=scale(父级,to=1,变量=self.var)
scale.pack()
self.label=标签(父项,bg=“白色”)
self.label.pack()
按钮=按钮(父级)
button.pack()
button.bind(“,lambda事件:self.change\u color())
def更改颜色(自身):
如果self.var.get()==1:
计数器=0
而self.var.get()==1和计数器!=20:
self.label.configure(bg=“红色”)
self.label.update_idletasks()
睡眠(0.5)
self.label.configure(bg=“蓝色”)
self.label.update_idletasks()
睡眠(0.5)
计数器+=1
其他:
self.label.configure(bg=“白色”)
root=Tk()
GUI=GUI\u类(根)
root.mainloop()

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

Tkinter提供了一种
after
方法,允许您安排命令在若干毫秒后运行。in在处理程序之后,您可以检查自己的状态,进行适当的修改,并安排对同一处理程序的另一次调用。这是因为您从不阻止正在运行的UI线程,而是安排对方法的常规调用


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

感谢您抽出时间回答。我与after方法进行了一轮游戏,它应该可以完美工作。我希望有15个声誉需要给你应得的选票。