Скрытие ярлыка в одном классе нажатием кнопки в другом классе - PullRequest
0 голосов
/ 24 января 2020

У меня есть идея создать простое приложение для табло (спорт) с двумя windows (создание в Tkinter). Один предназначен для управления, а другой для вывода информации.

Итак, идея заключается в том, что я нажимаю кнопку «показать табло» в окне tk.Toplevel, и она появляется в главном окне приложения. И когда я нажимаю скрыть, он прячется. Я знаю, что могу создать его, просто написав сценарий без классов и точно так же, как сотни строк определения, но я хочу использовать OOP, так как я хотел бы начать программирование правильным способом.

Моя проблема в том, что когда я нажимаю «Скрыть табло» (я создаю ярлыки для табло), ярлык не скрывается. Любые предложения?

Я знаю, что команды и определения должны быть в одном и том же «дереве», но как это организовать при использовании OOP.

Так вот мой код

import tkinter as tk

def forget():
scoreboard.pack_forget()

class Main(tk.Tk):
    def __init__(self):
        super().__init__()
        self.title("Scorebug")
        self.geometry("500x300")
        self.configure(background="green")
        scoreboard = tk.Label(self, text="This is like scoreboard")
        scoreboard.pack()

class Control(tk.Toplevel):
    def __init__(self):
        super().__init__()
        self.title("Controls")
        self.geometry("100x300")
        self.configure(background="red")

        hidelabels = tk.Button(self, text="Hide the scoreboard", command=forget)
        hidelabels.pack()


app = Main()
ctr = Control()

ctr.mainloop()
app.mainloop()

1 Ответ

0 голосов
/ 24 января 2020

Сначала вы должны использовать self.scoreboard, чтобы получить доступ из других мест.

self.scoreboard = tk.Label(self, text="This is like scoreboard")
self.scoreboard.pack()

, и теперь вы можете удалить его, используя

command=app.scoreboard.pack_forget

Вы также можете отправить главное окно в качестве аргумента ко второму окну

ctr = Control(app)

class Control(tk.Toplevel):
    def __init__(self, parent):

и затем вы можете связать

command=parent.scoreboard.pack_forget

import tkinter as tk

class Main(tk.Tk):
    def __init__(self):
        super().__init__()
        self.title("Scorebug")
        self.geometry("500x300")
        self.configure(background="green")
        self.scoreboard = tk.Label(self, text="This is like scoreboard")
        self.scoreboard.pack()

class Control(tk.Toplevel):
    def __init__(self, parent):
        super().__init__()
        self.title("Controls")
        self.geometry("100x300")
        self.configure(background="red")

        hidelabels = tk.Button(self, text="Hide the scoreboard", command=parent.scoreboard.pack_forget)
        hidelabels.pack()


app = Main()
ctr = Control(app)
app.mainloop()

РЕДАКТИРОВАТЬ: Вы также можете отправить только scireboard в качестве аргумента для второго окна

ctr = Control(app.scoreboard)

и затем вы можете связать

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