У меня есть Tkinter GUI, который отображает более 70 ярлыков на 6 различных страницах пользовательского интерфейса (все страницы создаются и отображаются друг на друга, как только открывается окно, чтобы обеспечить быстрое переключение между страницами) .
На моей машине производительность на отлично. Однако, хотя ярлыки отображаются достаточно быстро, мне нужно подождать около полсекунды, прежде чем кнопки GUI станут отзывчивыми.
РЕДАКТИРОВАТЬ: я должен добавить, моя проблема не в скорости загрузки данных ( уже обрабатывается в потоке) - это с помощью вызова grid
для кнопок, представляющих данные.
В настоящее время я показываю всплывающее окно (при загрузке данных для отображения), и я хочу закрыть его как только GUI будет полностью реагирующим , а не полностью отображаемым.
Я пытался дождаться отображения самого последнего виджета, но это не дает желаемого эффекта:
from tkinter import Tk, Frame, Button, Toplevel
from random import randint
class Popup(Toplevel):
def __init__(self, parent, title='Popup'):
super().__init__(parent)
def show(self):
self.geometry('{}x{}'.format(500, 200))
self.attributes("-topmost", True)
class Page(Frame):
def __init__(self, parent, data, **kwargs):
super().__init__(parent, **kwargs)
self.data, self.frame = data, Frame(self)
def grid(self, **kwargs):
super(Frame, self).grid(**kwargs)
self.frame.grid(row=0, column=0, sticky='nesw')
for x in range(6):
for y in range(10):
Button(self.frame, text=self.data[x][y]).grid(row=x, column=y)
class UI(Frame):
def __init__(self, parent):
super().__init__(parent)
self.btns, self.ui_frame, self.navbar = {}, Frame(self), Frame(self)
def create_pages(self):
for txt in list(range(1,7)):
button = Button(self.navbar, text=txt, bg='red')
data = [[randint(25, 99) for _ in range(25)] for _ in range(10)]
self.btns[button] = Page(self.ui_frame, data)
self.btns[button].grid(row=0, column=0, sticky='nesw')
button.config(command=self.btns[button].lift)
def grid(self, popup, **kwargs):
super(Frame, self).grid(**kwargs)
self.create_pages()
self.navbar.grid(row=0, column=0, sticky='nesw')
self.ui_frame.grid(row=0, column=1, sticky='nesw')
for btn in self.btns.keys():
btn.grid(sticky='nesw')
last_page = list(self.btns.values())[-1]
self.wait_visibility(window=last_page.winfo_children()[-1])
popup.destroy()
win = Tk()
popup = Popup(win)
popup.show()
UI(win).grid(popup, sticky='nesw')
win.mainloop()
Проблема в том, что всплывающее окно закрывается после того, как GUI отображается, но не полностью отвечает, и мне нужен метод (например, wait_reponsive()
вместо?), чтобы определить, является ли GUI полностью отзывчивым.
Любая помощь / руководство очень ценится.
РЕДАКТИРОВАТЬ : В качестве дополнительного вопроса, есть ли способ уничтожить все виджеты одновременно (при закрытии GUI), так как в настоящее время он визуально показывает их уничтожение по одному на моей машине.