2016-11-03 9 views
0

Я создаю графический интерфейс для проекта, и мой руководитель попросил включить индикатор выполнения, так как каждая итерация программы может занять до 7 минут.Закрытие всплывающего окна Tkinter автоматически без закрытия главного окна

Я хочу, чтобы индикатор выполнения появлялся в отдельном окне и закрывался после завершения процесса, но с моим нынешним пониманием либо я должен закрыть всплывающее окно вручную, либо весь графический интерфейс закрывается сразу.

Это упрощенная версия коды я использую

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() 

Если возможно, я хотел бы избежать загрузок дополнительных модулей, которые не приходят с прямым питона.

+0

Кроме того, сходство имен глобальных 'root',' run_tcc.root2' и 'create_tcc.root' запутывает. Поскольку ни одна из локальных переменных на самом деле не ссылается на основное окно приложения, возможно, выберете другое имя переменной, например 'progress_dialog'? –

+0

Ваш код в его отредактированной форме отлично работает для меня. Какая проблема у вас сейчас? –

+0

Приведенный выше код запускается, и когда я нажимаю кнопку, появляется всплывающее окно с индикатором выполнения. Бар работает четыре раза, а затем останавливается, когда он должен ступить пять раз. Единственный раз, когда он шагнул пять раз с текущей версией кода, с которым программа врезалась, и появилось новое всплывающее окно, в котором говорилось о проблеме. – cforeman

ответ

1

Позвонить .destroy() до progress_dialog после того, как задача будет завершена.

progress_dialog.destroy() 

Это безопасно покинет всплывающее окно, не убивая все приложение.

+0

Для меня использование .destroy() заставляет индикатор выполнения загружаться до 80%, затем останавливается и остается открытым. – cforeman

Смежные вопросы