在tkinter按钮回调中在lambda中传递对象

时间:2019-01-05 10:01:07

标签: python tkinter

我正在尝试使用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来避免此错误?

2 个答案:

答案 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”可能会更改为其他任何数字。