Tkinter: обновление полей, находящихся в разных классах - PullRequest
0 голосов
/ 19 июня 2020

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

В следующем коде "main_lbl" - обновляется правильно, но "dev_lbl" внутри Frame_1 - нет.

class Frame_1(tk.Frame):
    def __init__(self, parent):
        tk.Frame.__init__(self, parent)
        ...
        self.dev_lbl = tk.Label(self, text="__init__")
        self.dev_lbl.pack(side="top", fill="x", expand=1)

class MainApp(tk.Tk):
    def __init__(self, master=None, title="MAIN", size="222x333+100+100"):
        super().__init__()

        EF = Frame_1(self).pack(side="top", padx=2, pady=2, fill="x", expand=True)
        self.main_lbl.tk.Label(self, text="Main init")
        self.main_lbl.pack(side="bottom")
        #<RUN mainloop()>
        self.update_GUI()
        self.mainloop()

    def update_GUI(self):
        update_delay = 10
        self.main_lbl["text"] = "updated"
        Frame_1(self).dev_lbl["text"] = "updated"
        self.after(update_delay, self.update_GUI)

root = MainApp(title="BRIDGE")

Я также пробовал использовать tk.StringVar () ... тот же результат.

Advice?

Спасибо, Радован

PS: Вообще-то хотелось бы, чтобы отображение было в отдельном окне. Я пробовал tk.Toplevel:

class ShowVariables(tk.Toplevel):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.parent = parent

        self.all_dev_lbl = tk.Label(self.Bot_frame, text="__init__")
        self.all_dev_lbl.pack(side="top", fill="x", expand=1)

, но это тоже не сработало.

1 Ответ

1 голос
/ 19 июня 2020

Вам необходимо использовать фактический экземпляр Frame_1, и для этого вам нужно сохранить ссылку:

class MainApp(tk.Tk):
    def __init__(self, master=None, title="MAIN", size="222x333+100+100"):
        super().__init__()
        ...
        self.EF = Frame_1(self)
        self.EF.pack(side="top", padx=2, pady=2, fill="x", expand=True)
        ...

Получив ссылку, вы можете использовать ее для обновления атрибутов объект:

def update_GUI(self):
    ...
    self.EF.dev_lbl["text"] = "updated"
    ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...