Tkinter 需要根据在另一页的另一个框中输入的内容更新一个框

Tkinter need to update a box based on whats typed in another box on another page

我在一个容器中有一些页面,我希望允许用户从我的一个页面中输入的名称框更新并显示在另一个页面上。这不是我所有页面中的变量,这只是我想在其中一个页面中显示的内容。我的应用程序有很多页面,但这是我的问题的最小可重现示例。

我知道当我的“模板”页面创建时,名称框中的文本是空白的,所以我需要在调用 'load_page' 函数时以某种方式传递变量,但我不知道如何使这项工作。感谢任何帮助。

下面的代码给出了错误:AttributeError: type object 'template' has no attribute 'name_box' - 我遇到的问题是我不知道如何从一页指定名称框来抓取输入的文本,然后将其插入到另一页的另一个框中。

查看下面的代码:

import tkinter as tk
from tkinter import font as tkfont, filedialog, messagebox

class SLS_v1(tk.Tk):
    def __init__(self, *args, **kwargs):
        tk.Tk.__init__(self, *args, **kwargs)
        self.title('SLS')
        self.geometry("552x700")
        self.resizable(False, False)

        self.title_font = tkfont.Font(family='Helvetica', size=18, weight="bold", slant="italic")

        container = tk.Frame(self)
        container.pack(side="top", fill="both", expand=True)
        container.grid_rowconfigure(0, weight=1)
        container.grid_columnconfigure(0, weight=1)


        self.frames = {}

        self.frames["MenuPage"] = MenuPage(parent=container, controller=self)
        self.frames["template"] = template(parent=container, controller=self)

        self.frames["MenuPage"].grid(row=0, column=0, sticky="nsew")
        self.frames["template"].grid(row=0, column=0, sticky="nsew")

        self.show_frame("MenuPage")


    def show_frame(self, page_name):
        '''Show a frame for the given page name'''
        frame = self.frames[page_name]
        frame.tkraise()


class MenuPage(tk.Frame):

    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)
        self.controller = controller

        name_label = tk.Label(self, text='Name:')
        name_label.pack(pady=(20,0))

        self.name_var = tk.StringVar()
        self.name_entry = tk.Entry(self, width=10, textvariable=self.name_var)
        self.name_entry.pack()

        template = tk.Button(self, text='Template', height=3, width=20, bg='white', font=('12'),
                                command=lambda: self.load_page(controller))
        template.pack(pady=50)

    def load_page(self, controller):
        controller.show_frame('template')
        template.name_box.insert(tk.END, self.name_entry.var.get())

class template(tk.Frame):

    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)
        self.controller = controller
        self.grid(columnspan=10, rowspan=10)

        top = tk.Label(self, height=3, width=80, bg='dark grey')
        top.grid(row=0, column=0, columnspan=10)

        self.back_btn = tk.Button(self, text='BACK', font=('Helvetica', '14'), bg='dark grey',
                                  command=lambda: controller.show_frame('MenuPage'))
        self.back_btn.grid(row=0, column=0, columnspan=2, padx=10, pady=10)

        name_var = tk.StringVar()
        name_box = tk.Entry(self, width=10, textvariable=name_var)
        name_box.grid(row=1, column=1)



if __name__ == "__main__":
    app = SLS_v1()
    app.mainloop()

编辑:修复了代码中的错误。

您可以通过导入 GC 并将单击模板按钮时调用的函数更改为添加以下几行来解决此问题:

import gc

...
...

    def load_page(self, controller):
        controller.show_frame('template')
        for obj in gc.get_objects():
            if isinstance(obj, template):
                obj.name_box.delete(0, tk.END)
                obj.name_box.insert(tk.END, self.name_entry.get())