将现有的标准绑定重新用于不同的组合键

Reuse an existing standard binding for a different key combination

我想分配一个组合键来执行与现有标准绑定相同的操作。

具体来说,对于 tkinter.Listbox, make Ctrl-A select all (same as Ctrl-/) 并且对 Ctrl+<the keys corresponding to those two in my national keyboard layout> 也做同样的事情。

由于执行该操作的子例程存在于 Tk 级别而不是 Python 级别,因此我不能像对 Python 函数那样对它们 .bind()

我问过 我自己。

您可以简单地生成您想要模仿的事件。


正在生成 Control-/ 事件,以便它处理从那一点开始的所有事情:

lb.bind('<Control-Key-a>',
                    lambda event:lb.event_generate('<Control-Key-slash>'))

一个完整的例子:

try:                        # In order to be able to import tkinter for
    import tkinter as tk    # either in python 2 or in python 3
except ImportError:
    import Tkinter as tk


if __name__ == '__main__':
    root = tk.Tk()
    lb = tk.Listbox(root)
    for i in range(4):
        lb.insert('end', i)

    lb.bind('<Control-Key-a>',
                    lambda event:lb.event_generate('<Control-Key-slash>'))
    # assign anything but "single" or "browse"
    # so that the effect is obvious
    lb['selectmode'] = 'asd'
    lb.pack()
    tk.mainloop()

您可以从源代码中找到特定绑定使用的命令。


对于 Listbox 的特定情况,Control-/ 事件首先激活一个虚拟事件,<<SelectAll>>。然后为列表框的 Tcl 过程调用 Tcl 命令 tk::ListboxSelectAll.

让我们分配 Control-A 来模仿 Control-/.

生成 <<SelectAll>> 事件,以便它调用它应该调用的任何内容:

lb.bind('<Control-Key-a>', lambda event: lb.event_generate('<<SelectAll>>'))

或者您可以直接调用 <<SelectAll>> 最终调用的内容:

lb.bind('<Control-Key-a>', lambda event: lb.tk.call('tk::ListboxSelectAll', lb))

您可能想要绑定 所有 个列表框对象:

lb.bind_class(lb.winfo_class(), '<Control-Key-a>',
                    lambda event: lb.tk.call('tk::ListboxSelectAll', lb))

一个完整的例子:

try:                        # In order to be able to import tkinter for
    import tkinter as tk    # either in python 2 or in python 3
except ImportError:
    import Tkinter as tk


if __name__ == '__main__':
    root = tk.Tk()
    lb = tk.Listbox(root)
    for i in range(4):
        lb.insert('end', i)
    lb.bind_class(lb.winfo_class(), '<Control-Key-a>',
                        lambda event: lb.tk.call('tk::ListboxSelectAll', lb))
    # assign anything but "single" or "browse"
    # so that the effect is obvious
    lb['selectmode'] = 'asd'
    lb.pack()
    tk.mainloop()

最后,请注意,您可能还想绑定到 <Control-Key-A>,因此即使启用 Caps Lock 也可以绑定。

这也将有效地绑定 Ctrl-Shift-A,您可能想要也可能不想要。相反,在大写锁定打开的情况下,Tk 会将 Ctrl-Shift-A 解释为 Ctrl-A.

如果您想复制任何现有绑定,您需要做的第一件事就是了解原始序列绑定到什么。在这种情况下,绑定 <Control-/> 绑定到绑定标记 "Listbox"(内部小部件的名称 class)

第一步是通过对 Tcl 解释器进行原始调用来获取现有绑定:

func = root.call("bind", "Listbox", "<Control-/>")

第二步是将原来的功能关联到新的组合键:

root.call("bind", "Listbox", "<Control-A>", func)

注意:以上将绑定与所有列表框小部件相关联,而不仅仅是特定的列表框。