为不同的组合重用现有的标准绑定

时间:2018-02-25 14:44:57

标签: python tkinter tk key-bindings

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

具体而言,对于tkinter.Listbox,请Ctrl-A选择全部(same as Ctrl-/)并对Ctrl+<the keys corresponding to those two in my national keyboard layout>执行相同操作。

由于子程序存在于Tk级别而不是Python级别,因此我不能像对待Python函数那样.bind()

2 个答案:

答案 0 :(得分:0)

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

对于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))

您可能想要绑定所有 Listbox对象:

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

答案 1 :(得分:-2)

我自己问very similar question

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

生成 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()