我正在尝试使用lambda为tkinter按钮创建回调。
有多个按钮,每个回调都需要在其中传递一个对象。以下代码是我正在做的,并且运行良好
>>> a = [10, 11, 12, 12]
>>> a.pop(1)
11
>>> a
[10, 12, 12]
>>> a.remove(12)
>>> a
[10, 12]
var0用于更新标签。上面的代码工作正常,但是我必须为0到9创建回调,并且我必须重复上述定义。因此,我尝试使用this教程
中的以下示例var0 = tk.StringVar()
label = tk.Label(top, bg = "White",height = 2, width = 12,textvariable=var0, justify="right")
def b0Callback(var):
var.set(var.get()+"0")
return
# creating a label which will print value of the any of the 0-9 button pressed
# creating a button 0
b0 = tk.Button(numFrame0, height = 1, width = 4, bg = "grey", text =
"0",command = lambda: b0Callback(var0))
#there are more buttons like that
使用它,我遵循了
def myfunc(n):
return lambda a : a * n
mydoubler = myfunc(2)
mytripler = myfunc(3)
print(mydoubler(11))
print(mytripler(11))
这会在var.set的返回行中显示错误的无效索引
在这种情况下,有什么方法可以传递var0来避免此错误?
答案 0 :(得分:0)
我现在已经解决了问题,这是最终代码:
我也将按钮的数量更改为300,并添加了代码以将它们全部排列在一个漂亮的网格中,只是为了好玩。 (您可以通过更改for number in range(1, whatever)
将其更改为任意数量。
import tkinter as tk
class Window(tk.Tk):
def __init__(self):
tk.Tk.__init__(self)
self.var0 = tk.StringVar()
self.var0.set('0')
# creating buttons and adding them to dictionary
self.buttons = {}
for number in range(1, 301):
self.buttons.update({'button' + str(number): tk.Button(self, height=1, width=4, bg="grey", text=number)})
label = tk.Label(self, textvariable=self.var0, font='none 50')
label.grid(column=0, row=0)
for button in self.buttons:
self.buttons[button].bind('<Button-1>', lambda event, num=button[6:]: self.Callback(event, num))
self.buttons[button].grid(column=(int(button[6:]) % 10), row=(int(button[6:]) / 10) + 1)
def Callback(self, event, num):
self.var0.set(num)
self.update()
答案 1 :(得分:0)
也许只有我一个人,但是如果您只想在标签文本中添加数字,我看不出使用lambda的原因。
让我们为其创建一个函数,该函数将StringVar()作为变量并为其添加一些数字:
def button_callback(str_var, number):
str_var.set(str_var.get() + str(number))
要运行此命令,我们只需将其作为lambda函数放入代码中,否则它将在初始化时运行(因为我们提供的是函数而不是引用)。
因此要在按钮中运行它,我们需要这样声明:
my_button = Button(root, text='Some text here', command=lambda: button_callback(my_string_var, 5))
“ 5”可能会更改为其他任何数字。