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...")
为什么下面的代码中 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...")