我想指定一个组合键来执行与现有标准绑定相同的操作。
具体而言,对于tkinter.Listbox
,请Ctrl-A
选择全部(same as Ctrl-/
)并对Ctrl+<the keys corresponding to those two in my national keyboard layout>
执行相同操作。
由于子程序存在于Tk级别而不是Python级别,因此我不能像对待Python函数那样.bind()
。
答案 0 :(得分:0)
您可以从源代码中找到用于特定绑定的tcl命令。
对于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)
您可以简单地生成您想要模仿的事件。
生成 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()