在 Tkinter 中,是否可以检索绑定到小部件的回调函数列表?

问题描述 投票:0回答:2

给出以下代码,其中多个回调与单个按钮关联:

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')

我尝试过的:

  • 我搜索了房产清单,但没有看到任何有希望的东西。
  • button.command.get()(被忽略)
  • button.command.cget()(也被忽略)
  • button.invoke()(仅报告
    bye
    函数)

有人知道这是否可能吗?

谢谢你。

python-3.x tkinter callback
2个回答
0
投票

是和不是。如果您在 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 的未来版本中是相同的,并且您每次运行时必须删除的确切数字可能会有所不同。


0
投票

我发现的最接近的是

_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
© www.soinside.com 2019 - 2024. All rights reserved.