Связь между объектами Python? - PullRequest
0 голосов
/ 08 октября 2018

Связь между объектами

Идея состоит в том, чтобы создать окно Toplevel из Gui и после закрытия Toplevel отправить данные (имя) из Toplevel Entry обратно в Gui

Как объектное приложение может узнать,объект toplev был уничтожен?

или другими словами

Как объект Gui может знать, что объект My_Toplevel закрыт?

from tkinter import *
font1 = font=("Open Sans Standard",16,"bold")

class My_Toplevel():
    def __init__(self, master=None):
        self.master = master
        self.toplev = Toplevel(master)
        self.name = None
        self.create_widgets()
    def create_widgets(self):
        self.entry_name = Entry(self.toplev, font=font1)
        self.button_ok = Button(self.toplev, text="Ok", font=font1,
                                command=self.get_name)
        self.entry_name.pack()
        self.button_ok.pack()
    def get_name(self):
        self.name = self.entry_name.get()
        self.toplev.destroy()

class Gui(Frame):
    def __init__(self, master):
        Frame.__init__(self, master)
        self.pack()
        self.master = master
        self.label_text = Label(self, text="Foo Bar Window", font=font1)
        self.label_text.pack()
        self.button_toplevel = Button(self, text="Create Toplevel", 
                                command=self.get_toplevel, font=font1)
        self.button_toplevel.pack()

    def get_toplevel(self):
        self.my_top = My_Toplevel(self)

if __name__ == "__main__":
    root = Tk()
    root.title("Parent")
    app = Gui(root)
    root.mainloop()

1 Ответ

0 голосов
/ 08 октября 2018

Вам нужно передать данные в экземпляр Gui, прежде чем уничтожить My_Toplevel.Один из способов сделать это - сохранить строку имени в качестве атрибута экземпляра Gui, поскольку вы передаете этот параметр master при вызове My_Toplevel.Например:

from tkinter import *
font1 = font=("Open Sans Standard",16,"bold")

class My_Toplevel():
    def __init__(self, master=None):
        self.master = master
        self.toplev = Toplevel(master)
        self.create_widgets()

    def create_widgets(self):
        self.entry_name = Entry(self.toplev, font=font1)
        self.button_ok = Button(self.toplev, text="Ok", font=font1,
                                command=self.get_name)
        self.entry_name.pack()
        self.button_ok.pack()

    def get_name(self):
        self.master.name_data = self.entry_name.get()
        self.toplev.destroy()

class Gui(Frame):
    def __init__(self, master):
        Frame.__init__(self, master)
        self.pack()
        self.master = master
        self.label_text = Label(self, text="Foo Bar Window", font=font1)
        self.label_text.pack()
        self.button_toplevel = Button(self, text="Create Toplevel", 
                                command=self.get_toplevel, font=font1)
        self.button_toplevel.pack()

        self.name_data = None
        Button(self, text="show name", command=self.show_name).pack()

    def show_name(self):
        print("Name =", self.name_data)

    def get_toplevel(self):
        self.my_top = My_Toplevel(self)

if __name__ == "__main__":
    root = Tk()
    root.title("Parent")
    app = Gui(root)
    root.mainloop()

Нажмите кнопку «Показать имя», чтобы напечатать строку имени на консоли.

Если вам нужно сохранить более одной строки, вы можете добавить имяв список, сохраните его в словаре и т. д.

Если хотите, вы можете вызвать метод Gui.show_name непосредственно перед уничтожением окна TopLevel:

def get_name(self):
    self.master.name_data = self.entry_name.get()
    self.master.show_name()
    self.toplev.destroy()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...