首页 文章

Tkinter神秘的绑定问题

提问于
浏览
2

我有一个绑定键组合:

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 回答

  • 4

    问题似乎是 <Control-n> 已经绑定到 Text 类的"go to next line",如果有多个绑定,they will all be executed, in a specific order

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

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

    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 .

相关问题