禁用tkinter键盘快捷键(2)

时间:2011-07-25 08:04:25

标签: python tkinter tk

我建议在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()有机会行动之前消失了......

2 个答案:

答案 0 :(得分:3)

在文本小部件上设置绑定,而不是在根目录上。 (整个顶层绑定在窗口小部件类绑定之后处理 - 其中标准<Control-Key-b>绑定是 - 并且在窗口小部件实例绑定之后处理,这就是你想在这里使用。)你需要这样做'break';它抑制了后续的绑定。 (如果你之后遇到任何问题,默认情况下焦点可能是错误的,但这很容易解决。)

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

答案 1 :(得分:2)

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

  1. 特定小部件
  2. 小部件类
  3. 顶层窗口
  4. 特殊班级“全部”
  5. 如果存在冲突的绑定 - 例如,对小部件和类进行控制-b绑定 - 它们都将触发(按所描述的顺序),除非您通过返回"break"来中断链。

    但是,对于您发布的代码,您绑定到顶层窗口(即:根窗口),并且冲突绑定在该类上。因此,绑定将在类被顶层处理之前为类触发,因此即使您的绑定返回"break",也无关紧要,因为类绑定首先发生。

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

    如果您确实希望在根窗口上进行绑定,则可以使用bind_class方法删除该类的绑定,并为该类添加"Text"的值。

    您可能会发现effbot.org上的Events and Bindings页面非常有用。