gpt4 book ai didi

python - 将许多按钮绑定(bind)到一个函数,将每个按钮的名称作为参数传递

转载 作者:行者123 更新时间:2023-11-30 22:01:26 25 4
gpt4 key购买 nike

请注意,我的问题与此相反:Creating functions in a loop因为我有很多按钮和一个功能,而不是很多功能。

我通过 for 循环创建了 10 个编号按钮,然后尝试将每个按钮绑定(bind)到一个将打印按钮编号的函数;请参阅下面的代码:

import tkinter as tk

class Window(tk.Tk):
def __init__(self):
tk.Tk.__init__(self)

# creating buttons and adding them to dictionary

self.buttons = {}
for number in range(1, 11):
self.buttons.update({'button' + str(number): tk.Button(self, height=1, width=4, bg="grey", text=number)})

# example of a pair in the dictionary: 'button2': <Tkinter.Button instance at 0x101f9ce18>


""" bind all the buttons to callback, each button is
named something like 'button3',so I take the number off
the end of its name and feed that as an argument to Callback"""

for button in self.buttons:
self.buttons[button].bind('<Button-1>', lambda event: self.Callback(event, button[6:]))
self.buttons[button].pack(side='left')

def Callback(self, event, num):
print(num)

所有按钮都显示在窗口上没有问题,但是当我单击其中任何一个按钮时,控制台会打印“10”,而不是按钮的编号。看来该函数只记住了它给出的最后一个参数。

最佳答案

首先让我们更正您的代码以给出所需的答案。

import tkinter as tk

class Window(tk.Tk):
def __init__(self):
tk.Tk.__init__(self)

self.buttons = {}
for number in range(1, 11):
self.buttons.update({'button' + str(number): tk.Button(self, height=1, width=4, bg="grey", text=number)})

for button in self.buttons:
self.buttons[button].bind('<Button-1>', lambda event, <b>num=button[6:]</b>: self.Callback(event, num))
self.buttons[button].pack(side='left') #\____________/

def Callback(self, event, num):
print(num)

Window().mainloop()
<小时/>

说明:

诀窍在于 lambda 函数的工作方式。

当您编写lambda event: self.Callback(event, button[6:])时,它不会获取button[6:]的值code> 在该实例并存储它。相反,它创建了一个闭包,这有点像给自己写的注释:“我应该查找变量按钮(迭代器)在我执行操作时的值是什么。称为”。

现在,当循环结束并且每个小部件都已准备好并设置完毕时,您调用它时,它将查找当时 button 的值,这当然是迭代(此处为 button10)。

num=button[6:] 使函数在定义 lambda 时存储计数器(此处为 button)的当前值,而不是等待稍后查找按钮的值。

鸣谢:BrenBarn

<小时/>

补充一下,您可以使用 Button 小部件的 command 属性以更少的代码完成您现在正在做的事情。这是一个例子。

import tkinter as tk

class Window(tk.Tk):
def __init__(self):
tk.Tk.__init__(self)

for number in range(1, 11):
tk.Button(self, height=1, width=4, bg="grey", text=number, command=lambda num=number: self.Callback(num)).pack(side='left')

def Callback(self, num):
print(num)

Window().mainloop()

关于python - 将许多按钮绑定(bind)到一个函数,将每个按钮的名称作为参数传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54052156/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com