【问题标题】:Why Text cursor coordinates are not updated correctly?为什么文本光标坐标没有正确更新?
【发布时间】:2014-12-17 21:18:03
【问题描述】:

为了为我的文本编辑器创建一个简单的行列计数器,我决定简单地使用tkinter.Text 小部件的index 函数。事实上,index 函数返回一个字符串,表示作为参数传递给它的坐标的行和列。

具体来说,我使用cursor_pos = text.index(tkinter.INSERT) 来获取光标的索引,因为,来自effbot 网站tkinter.INSERT

tkinter.INSERT 对应插入光标。

问题是tkinter.INSERT 似乎给了我最后一个光标位置,直到我用箭头移动光标(例如)。

这是处理行数和列数的函数:

def on_key_pressed(self, event=None):
    """Docs """
    if self.tpane is not None:
        print(self.lines, self.columns)

        self.tpane.update()
        cursor_pos = self.tpane._tabs[self.tpane.selected()].text.index(tkinter.INSERT)
        self.lines = int(cursor_pos.split('.')[0])
        self.columns = int(cursor_pos.split('.')[1])
        print(self.lines, self.columns)
        self.line_c.config(text='Lines: ' + str(self.lines))
        self.col_c.config(text='Columns: ' + str(self.columns))

        self.update()

我不知道你是否能理解这种情况......当我第一次在编辑器上输入一个字母时,self.columns 变量不会更新为 1(仍然是 0),直到我写下第二个字母,它在哪里更新为 1,依此类推。但是有一个技巧可以在不写新信的情况下使其更新。写完第一个字母后,如果我用箭头移动光标,它会将 self.columns 更新为实际 1。

另一个问题是当我尝试删除现有字符时。例如,如果我有 3 个字符(假设我有 self.columns 到 3),并且我按 deleteself.columns 莫名其妙地更新为 4,如果我尝试删除另一个字符,此时,它更新到 3。

on_key_pressed 事件处理程序中的self.lines 也存在此问题。我不确定这是否应该发生,如果是,那么我错过了一些东西......

【问题讨论】:

    标签: python-3.x text tkinter


    【解决方案1】:

    发生这种情况是因为您的自定义绑定在内置绑定之前触发,而实际修改小部件并更改光标位置的是内置绑定。

    您可以通过使用绑定标签来更改顺序。有关更多信息,请参阅此问题:Basic query regarding bindtags in tkinter

    有关如何更改绑定标签的示例,请参阅此答案:https://stackoverflow.com/a/3513906/7432

    如果不想处理绑定标签,可以绑定到<KeyRelease>。内置绑定发生在 press 键上,因此 release 绑定将始终在小部件更新后触发。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-20
      • 2016-11-10
      • 1970-01-01
      相关资源
      最近更新 更多