Events Tkinter-多个按钮的同一事件
使用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('<
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()
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
?这毫无意义。