给出以下代码,其中多个回调与单个按钮关联:
import tkinter as tk
def hi(event):
print('hello')
return hi
def bye():
print('bye')
return bye
def salutations(event):
print('... and salutations...')
return bye
def and_so_forth(event):
print('... and so forth...')
return bye
root = tk.Tk()
button = tk.Button(root, text='test', command = bye)
button.bind("<Button-1>", hi)
button.bind("<Button-1>", salutations, "+")
button.bind("<Button-1>", and_so_forth, "+")
button.pack()
root.mainloop()
我可以调用一个方法来列出绑定到
button
的所有回调吗?
我想要得到的结果类似于:
command_list = ('hi', 'salutations', 'and_so_forth', 'bye')
我尝试过的:
bye
函数)有人知道这是否可能吗?
谢谢你。
是和不是。如果您在 Tcl 中编写此代码,答案是“是”。
bind
不给它回调(例如:.button bind <Button-1>
)返回与绑定关联的回调列表。然而,tkinter 必须在回调周围添加一个包装器,从而产生难以理解的结果。
例如,给出以下代码:
print(button.bind("<Button-1>"))
...在你的情况下它会产生这样的结果:
if {"[4346304576hi %# %b %f %h %k %s %t %w %x %y %A %E %K %N %W %T %X %Y %D]" == "break"} break
if {"[4346304832salutations %# %b %f %h %k %s %t %w %x %y %A %E %K %N %W %T %X %Y %D]" == "break"} break
if {"[4346305024and_so_forth %# %b %f %h %k %s %t %w %x %y %A %E %K %N %W %T %X %Y %D]" == "break"} break
您可以尝试解析它,但不能保证结果在 tkinter 的未来版本中是相同的,并且您每次运行时必须删除的确切数字可能会有所不同。
我发现的最接近的是
_tclCommands
属性:
commands = button._tclCommands
print(commands)
#=> ['1310081992192bye', '1310100638592hi', '1310100643904salutations', '1310100643712and_so_forth']
鉴于前导下划线,我不认为你应该这样做,但它是我能得到的最接近的。另外,请记住,每次运行应用程序时,这些领先数字都会发生变化。
这有点麻烦,但您也可以将此列表与
dir()
列出的函数交叉引用,以获取给定小部件的回调名称:
def get_callbacks(widget):
callbacks = []
for fn in dir(): # list all functions in this module
for callback_name in widget._tclCommands: # get callbacks
if fn in callback_name: # print matches
callbacks.append[fn]
return callbacks
# naturally, this could also be done with a list comprehension, but it's
# a bit easier to see what's going on this way