【问题标题】:Communication between python objects?python对象之间的通信?
【发布时间】:2019-03-13 09:02:32
【问题描述】:

对象之间的通信

想法是从 Gui 创建一个 Toplevel 窗口,然后在 Toplevel 关闭后将来自 Toplevel Entry 的数据(名称)发送回 Gui

object app如何知道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()
    

【问题讨论】:

    标签: python oop tkinter


    【解决方案1】:

    您需要在销毁My_Toplevel 之前将数据传递给Gui 实例。一种方法是将名称字符串保存为Gui 实例的属性,因为您在调用My_Toplevel 时传递了master 参数。例如:

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

    按“显示名称”按钮将名称字符串打印到控制台。

    如果您需要保存多个字符串,可以将名称附加到列表中,将其保存在字典中等。

    如果您愿意,可以在 TopLevel 窗口被销毁之前调用 Gui.show_name 方法:

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

    【讨论】:

      猜你喜欢
      • 2013-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-23
      相关资源
      最近更新 更多