Я пишу приложение, которое требует значительного количества данных при запуске.То, что я хотел бы сделать, это создать заставку, которая сообщает пользователю, какой этап процесса загрузки данных происходит в режиме реального времени.
Мой план состоял в том, чтобы создать метку и передать новый текст этой метке в зависимости от того, какие вычисления происходили в этот момент.Однако в моих различных попытках лучшее, что я сделал, - заставил ярлыки показываться только после того, как munging завершился.
Я видел это, что мне немного помогло, но все еще не получилось полностью: Tkinter Показать заставку и скрыть главный экран, пока __init__ не закончится
Ниже приведена моя лучшая попытка (вытащить весь фактический материал с кадрами, чтобы сделать его минимально исполняемым)
[РЕДАКТИРОВАТЬ, ДОБАВИТЬ] В идеале я хотел бы сделать это таким образом, чтобы не требовалось, чтобы все данные обрабатывались внутри класса.IOW, фаза 1 запускает заставку, фаза 2 запускает группирование данных в основном коде, фаза 3 запускает основной пользовательский интерфейс
import time
from tkinter import *
class LoadScreen(Toplevel):
def __init__(self, parent):
Toplevel.__init__(self, parent)
self.title('Loading')
self.update()
class UserInterface(Tk):
def __init__(self, parent):
Tk.__init__(self, parent)
self.parent=parent
self.withdraw()
loader = LoadScreen(self)
self.load_label = Label(loader, text='Loading')
self.load_label.grid(row=0, column=0, padx=20, pady=20)
self.stage_label = Label(loader, text='Preparing dataframe')
self.stage_label.grid(row=1, column=0, padx=20, pady=20)
#loader.destroy()
self.main_screen()
def main_screen(self):
self.deiconify()
self.load_label = Label(self, text='Done')
self.load_label.grid(row=0, column=0, padx=20, pady=20)
self.close_button = Button(self, text='Close',
command = lambda: self.destroy())
self.close_button.grid(row=1, column=0, padx=20, pady=20)
ui = UserInterface(None)
#Pretend I'm doing some dataframe munging
print('1')
time.sleep(2)
ui.stage_label['text'] = 'Running some calculations'
print('2')
time.sleep(2)
ui.stage_label['text'] = 'Finishing up'
print('3')
time.sleep(2)
ui.mainloop()