python - 如何使用 tkinter 使用 lambda 创建 0-9 数字按钮?

标签 python button tkinter lambda list-comprehension

我在尝试创建 0-9 数字按钮时遇到了小问题。我想在单循环中为从 0 到 9 的数字定义 10 个按钮。它们中的每一个都应该将其值添加到 self.user_input = tk.StringVar()这将打印在标签中。单击 5 按钮、7 按钮,然后单击 0 按钮将给出输出 570。我尝试使用 lambda 为每个按钮创建命令,但我没有得到不同的值,而是到处都有 9。这是我的代码:

import tkinter as tk
import tkinter.ttk as ttk

class Gui(tk.Tk):
    def __init__(self):
        super().__init__()
        self.user_input = tk.StringVar()
        tk.Label(self, textvariable=self.user_input).grid()
        self.create_buttons()

    def create_buttons(self):
        for x in range(10):
            ttk.Button(self, text=x, command=lambda: self.user_input.set(self.user_input.get() + str(x))).grid()

app = Gui()
app.mainloop()

如何修复上面的代码以使其按预期工作(说明向上)?

最佳答案

将大部分代码放入适当的函数中。最佳实践是小部件回调的 lambda 应该只调用单个函数。复杂的 lambda 难以阅读且难以调试。

解决方案的第二部分是创建一个 closure 。实现这一点的技巧是让您传入的变量作为默认参数绑定(bind)到 lambda。

回调看起来像这样:

def callback(self, number):
    new_value = self.user_input.get() + str(number)
    self.user_input.set(new_value)

定义每个按钮看起来像这样:

def create_buttons(self):
    for x in range(10):
        button = ttk.Button(self, text=x, command=lambda number=x: self.callback(number))
        button.grid()

特别注意 number=x 作为 lambda 定义的一部分。这是 x 的当前值绑定(bind)到 lambda 内的 number 参数的地方。

关于python - 如何使用 tkinter 使用 lambda 创建 0-9 数字按钮?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58991557/

相关文章:

python - 是否有 GUI 可以查看 .npy 文件的内容?

python - Pyside QPushButton与matplotlib的连接

无法加载 Python cx_Oracle 客户端库

asp.net - 表格内的 PayPal 捐赠按钮不起作用

python - unittest.main() 如何选择测试用例调用的顺序

javascript - 将按钮定位在背景图像之上

HTML/CSS 输入按钮样式不起作用

python - Tkinter - 无法绑定(bind)箭头键事件

python - 另一个类中的 tkinter 变量

python - Tkinter 文本小部件关键字着色