Python tKinter挂了

Python tKinter hanging

为什么下面的代码中 button1 挂起,直到 time.sleep(10) 完成。

我只能假设 tKinter 在更新它的绘画功能之前等待点击事件完成。

我想在 button1 上单击状态立即更改为 DISABLED,而不是在 mainformbutton1press() 完成后。

我已将 time.sleep(10) 用于模拟其余代码功能 - 但实际程序将需要很多分钟。

编辑! - 睡眠只是为了展示 tkinter 是如何挂起的。我的真实程序有更多的代码并且没有睡眠功能 - 如上所述,使用挂起的 GUI 处理数据需要很长时间。没有更多的睡眠建议:)

import tkinter as tk
from tkinter import ttk
from tkinter.constants import DISABLED, NORMAL
import time

# ==================================================
class App:

    def __init__(self, tk, my_w):
  
        self.button1 = tk.Button(my_w, text="START", width=34, command = self.mainformbutton1press)
        self.button1.grid(columnspan=3, row=6, column=1,padx=10,pady=20, ipadx=20, ipady=20)        

    # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    def mainformbutton1press(self):
  
        self.button1.config(text="PLEASE WAIT...")
        self.button1['state'] = DISABLED
     
        # DO REST OF PROCESSING
        # TO MIMIC THIS:
        time.sleep(10)
        print("doing...")
     
# ==================================================
if __name__ == "__main__":
   
    my_w = tk.Tk()
    my_w.geometry("430x380")
    my_w.resizable(False, False)
    
    app = App(tk, my_w)

    my_w.mainloop()  # Keep the window open

Tk.mainloop 是一种 while 循环。 time.sleep() 在特定时间段内停止循环。这使得 window 没有响应。您可以使用 .after 函数:

class App:

    def __init__(self, tk, my_w):
        self.my_w=my_w
        ....
    def continue_next(self):
        print("Doing")
        ....
    def mainformbutton1press(self):
  
        self.button1.config(text="PLEASE WAIT...")
        self.button1['state'] = DISABLED
     
        # DO REST OF PROCESSING
        # TO MIMIC THIS:
        self.my_w.after(10000,self.continue_next)

您需要对代码进行的唯一更改是在按钮中插入 update

可能需要缩短 10 秒的延迟(10 秒的等待时间很长)

self.button1.config(text="PLEASE WAIT...")
self.button1['state'] = DISABLED

# INSERT UPDATE HERE
self.button1.update()
     
# DO REST OF PROCESSING
# TO MIMIC THIS:
time.sleep(1)
print("doing...")