Tkinter神秘的绑定问题

时间:2016-08-09 21:35:05

标签: python python-2.7 tkinter

我有一个绑定键组合:

self.parent.bind_all('<Control-n>', self.next_marked)

它应该带我到文本小部件中的下一个标签,其父级是一个框架。

def next_marked(self, skip=False):
    print (len(self.text.tag_ranges('definition')))
    print('next_marked()')
    self.text.focus_set()
    print (self.text.index(INSERT))
    next_tag = str(self.text.tag_nextrange('definition', 'insert+1c')[0])
    print (self.text.index(INSERT))
    spl = next_tag.split('.')
    line = int(spl[0])
    col = int(spl[1])
    self.text.mark_set('insert', '%d.%d' % ( line, col ))

当我不使用热键时这样做,但是当我使用热键时,它总是将光标的位置向下移动一行然后执行该功能。这是我的操作系统吗? (Windows 7)有关如何处理此问题的任何建议吗?

我正在使用Python 2.7和Tkinter 8.5

1 个答案:

答案 0 :(得分:4)

问题似乎是<Control-n>已绑定到Text类的“转到下一行”,如果有多个绑定,they will all be executed, in a specific order

  

Tkinter首先调用实例级别的最佳绑定,然后是顶级窗口级别的最佳绑定,然后是类级别的最佳绑定(通常是标准绑定),最后是应用程序上最佳的可用绑定水平。

所以你可以 覆盖所有<Control-n>小部件的Text的现有类级绑定:

self.parent.bind_class("Text", '<Control-n>', lambda e: None)

或者将您的函数绑定到实例(因此它在类级别绑定之前进行调度)并使其return "break"取消所有后续绑定:

def next_marked(self, skip=False):
    ...
    return "break"

self.text.bind('<Control-n>', self.next_marked)

另请注意,当用作bind的回调时,第一个参数(在self之后),即您的skip,将始终为Event