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

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

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

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

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

python tkinter tk key-bindings
3个回答
1
投票

如果要复制任何现有绑定,首先需要了解原始序列绑定的内容。在这种情况下,绑定<Control-/>绑定到绑定标记“Listbox”(内部窗口小部件类的名称)

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

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

第二步是将原始函数与新的键组合相关联:

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

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


0
投票

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


对于Listbox的特定情况,Control- / event首先激活虚拟事件<<SelectAll>>。然后调用Tcl命令为listbox'es 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,你可能会或可能不想要。相反,在Caps Lock开启时,Tk会将Ctrl-Shift-A解释为Ctrl-A


-2
投票

我自己问了一个very similar question

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


生成Control- / event,以便从那时起处理所有事情:

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