我建议在disable tkinter keyboard shortcut继续讨论:我有一个Tkinter也使用的事件的事件处理程序,所以我的编程& Tkinter的互动非常糟糕。
由于这是一个我无法解决的问题,我在这里重新提出,我试图将其简化为以下代码中最简单的形式:
#!/usr/bin/env python
from Tkinter import *
import tkFont
def init():
global root,text
root = Tk()
root.geometry("500x500+0+0")
dFont=tkFont.Font(family="Arial", size=10)
text=Text(root, width=16, height=5, font=dFont)
text.pack(side=LEFT, fill=BOTH, expand = YES)
root.bind("<Control-b>", setbold)
text.tag_config("b",font=('Verdana', '10', 'bold' ))
text.tag_config("i",font=('Verdana', '10', 'italic' ))
def removeformat(event=None):
text.tag_remove('b',SEL_FIRST,SEL_LAST)
text.tag_remove('i',SEL_FIRST,SEL_LAST)
def setbold(event=None):
removeformat()
text.tag_add('b', SEL_FIRST,SEL_LAST)
text.edit_modified(True)
def main():
init()
mainloop()
if __name__ == '__main__':
main()
它应该做的只是生成一个你写入的文本窗口。 选择一些文本并按 Ctrl + B 程序应该删除任何预先存在的标签,然后为其分配'b'标签,将文本设置为粗体。
相反发生的是第一个tag_remove
的例外,告诉我text doesn't contain any characters tagged with "sel"
。
使用return 'break'
的建议没有用,因为选择在setbold()
有机会行动之前消失了......
答案 0 :(得分:3)
在文本小部件上设置绑定,而不是在根目录上。 (整个顶层绑定在窗口小部件类绑定之后处理 - 其中标准<Control-Key-b>
绑定是 - 并且在窗口小部件实例绑定之后处理,这就是你想在这里使用。)你需要这样做'break'
;它抑制了后续的绑定。 (如果你之后遇到任何问题,默认情况下焦点可能是错误的,但这很容易解决。)
唯一的另一种选择是重新配置bindtags,以便在顶层绑定之后处理类绑定,但这样做的后果非常微妙且影响深远;你应该使用我的第一段中更简单的方法,因为这是处理这些事情的正常方法。
答案 1 :(得分:2)
绑定按特定顺序处理,由该小部件的bindtags
定义。默认情况下,此顺序为:
如果存在冲突的绑定 - 例如,对小部件和类进行控制-b绑定 - 它们都将触发(按所描述的顺序),除非您通过返回"break"
来中断链。
但是,对于您发布的代码,您绑定到顶层窗口(即:根窗口),并且冲突绑定在该类上。因此,绑定将在类被顶层处理之前为类触发,因此即使您的绑定返回"break"
,也无关紧要,因为类绑定首先发生。
最直接的解决方案是将绑定移动到实际的窗口小部件并返回"break"
。这将首先保证您的绑定触发,return "break"
保证类绑定不会触发。
如果您确实希望在根窗口上进行绑定,则可以使用bind_class
方法删除该类的绑定,并为该类添加"Text"
的值。
您可能会发现effbot.org上的Events and Bindings页面非常有用。