中止 tkinter 中的进度条

问题描述 投票:0回答:1

我使用 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()
python
1个回答
0
投票

正如 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 事件循环来保持响应。

© www.soinside.com 2019 - 2024. All rights reserved.