簡體   English   中英

將許多按鈕綁定到函數,將每個按鈕的名稱作為參數傳遞

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM