【问题标题】:Running a while loop in a method of a tkinter UI class while still allowing the UI to operator在 tkinter GUI 类的方法中运行 while 循环,同时仍允许 UI 操作
【发布时间】:2014-05-02 04:01:09
【问题描述】:

在我的程序中,我的 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,按下按钮并停止循环?

【问题讨论】:

    标签: python tkinter tk python-multithreading


    【解决方案1】:

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

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

    【讨论】:

    • 感谢您抽出宝贵时间回答。我使用 after 方法进行了一轮游戏,它应该可以完美运行。我希望我有 15 名声望,可以给你应得的投票。
    猜你喜欢
    • 2019-05-01
    • 2012-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-31
    • 1970-01-01
    相关资源
    最近更新 更多