Простой экран загрузки в python Tkinter

Я начинаю изучать Python, в частности tkinter.

Я хочу сделать «экран загрузки» простого скрипта Python и закрыть его после завершения скрипта.

Но для создания окна требуется функция mainloop, что означает, что оно будет бесконечно зацикливаться или ждать взаимодействия с пользователем (по крайней мере, я так думаю), и это устранит идею «загрузочного» экрана.

Я что-то пробовал, но в итоге получил (Поместите загрузочный экран) -> (Загрузочный экран все еще имеет mainloop) -> (Не удается запустить скрипт из-за ожидания)

То, что я хотел подробно, было (Поместить сценарий загрузки) -> (Запустить сценарий) -> (Сценарий заканчивается) -> (Загрузить экран уничтожить)

У меня большой опыт работы с другими языками, особенно с Java, но java может просто объявить фрейм -> запустить другие вещи после этого -> вызвать frame.dispose() и все. Любые советы или предложения для ученика?

РЕДАКТИРОВАТЬ: сценарий на самом деле представляет собой алгоритм обработки изображений, который подключается к базе данных, и я не могу просто установить время ожидания или сна, поскольку база данных может быть расширена, и это может занять больше времени, чем выделенное время.


person Darrius    schedule 12.06.2018    source источник
comment
вам необходимо использовать поточность или модуль подпроцесса.   -  person Konstantin    schedule 12.06.2018


Ответы (1)


Что-то в этом роде может сработать для вас. Это создает окно root и определяет функцию task, которая уничтожает root в последнюю очередь. В этом примере task просто спит в течение двух секунд, но вы замените этот вызов sleep любым кодом, который хотите запустить.

Вы помещаете функцию task в очередь событий основного цикла с помощью root.after(200, task). Это означает, что код сначала создаст окно root, подождет 200 миллисекунд, а затем вызовет task(), который приостановится на две секунды и уничтожит окно. По крайней мере, для этого примера вам нужна задержка в 200 миллисекунд, чтобы у основного цикла было достаточно времени, чтобы отрисовать окно до того, как вызов sleep остановит все (число может быть другим для вас; увеличьте его, если окно не отрисовывается должным образом).

import tkinter as tk
from time import sleep

def task():
    # The window will stay open until this function call ends.
    sleep(2) # Replace this with the code you want to run
    root.destroy()

root = tk.Tk()
root.title("Example")

label = tk.Label(root, text="Waiting for task to finish.")
label.pack()

root.after(200, task)
root.mainloop()

print("Main loop is now over and we can do other stuff.")

Изменить: добавлен комментарий к коду.

person Dronir    schedule 12.06.2018
comment
спасибо за ответ, но я действительно хочу сделать его как можно более динамичным и избежать временного сценария. - person Darrius; 12.06.2018
comment
Я не совсем уверен, что вы имеете в виду, но это не зависит от времени, используемого в моем примере. Вызов sleep — это всего лишь фиктивная замена вычислений, во время которых вы хотите, чтобы окно оставалось открытым. Задержка в 200 мс в очереди просто для того, чтобы дать tk некоторое время для отображения окна, потому что в противном случае sleep повесил бы его. - person Dronir; 12.06.2018
comment
Это сработало. Мне нужно было научиться им пользоваться, и я сначала ничего не понял. Спасибо - person Darrius; 12.06.2018