Ткинтер: Проверка Отзывчивости GUI - PullRequest
2 голосов
/ 30 апреля 2020

У меня есть 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), так как в настоящее время он визуально показывает их уничтожение по одному на моей машине.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...