我在尝试创建 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/