python - python对象之间的通信?

标签 python oop tkinter

对象之间的通信

这个想法是从 Gui 创建一个 Toplevel 窗口,并在 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()
    

最佳答案

在销毁 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()

关于python - python对象之间的通信?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52706538/

相关文章:

c# - 当我输入名称时,我的代码返回 StackOverFlowException...我不明白为什么

python - 尝试运行idle-python3.9(Linux Mint 20)时,tkinter.simpledialog 中缺少 _setup_dialog

python - 如何清除 ttk.Combobox 的文本字段部分?

python - 如何有效地向 tkinter 框架添加大量按钮?

python - 如何使用 Python 逻辑检查回文

java - 每个java程序都是面向对象的

python - Python 时间循环

php - PHP 中的单例 v 单实例数据库连接

python - 我想用 if 去思考列表来检查多个元素是否等于我想要的

python - 阻止 pyplot.contour 沿不连续点绘制轮廓