2016-08-09 43 views
2

我有一个绑定的组合键: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

+0

看起来好像ctrl-n已经绑定到tkinter文本框中的“下一行”。有一些方法可以优先考虑绑定......或者,使用不同的密钥。 –

+0

在你的函数工作结束时'返回False吗? –

回答

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

+0

谢谢你tobias_k。 – seanmus