简体   繁体   English

python对象之间的通信?

[英]Communication between python objects?

Communication between objects 对象之间的通讯

The idea is create a Toplevel window from Gui and after Toplevel closed send the data (name) from Toplevel Entry back to Gui 这个想法是从Gui创建一个Toplevel窗口,并在Toplevel关闭后将数据(名称)从Toplevel Entry发送回Gui。

How object app can know whether the toplev object was destroyed? 对象应用程序如何知道toplev对象是否被破坏?

or with other words 或换句话说

How can object of Gui know that the object of My_Toplevel is closed? 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()

You need to pass the data to the Gui instance before you destroy My_Toplevel . 在销毁My_Toplevel之前,需要将数据传递到Gui实例。 One way to do that is to save the name string as an attribute of the Gui instance since you pass that the master parameter when you call My_Toplevel . 一种方法是将名称字符串保存为Gui实例的属性,因为在调用My_Toplevel时传递了master参数。 For example: 例如:

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()

Press the "show name" button to print the name string to the console. 按下“显示名称”按钮,将名称字符串打印到控制台。

If you need to save more than a single string, you could append the name to a list, save it in a dictionary, etc. 如果您需要保存多个字符串,可以将名称附加到列表中,将其保存在字典中,等等。

If you like, you can call the Gui.show_name method just before the TopLevel window is destroyed: 如果愿意,可以在Gui.show_name TopLevel窗口之前调用Gui.show_name方法:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM