我使用 tkinter 构建了一个进度条,并构建了一个“中止”底部来停止它。这里我使用了一个全局变量“isAbort”来控制该函数。然而QQ却失败了。
有人知道如何让它发挥作用吗?
import tkinter as tk
from tkinter import ttk
import time
root = tk.Tk()
root.title("Test")
root.geometry("300x400")
isAbort = False
def ProgressBarRunning():
global isAbort
total_time = 30
for i in range(total_time):
bar['value'] = int(100*(i+1)/total_time)
time.sleep(1)
root.update()
def AbortProgress():
global isAbort
print("Abort process...")
isAbort = True
bar = ttk.Progressbar(root, length=200, mode="determinate")
bar.grid(column=1, row=1, columnspan=2, sticky=("W","E"))
run_btn = tk.Button(root, text="Run", command=ProgressBarRunning)
run_btn.grid(column=1, row=2)
Abort_btn = tk.Button(root, text="Abort", command=AbortProgress)
Abort_btn.grid(column=2, row=2)
root.mainloop()
正如 JRiggles 所评论的 - 避免在 tkinter 应用程序中使用睡眠,因为它会冻结应用程序。例如,您可以使用 tkinter 的 after() 方法以及递归函数来代替 time.sleep():
import tkinter as tk
from tkinter import ttk
root = tk.Tk()
root.title("Test")
root.geometry("300x400")
isAbort = False
def ProgressBarRunning(progress=0):
global isAbort
if isAbort:
print("Progress aborted.")
return
total_time = 30
bar['value'] = int(100 * progress / total_time)
if progress < total_time:
root.after(1000, ProgressBarRunning, progress + 1)
else:
print("Progress completed.")
def AbortProgress():
global isAbort
isAbort = True
# Optionally, reset progress bar on abort
bar['value'] = 0
bar = ttk.Progressbar(root, length=200, mode="determinate")
bar.grid(column=1, row=1, columnspan=2, sticky=("W","E"))
run_btn = tk.Button(root, text="Run", command=ProgressBarRunning)
run_btn.grid(column=1, row=2)
Abort_btn = tk.Button(root, text="Abort", command=AbortProgress)
Abort_btn.grid(column=2, row=2)
root.mainloop()
root.after() 方法安排在 1000 毫秒(1 秒)后调用 ProgressBarRunning 函数,从而允许 GUI 通过不阻塞主 tkinter 事件循环来保持响应。