我有一个PYTHON图形用户界面和Tkinter.在一堂课上,我有一些文本小工具.它们有大约default bindings个,我想最好用bind_class()
个来取代其中的一些.除了那些热键大写的,比如Ctrl-E/A/B/F
(即Ctrl-Shift-e/a/b/f
),我所有的都做到了.我只能通过在每个小部件上分别应用bind()
方法来更改这些.我想知道为什么会这样,是否有更聪明的方法来处理bind_class()
,否则它似乎不会对上面提到的默认绑定产生任何影响.
请考虑下面的代码.在点击每个文本窗口小部件并try 所有四个热键(Ctrl-b/B/y/Y
)后,可以看到它们在两个窗口小部件中都能像预期的那样工作,除了Ctrl-B
(即Ctrl-Shift-b
),只有当它与带有bind()
的窗口小部件绑定时才能工作.
就像我现在看到的这个问题:对于一个带有大写键的内置函数,优先级显然是这样的:bind()
>;结尾可能是return 'break'
的内置函数.这意味着,bind_class()
永远不会工作,只有在bind()
中引用的函数末尾没有return 'break'
的情况下,才会调用内置函数.同时,带有小写字母键的内置热键(例如Ctrl-a/e/b/f
)的优先级较低,甚至bind_class()
也可以优先于它们.
所以我的问题是:
- 我的上述结论是正确的,还是有其他原因?
- 这是
bind()
和bind_class()
的预期功能吗? - 在某种程度上,是否仍然有可能覆盖像
Ctrl-B
这样的内置函数,一次只对所有小部件使用bind_class()
,而不是逐个使用bind()
?
欢迎任何有见地的 comments .谢谢!
from tkinter import *
class Test:
def __init__(self):
self.window = Toplevel(root)
self.window.lift()
self.t1 = Text(self.window)
self.t1.insert(1.0, 'Initial text in Text widget #1')
#self.t1.bind('<Control-B>', self.func)
self.t1.pack()
self.t2 = Text(self.window)
self.t2.insert(1.0, 'Initial text in Text widget #2')
self.t2.bind('<Control-B>', self.func)
self.t2.pack()
self.t1.bind_class('Text', '<Control-b>', self.func)
self.t1.bind_class('Text', '<Control-B>', self.func) # This line has no effect.
self.t1.bind_class('Text', '<Control-y>', self.func)
self.t1.bind_class('Text', '<Control-Y>', self.func)
def func(self, event):
obj = root.focus_get()
obj.insert(END, '\n'+str(event))
return 'break'
root = Tk()
t1 = Test()
root.lower()
root.mainloop()