在不关闭主窗口的情况下自动关闭Tkinter弹出窗口

时间:2016-11-03 14:40:18

标签: python user-interface tkinter

我正在为一个项目制作一个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的额外模块。

2 个答案:

答案 0 :(得分:1)

任务完成后,将.destroy()调用progress_dialog

progress_dialog.destroy()

这将安全地退出弹出窗口而不会杀死整个应用程序。

答案 1 :(得分:0)

对 necro 感到抱歉,但我遇到了这个问题并找到了答案并想分享,以防其他人遇到它。

在进度条达到其 5 秒生命周期的那一刻,窗口关闭。栏确实加载到 100%,您可能需要录制并放慢速度,但它肯定会达到 100%。问题是,因为窗口在它被销毁的同一毫秒内达到了 100%,所以看起来它没有成功。

在您的 time.sleep(.5) 之前添加 input_progress_dialog.destroy() 修复感知的故障点。

以下代码适用于 Python 2,对于 3,将 import Tkinter as tk 更改为 import tkinter as tk,将 from ttk import Progressbar 更改为 from tkinter.ttk import Progressbar

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 fixes it
    time.sleep(.5)
    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()