Skip to main content
 首页 » 编程设计

python之在 tkinter GUI 类的方法中运行 while 循环,同时仍然允许 UI 运算符(operator)

2025年05月04日28Renyi-Fan

在我的程序中,我的 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 = "colour)目的是更改在另一个类中创建的 GUI 的布局可能会降低我的成绩。我想知道的是,是否有一种方法可以在单独的线程中运行一个方法到它所属的类,从而运行我的 while 循环而 GUI 的其余部分仍在运行,即当标签在蓝色和红色之间闪烁时用户可以将比例更改为 0,按下按钮并停止循环?

请您参考如下方法:

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

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