将现有的标准绑定重新用于不同的组合键
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()
您可以从源代码中找到特定绑定使用的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))
您可能想要绑定 所有 个列表框对象:
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)
注意:以上将绑定与所有列表框小部件相关联,而不仅仅是特定的列表框。
我想分配一个组合键来执行与现有标准绑定相同的操作。
具体来说,对于 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()
您可以从源代码中找到特定绑定使用的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))
您可能想要绑定 所有 个列表框对象:
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)
注意:以上将绑定与所有列表框小部件相关联,而不仅仅是特定的列表框。