You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python Tkinter中获取创建对象后的Entry输入值?

解决Tkinter跨类获取Entry输入值的问题

你的核心问题是**WindowClass没有保存创建的FrameClass实例引用**,导致get_value方法无法访问到对应的Entry组件。以下是具体修改方案:

关键修改点

  • 在WindowClass中添加实例属性,存储创建的FrameClass对象
  • 修改create_frame方法,将局部创建的对象赋值给该属性
  • 在get_value方法中通过保存的实例引用,调用Entry的get()方法获取输入值

修改后的完整代码

import tkinter as tk

class WindowClass:
    def __init__(self):
        super().__init__()
        root = tk.Tk()
        self.master = root
        self.master.geometry('500x500')
        # 添加实例属性,用于保存FrameClass对象
        self.frame_instance = None

        self.create_frame_button = tk.Button(self.master,
                                             text='Create Frame with Entry',
                                             width=20,
                                             command=self.create_frame)

        self.get_value_button = tk.Button(self.master,
                                          text='Get value from frame',
                                          width=20,
                                          command=self.get_value)

        self.create_frame_button.place(x=10, y=10)
        self.get_value_button.place(x=10, y=40)

        root.mainloop()

    def create_frame(self):
        # 将创建的FrameClass对象赋值给实例属性,而非局部变量
        self.frame_instance = FrameClass(self.master)

    def get_value(self):
        # 先判断是否已创建Frame实例
        if self.frame_instance:
            # 通过实例引用获取Entry的输入值
            input_value = self.frame_instance.entrybox.get()
            print("输入的值是:", input_value)
            # 也可以在这里把值显示到窗口上,比如用Label
            # tk.Label(self.master, text=f"输入值:{input_value}").place(x=10, y=70)
        else:
            print("请先点击'Create Frame with Entry'创建输入框")


class FrameClass:
    def __init__(self, master):
        self.master = master
        self.frame = tk.Frame(self.master, height=250, width=480, relief='solid', bd=4)
        self.entrybox = tk.Entry(self.frame, width=15, font='Calibri, 12')

        self.entrybox.place(x=10, y=10)
        self.frame.place(x=10, y=100)

if __name__ == '__main__':
    WindowClass()

补充说明

  • 如果允许创建多个FrameClass实例,可以用列表(self.frame_instances = [])来存储,在get_value时遍历获取每个实例的输入值
  • 若要更符合封装原则,可以在FrameClass中添加一个get_entry_value方法,替代直接访问entrybox属性,比如:
    class FrameClass:
        # ... 其他代码 ...
        def get_entry_value(self):
            return self.entrybox.get()
    
    然后在WindowClass的get_value中调用self.frame_instance.get_entry_value()

内容的提问来源于stack exchange,提问作者Alena

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 11:55:27