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

使用函数创建Tkinter组件,点击按钮无法获取对应Entry内容的问题

问题分析与解决

问题根源

你遇到的问题核心是实例变量被重复覆盖,以及submit方法未使用传入的Entry引用:

  • 每次调用create_input_field时,都会把新创建的Entry对象赋值给self.entry,导致之前的Entry引用被覆盖,self.entry永远指向最后一个创建的输入框。
  • 虽然按钮的lambda已经把当前的Entry对象传入submit方法,但你在submit里还是用了self.entry.get(),相当于无视传入的参数,直接取最后一个输入框的值。

修正代码

只需要修改submit方法,使用传入的entry参数获取输入值即可:

import tkinter as tk

class Application:
    def __init__(self, root):
        self.root = root
        self.root.title("Recipe Input Form")

    def create_input_field(self, label_text):
        # 创建标签
        label = tk.Label(self.root, text=label_text)
        label.pack()

        # 创建输入框
        entry = tk.Entry(self.root)
        entry.pack()

        # 创建提交按钮
        submit_button = tk.Button(self.root, text="Submit", command=lambda e=entry, lt=label_text: self.submit(e, lt))
        submit_button.pack()

    def submit(self, entry, label_text):
        # 使用传入的entry参数获取输入值,而非self.entry
        user_input = entry.get()

        # 处理输入内容(示例:打印)
        print(f"You entered:{label_text}, user_input: {user_input}")

if __name__ == "__main__":
    root = tk.Tk()
    app = Application(root)

    # 创建配方编号输入字段
    recipe_number = app.create_input_field(label_text="Recipe number")
    # 创建其他参数输入字段
    other_pars = app.create_input_field(label_text="other_params")
    root.mainloop()

额外优化建议

  • 无需将label、entry、submit_button设为实例变量(self.xxx),每个输入字段的组件是独立的,用局部变量即可,避免不必要的覆盖。
  • lambda里用e=entry、lt=label_text的写法更清晰,能避免变量延迟绑定的潜在问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 02:35:18