Python 禁用tkinter键盘快捷键(2)

Python 禁用tkinter键盘快捷键(2),python,tkinter,tk,Python,Tkinter,Tk,我建议继续中的讨论:对于Tkinter也使用的事件,我有一个事件处理程序,因此我的prog&Tkinter交互不好 因为这是一个我一直无法解决的问题,所以我在这里提出,我试图用以下代码将其归结为最简单的形式: #!/usr/bin/env python from Tkinter import * import tkFont def init(): global root,text root = Tk() root.geometry("500x500+0+0")

我建议继续中的讨论:对于Tkinter也使用的事件,我有一个事件处理程序,因此我的prog&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()
#/usr/bin/env python
从Tkinter进口*
导入tkFont
def init():
全局根,文本
root=Tk()
根几何(“500x500+0+0”)
dFont=tkFont.Font(family=“Arial”,size=10)
text=text(根,宽=16,高=5,字体=dFont)
text.pack(侧边=左侧,填充=两侧,展开=是)
root.bind(“,setbold)
text.tag_config(“b”,font=('Verdana','10','bold'))
text.tag_config(“i”,font=('Verdana','10','italic'))
def removeformat(事件=无):
text.tag_remove('b',SEL_FIRST,SEL_LAST)
text.tag_remove('i',SEL_FIRST,SEL_LAST)
def setbold(事件=无):
removeformat()
text.tag\u add('b',SEL\u FIRST,SEL\u LAST)
text.edit\u modified(真)
def main():
init()
mainloop()
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
main()
它应该做的只是生成一个文本窗口,您可以在其中写入内容。 选择一些文本并按Ctrl+B,程序应删除任何先前存在的标记,然后为其指定将文本设置为粗体的“B”标记

相反,在第一次
标记_remove
时发生了一个异常,告诉我
文本不包含任何标记为“sel”的字符


使用
返回'break'
的建议没有用,因为在
setbold()
有机会执行操作之前,选择将消失…

将绑定设置在文本小部件上,而不是根部件上。(整个顶级绑定是在小部件类绑定之后处理的,其中标准的
绑定是在小部件实例绑定之后处理的,这就是您想要在这里使用的。)您需要这样做
'break'
;它禁止后续绑定。(如果在此之后出现任何问题,可能是默认情况下焦点错误,但这很容易修复。)


唯一的另一种选择是重新配置BindTag,以便在顶级绑定之后处理类绑定,但这样做的后果非常微妙和深远;您应该使用我第一段中的简单方法,因为这是处理这些事情的正常方式。

绑定是按照特定顺序处理的,由该小部件的
bindtags
定义。默认情况下,此顺序为:

  • 特定小部件
  • 小部件类
  • 顶层窗口
  • 特殊类“所有”
  • 如果存在冲突绑定(例如,小部件和类上的control-b绑定),则它们都将触发(按描述的顺序),除非您通过返回
    “break”
    来中断链

    但是,对于您发布的代码,您绑定到顶级窗口(即:根窗口),而冲突绑定在类上。因此,在顶级处理该类之前,该类将触发绑定,因此即使绑定返回
    “break”
    ,也无所谓,因为类绑定首先发生

    最直接的解决方案是将绑定移动到实际的小部件并返回
    “break”
    。这将保证您的绑定首先触发,
    返回“break”
    保证类绑定不会触发

    如果确实希望在根窗口上进行绑定,可以使用类的值为
    “Text”
    bind\u class
    方法删除该类的绑定


    您可能会发现effbot.org上的页面很有用

    需要明确的是,非顶级绑定组的标准顺序如下:小部件实例、小部件类、顶级实例、全局。(对于toplevels,widget实例是toplevel实例,如果您没有预料到它会导致问题。)可以使用bindtags更改此顺序,插入新组并删除旧组;这是一种非常先进的技术,很有趣,但在您用尽所有简单的替代方法之前,不能在生产代码中使用。是的,就是这样!现在-如果你愿意给我进一步的建议。。。我仍然有一个令人惊讶的事实,Ctrl-1。。。Ctrl-5是不可绑定的,即无论我尝试什么,都不会触发事件!相反,令人惊讶的是,从Ctrl-6到Ctrl-9都能正常工作。有什么想法吗???