Events Tkinter-多个按钮的同一事件

Events Tkinter-多个按钮的同一事件,events,tkinter,Events,Tkinter,使用Tkinter,我有许多按钮。我希望每次按下任何按钮时都能触发相同的回调函数。我怎样才能知道按下了哪个按钮 def call(p1): # Which Button was pressed? pass for i in range (50): B1 = Button(master, text = '...', width = 2) B1.grid(row = i*20, column = 60) B1.bind('<

使用Tkinter,我有许多按钮。我希望每次按下任何按钮时都能触发相同的回调函数。我怎样才能知道按下了哪个按钮

def call(p1):
    # Which Button was pressed?
    pass

for i in range (50):
    B1 = Button(master, text = '...', width = 2)
    B1.grid(row = i*20, column = 60)               
    B1.bind('<Button-1>',call)

    B2 = Button(master, text = '...', width = 2)
    B2.grid(row = i*20, column = 60)               
    B2.bind('<Button-1>',call)
def呼叫(p1): #按下了哪个按钮? 通过 对于范围(50)内的i: B1=按钮(主按钮,文本=“…”,宽度=2) B1.网格(行=i*20,列=60) B1.绑定(“”,调用) B2=按钮(主控,文本=“…”,宽度=2) B2.网格(行=i*20,列=60) B2.绑定(“”,调用)
这可能不是最简单的解决方案,但却是我唯一能想到的解决方案

from Tkinter import *
master = Tk()

L = []

def call(p1):
    for i in range(len(L)):
        if str(L[i]) == str(p1.widget):
            print 'Button' + str(i)
            break  

for i in range (50):
    exec("Button" + str(i) + " = Button(master, text = '...', width = 2)")
    exec("Button" + str(i) + ".grid(row = i*20, column = 60)")               
    exec("Button" + str(i) + ".bind('<Button-1>',call)")

    s = 'L.append(str(Button' + str(i) + '))'
    exec(s)
从Tkinter导入*
master=Tk()
L=[]
def呼叫(p1):
对于范围内的i(len(L)):
如果str(L[i])==str(p1.widget):
打印“按钮”+str(一)
打破
对于范围(50)内的i:
exec(“按钮”+str(i)+”=按钮(主控,文本=“…”,宽度=2)”
exec(“按钮”+str(i)+“.grid(行=i*20,列=60)”)
exec(“按钮”+str(i)+.bind(“”,call)”)
s='L.append(str(按钮'+str(i)+')”
行政总裁(s)

使用列表引用动态创建的按钮,使用lambda存储对按钮对象索引的引用。您可以确定单击了哪个按钮。在下面的示例中,我在button对象上使用
.cget(“text”)
来演示如何访问button小部件

import tkinter as tk

root = tk.Tk()
root.minsize(200, 200)

btn_list = [] # List to hold the button objects

def onClick(idx):
    print(idx) # Print the index value
    print(btn_list[idx].cget("text")) #Print the text for the selected button

for i in range(10):
    # Lambda command to hold reference to the index matched with range value
    b = tk.Button(root, text = 'Button #%s' % i, command = lambda idx = i: onClick(idx))
    b.grid(row = i, column = 0)

    btn_list.append(b) # Append the button to a list

root.mainloop()

或者,您可以使用bind,然后从生成的事件对象访问小部件

import tkinter as tk

root = tk.Tk()
root.minsize(200, 200)

def onClick(event):
    btn = event.widget # event.widget is the widget that called the event
    print(btn.cget("text")) #Print the text for the selected button

for i in range(10):
    b = tk.Button(root, text = 'Button #%s' % i)
    b.grid(row = i, column = 0)
    # Bind to left click which generates an event object
    b.bind("<Button-1>", onClick)

root.mainloop()
将tkinter作为tk导入
root=tk.tk()
root.minsize(200200)
def onClick(事件):
btn=event.widget#event.widget是调用事件的小部件
打印(btn.cget(“文本”)#打印所选按钮的文本
对于范围(10)内的i:
b=tk.Button(根,文本='按钮#%s'%i)
b、 网格(行=i,列=0)
#绑定到生成事件对象的左键单击
b、 绑定(“,onClick)
root.mainloop()
  • @史蒂文·萨默斯(Steven Summers)的第一个例子对我来说似乎是最清楚的,但我认为在不列出清单的情况下这样做更清楚
  • 按照我理解问题的方式,您不仅想知道单击了哪个按钮,还想让每个按钮调用另一个未描述的函数(
    universal
    ,在下面的示例中)。在这种情况下,您可以使用非常方便的
    combine_funcs
    (请参阅:)从一个小部件调用两个函数
  • 这是我的密码。我没有列表,只是有一个字符串,每次单击都会更改并打印出来

    import tkinter as tk
    
    root = tk.Tk()
    root.minsize(200, 200)
    
    buttonVal = ''                             
    
    def combine_funcs(*funcs):
        def combined_func(*args, **kwargs):
            for f in funcs:
                f(*args, **kwargs)
        return combined_func
    
    def universal():
        print 'Universal function is called'    
    
    def button_check(buttonName):
        buttonVal = buttonName
        print buttonVal   # Or whatever you want to do with the button info
    
    for i in range(10):
        B1 = tk.Button(root, text = 'Button #%s' % i, command = combine_funcs(universal, lambda buttonName = 'Button #%s' % i:button_check(buttonName)))
        B1.grid(row = i, column = 0)
    
    root.mainloop()
    

    使用
    lambda

    B1 = Button(master, text = '...', width = 2, command = lambda: call('B1') )
    

    等等…

    为什么要使用
    exec
    ?这毫无意义。