【问题标题】:Tkinter mysterious binding issueTkinter 神秘绑定问题
【发布时间】:2016-12-16 02:17:11
【问题描述】:

我有一个绑定的组合键:

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

【问题讨论】:

  • 似乎 ctrl-n 已经绑定到 tkinter 文本字段中的“下一行”。有一些方法可以优先绑定...或者,使用不同的键。
  • 函数结束时的return False 是否有效?

标签: python python-2.7 tkinter


【解决方案1】:

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

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

因此,您可以或者为所有Text 小部件覆盖&lt;Control-n&gt; 的现有类级绑定:

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

【讨论】:

  • 非常感谢 tobias_k。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-06
  • 1970-01-01
相关资源
最近更新 更多