Python Tkinter 解决循环创建按钮时获取文本值的问题
本文介绍在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按钮操作内容,欢迎查阅本站往期文章或继续浏览后续教程,感谢支持!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









