为我的文本编辑器创建一个简单的行列计数器,我决定只使用index
小部件的tkinter.Text
函数。实际上,index
函数返回一个字符串,表示作为参数传递给它的坐标的行和列。
具体来说,我使用cursor_pos = text.index(tkinter.INSERT)
来获取光标的索引,因为来自tkinter.INSERT
的{{1}}网站:
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),并且我按delete
,self.columns
莫名其妙地更新为4
,如果我尝试删除另一个字符,此时,它会更新为3。
self.lines
事件处理程序中的on_key_pressed
也存在此问题。我不确定这是否应该发生,如果是,那我就错过了什么......
答案 0 :(得分:1)
这是因为您的自定义绑定在内置绑定之前触发,并且它是实际修改窗口小部件并更改光标位置的内置绑定。
您可以通过利用bindtags更改订单。有关详细信息,请参阅此问题:Basic query regarding bindtags in tkinter
有关如何更改bindtags的示例,请参阅以下答案:https://stackoverflow.com/a/3513906/7432
如果您不想处理bindtags,则可以绑定到<KeyRelease>
。内置绑定发生在按键按上,因此在更新小部件后,发布绑定将始终触发。