python - Tkinter - 文本小部件的异常行为
问题描述
我试图"(),"
在单击按钮或键盘快捷键后插入Text
,然后将光标移动到括号中,如下所示(|),
。这是代码的相关部分。
def addParentheses(event = None):
key_text.focus_set()
key_text.insert('current', '(),')
pos = key_text.index('current')
col = int(pos.split('.')[0])
row = int(pos.split('.')[1])
key_text.mark_set('insert', "%d.%d" % (col,row-2))
仅当我的鼠标指针悬停在Text
小部件上时,此代码才能按预期工作。如果我的指针在 中的其他地方Frame
,它会插入"(),"
到行的开头而不是结尾。任何帮助,将不胜感激。
解决方案
我觉得可能有两个问题。首先,“当前”是指鼠标的位置,而不是插入光标。目前尚不清楚这是否是您真正打算使用的。当鼠标不直接在小部件上时,索引将指鼠标在离开小部件边界之前在小部件上的最后位置。
行为应该是,如果您将鼠标移到右侧的文本小部件之外,则文本将插入到靠近鼠标越过边缘的行尾。如果将鼠标移到左侧文本之外,文本将插入到最靠近鼠标越过边缘的行的开头。
其次,您没有正确计算行和列。您将列设置为索引的第一部分,将行设置为第二部分。你把它反过来了。“。”之前的第一部分。代表行号,“.”后面的第二部分 表示列号。
您需要像这样计算行和字符:
pos = key_text.index('current')
line = int(pos.split('.')[0])
char = int(pos.split('.')[1])
key_text.mark_set('insert', "%d.%d" % (line,char-2))
推荐阅读
- c# - 如何在构建每个测试后调用方法?C#, NUnit
- cordova - Phonegap / Cordova App HTML5 视频不会播放说明 GET file:///[..] net::ERR_REQUEST_RANGE_NOT_SATISFIABLE
- python - 将视频文件转换为 GIF
- c# - 如何检查ffmpeg何时完成视频片段?
- c# - Asp .NET Core 忽略来自不同表单的属性已发布
- ios - 将像素数据写入texture2d的某个mipmap级别
- java - 如何在 Java 中表示 wav 文件?
- css - HTML CSS 试图使固定侧导航栏响应
- docker - tensorflow:2.0.0- docker 容器无法访问 GPU
- python-3.x - OpenCV 视频编写器无法找到编解码器或“avc1”