python tkinter 获得按钮的文本值

本文记录了一位初学者在使用Python的Tkinter库制作计算器时遇到的问题:在循环创建数字按钮时,点击按钮总是显示最后一个数字9。原因是循环结束后变量count保持了最终值。为了解决这个问题,作者创建了一个自定义的myButton类,通过传入按钮文本作为参数,成功实现了点击按钮时正确显示其文本。解决方案使按钮实例化更可控,避免了变量作用域问题。
摘要由CSDN通过智能技术生成

python tkinter 获得按钮的文本值

背景

  • 最近本菜鸡在学习 python GUI,从 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 的值就是 9
  • 找到问题后,我便想办法解决这个问题
  • 我尝试过 将每一个实例化的 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 对象,指定按钮要创建在哪一个 Frame 对象中
    • text,字符串 / 数字,按钮上显示的文本以及 点击按钮要获得的文本
    • entry,Entry 对象,点击按钮后文本出现在哪里
    • kwargs,包括 side
      • side,元组,设置按钮的位置
  • 通过实例化一个 myButton 对象即可创建出一个能获得按钮文本的 Button 对象
  • 列举数字按钮
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))
  • 效果图
    在这里插入图片描述



结尾

以上就是我要分享的内容,因为学识尚浅,会有不足,还请各位大佬指正。
有什么问题也可在评论区留言。
在这里插入图片描述

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值