[英]Binding many buttons to a function, passing each button's name as an argument
請注意,我的問題與此相反: 在循環中創建函數 ,因為我有許多按鈕和一個函數,而不是很多函數。
我從for
循環創建10個編號按鈕,然后嘗試將每個按鈕綁定到一個將打印按鈕編號的函數; 見下面的代碼:
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, num=button[6:]: 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:]
的值並存儲它。 相反,它會產生一個閉包 ,這有點像對自己的說法“ 我應該在我被稱為 ” 時應該查找變量按鈕(迭代器)的值 。“
現在當循環結束並且每個小部件都准備好並設置好,並且你調用它時,它將在那時查找按鈕的值,這當然是迭代的最后一個值(這里是button10
)。
num=button[6:]
使函數在定義lambda時存儲計數器的當前值(此處為按鈕 ),而不是等待稍后查找按鈕的值。
致謝: 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()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.