无法移动文本';插入';带有标记集小部件函数的索引(Python和Tkinter)

无法移动文本';插入';带有标记集小部件函数的索引(Python和Tkinter),python,text,tkinter,Python,Text,Tkinter,我一直试图强制“插入”标记移到文本字段的开头,而不管用户单击该字段的位置。虽然我已经发现,但它在我的代码中似乎不起作用。光标/插入只停留在我单击的索引处(注意:函数的其余部分工作正常)。作为最后一个想法,我尝试了“return'break'”,以防运行一些进一步的函数“恢复”光标位置,但这没有什么区别。我正在使用Python 3.4和Tkinter 8+。谢谢 ... n = ttk.Notebook(p) n1 = Text(n,width=60,height=15); ... def Ent

我一直试图强制“插入”标记移到文本字段的开头,而不管用户单击该字段的位置。虽然我已经发现,但它在我的代码中似乎不起作用。光标/插入只停留在我单击的索引处(注意:函数的其余部分工作正常)。作为最后一个想法,我尝试了“return'break'”,以防运行一些进一步的函数“恢复”光标位置,但这没有什么区别。我正在使用Python 3.4和Tkinter 8+。谢谢

...
n = ttk.Notebook(p)
n1 = Text(n,width=60,height=15);
...
def EnterStatement(e):
    i=n1.index('current').split('.')
    n1.tag_remove('NewStatement', i[0]+'.0', i[0]+'.0 lineend')
    n1.replace(i[0]+'.16', i[0]+'.46', ' '*30,'flex')
    #the following doesn't work... why?!
    n1.mark_set('insert', i[0]+'.16')
...
n1.tag_bind("NewStatement",'<1>', EnterStatement)
。。。
n=ttk.笔记本电脑(p)
n1=文本(n,宽度=60,高度=15);
...
声明(e):
i=n1.索引(“当前”).拆分(“.”)
n1.tag_remove('NewStatement',i[0]+'.0',i[0]+'.0 lineend'))
n1.替换(i[0]+'.16',i[0]+'.46',''*30,'flex')
#以下内容不起作用。。。为什么?
n1.mark_集('insert',i[0]+'.16')
...
n1.标记绑定(“新闻声明”、“声明、声明”)

我认为您应该将文本绑定到
事件,而不是
。在这个简单的测试示例中,绑定到
不会移动鼠标光标。但是,如果绑定到
,则每次单击鼠标光标都会移动到开头

from tkinter import *


root = Tk()
text = Text(root)
text.insert(INSERT, "Some example text.\n Some second line of example text")

def onclick(event):
    #print(event)
    event.widget.mark_set(INSERT, '1.0')

text.bind('<ButtonRelease-1>', onclick)
#text.bind('<Button-1>', onclick)

text.pack()


root.mainloop()
从tkinter导入*
root=Tk()
text=文本(根)
插入(插入“一些示例文本。\n示例文本的第二行”)
def onclick(事件):
#打印(事件)
event.widget.mark_集(插入'1.0')
text.bind(“”,onclick)
#text.bind(“”,onclick)
text.pack()
root.mainloop()

我猜原因是Tkinter在执行绑定到
后将光标设置在单击位置,而绑定到
时则不是这样。希望这有帮助。

问题是默认行为是将光标移动到发生单击的位置。绑定不会覆盖默认行为,因此代码会移动它,然后默认行为会再次移动它。如果搜索“绑定标签”和/或“绑定标签”,可以找到对此的更深入解释

要防止发生默认行为,必须从函数中返回字符串
“break”
,这将停止进一步处理事件:

def EnterStatement(e):
    ...
    #the following doesn't work... why?!
    n1.mark_set('insert', i[0]+'.16')
    return "break"

我在其他帖子上看到了你关于这一主题的对话,这证明对我来说非常有用,可以凌驾于事件之上,正如问题中提到的,我确实在这个主题上发生了这种情况(也是由于你以前的帖子),但由于某种原因,在这种情况下,它并不能解决我的问题;然而,另一篇关于ButtonRelease的帖子确实如此。我无法解释为什么一个有效,而另一个无效,因为我觉得两者都很合理,但经过几次测试后,行为就清楚了;虽然我很好奇为什么与“return'break'”结合使用似乎不起作用,但它确实起了作用。