【发布时间】:2021-06-25 00:27:43
【问题描述】:
我正在为一个项目制作 GUI,我的主管要求我包含一个进度条,因为程序的每次迭代可能需要 7 分钟。
我希望进度条在单独的窗口中弹出,并在进程完成后关闭,但根据我目前的理解,要么我必须手动关闭弹出窗口,要么立即关闭整个 GUI。
这是我正在使用的代码的简化版本
import Tkinter as tk
from ttk import Progressbar
from os import listdir
import threading
import time
root = tk.Tk()
root.title("TCC Image Processing")
def create_tcc(input_bar, input_progress_dialog):
input_bar['maximum'] = 5
input_bar['value'] = 0
for x in range(5):
time.sleep(1)
input_bar['value'] += 1
# this line is where the touble seems to be
input_progress_dialog.destroy()
def run_tcc():
progress_dialog = tk.Toplevel()
progress_dialog.title("TCC Processing")
bar = Progressbar(progress_dialog, orient="horizontal", length=500, value=0, mode="determinate")
bar.grid(row=4, columnspan=2)
t = threading.Thread(target=create_tcc, args=(bar, progress_dialog))
t.start()
tcc_run_button = tk.Button(root, text="RUN", command=lambda:run_tcc())
tcc_run_button.pack()
root.mainloop()
如果可能的话,我想避免下载直接 python 不附带的额外模块。
【问题讨论】:
-
除此之外:全球名称
root、run_tcc.root2和create_tcc.root的相似性令人困惑。由于两个局部变量实际上都没有引用应用程序的主窗口,因此可以选择另一个变量名称,例如progress_dialog? -
您的代码,以其当前编辑的形式,非常适合我。你现在到底有什么问题?
-
上面的代码运行,当我点击按钮时,会出现一个带有进度条的弹出窗口。杠铃走四步,然后停止,当它应该走五步时。唯一一次它使用当前版本的代码执行了 5 次程序崩溃,并出现一个新的弹出窗口,提示遇到问题。
-
我认为程序崩溃是因为
tkinter是单线程的,而您正试图将其放入两个线程中
标签: python user-interface tkinter