Python Tkinter 解决循环创建按钮时获取文本值的问题

沈亦白
沈亦白
发布时间:2026-10-14 | 4人浏览过
原创

本文介绍在Python Tkinter中使用循环创建按钮时,因闭包机制导致所有按钮返回相同值的问题。通过自定义myButton类,将按钮文本作为参数传入,利用lambda表达式绑定具体文本,从而正确获取每个按钮的点击值。

背景

近期笔者正在学习Python图形界面开发,从tkinter模块开始入门,计划先编写一个小软件进行实践。经过思考,决定制作一个简易计算器。相关代码已发布,可通过链接查看。

问题重现

然而,在使用循环批量创建数字按钮时遇到了障碍,问题代码如下


for i in range(3):
    num_frame = tk.Frame(major_frame)
    num_frame.pack()
    for count in range(3*i+1, 3*i+4):
        button = tk.Button(
            num_frame,
            text = count,
            activeforeground = "blue",
            activebackground = "pink",
            width = "13",
            command = lambda : entry.insert("end", count)
        )
        button.grid(row = i, column = count)

完整代码见 每次点击按钮时,输入框中始终显示数字9。这是因为循环结束后变量count的值固定为9,而按钮命令中直接引用了该变量,导致所有按钮点击后都插入相同的count值。定位到问题根源后,笔者尝试寻找解决方案。曾尝试将每个实例化的Button对象存入列表或字典,但仍无法正确获取对应的索引及按钮文本。

解决方法

借助搜索引擎,笔者找到了解决思路:自定义一个Button类。

具体实现代码如下


import tkinter
class myButton():
    def __init__(self, frame, text, entry, **kwargs):
        side = kwargs.get('side') if 'side' in kwargs else ()
        self.btn = tkinter.Button(
            frame,
            text = text,
            activeforeground="blue",
            activebackground="pink",
            width="13",
            command=lambda :entry.insert("end", text)
        )
        if side:
            self.btn.grid(row=side[0], column=side[1])
        else:
            self.btn.pack()

参数说明

  • frame:Frame对象,用于指定按钮所在的父容器。
  • text:字符串或数字,既作为按钮上显示的标签,也作为点击按钮时希望获取的值。
  • entry:Entry对象,用于指定点击按钮后文本显示的目标输入框。
    • kwargs:包含side等额外参数。
  • side:元组,用于设置按钮在网格中的位置坐标。

通过实例化myButton对象,即可创建出能够正确获取按钮文本的自定义按钮。

以下是数字按钮的生成示例


for i in range(4):
    num_frame = tk.Frame(major_frame)
    num_frame.pack()
    if i < 3:
        for count in range(3*i+1, 3*i+4):
            myButton(num_frame, count, word_entry, side=(i, count))
        continue
    myButton(num_frame, 0, word_entry, side=(i, 0))

运行效果如图

 

至此,关于Python Tkinter中获取按钮文本值的介绍结束。更多相关Tkinter按钮操作内容,欢迎查阅本站往期文章或继续浏览后续教程,感谢支持!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表