我想指定一个组合键来执行与现有标准绑定相同的操作。
具体来说,对于tkinter.Listbox
,让Ctrl-A
选择所有(same as Ctrl-/
),并对Ctrl+<the keys corresponding to those two in my national keyboard layout>
做同样的事情。
由于子程序存在于Tk级别而不是Python级别,因此我不能像对待Python函数那样只对它们进行.bind()
。
如果要复制任何现有绑定,首先需要了解原始序列绑定的内容。在这种情况下,绑定<Control-/>
绑定到绑定标记“Listbox”(内部窗口小部件类的名称)
第一步是通过对Tcl解释器进行原始调用来获取现有绑定:
func = root.call("bind", "Listbox", "<Control-/>")
第二步是将原始函数与新的键组合相关联:
root.call("bind", "Listbox", "<Control-A>", func)
注意:以上内容将绑定与所有Listbox小部件相关联,而不仅仅是特定的列表框。
您可以从源代码中找到用于特定绑定的tcl命令。
对于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
。
我自己问了一个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()