在tkinter条目的click事件中更改光标位置

时间:2018-05-29 06:46:57

标签: python python-3.x events tkinter tkinter-entry

我正在尝试在单击条目内部时更改鼠标指针位置。我在进入时使用icursor方法,但它没有用。

我希望指针移动到位置0,当我在条目中单击时。

from tkinter import *
from tkinter import ttk


def on_click(event):
    event.widget.icursor(0)  # this will not move cursor to the first place

root = Tk()

e = ttk.Entry(root)
e.pack()

e.insert(0, "Hello World")

e.bind("<1>", on_click)

root.mainloop()

所以当我在条目中单击内部时,我希望mose指针移动到第一个(icursor(0)),但它不起作用。

actullay如果我得到鼠标指针位置它会工作python会看到它在0位置但指针本身不在0位置。

print(e.index(INSERT))

任何人都知道如何解决这个问题?

2 个答案:

答案 0 :(得分:0)

这是由于在Tkinter中处理事件的顺序。

有关详细说明,请阅读this answer,但短期事件按bindtags的顺序处理。要查看这些是什么,print(e.bindtags())打印

('.!entry', 'TEntry', '.', 'all')

此处.!entry是当前窗口小部件eTEntry是ttk Entry类,.是窗口小部件的Toplevel或Tk实例,all是可以绑定到所有小部件的标记。

现在,当您执行e.bind("<1>", on_click)时,将on_click函数绑定到窗口小部件e。单击窗口小部件时,首先调用on_click函数,将光标置于开始处,然后调用ttk Entry框的默认事件。来自ttk Entry的默认事件继承自标准Tkinter条目,根据the manual,该条目是

  

单击鼠标按钮1将插入光标定位在鼠标光标下方的字符之前,将输入焦点设置为此窗口小部件,并清除窗口小部件中的任何选择。使用鼠标按钮拖动1在插入光标和鼠标下的字符之间划出选择。

因此,即使 将光标置于位置0,鼠标按钮的默认Entry事件也是将光标的位置更改为您单击的位置。因为这是处理事件的顺序,所以您永远不会在位置0看到光标。

但是,您可以在处理完默认事件后添加事件。为此,您可以在类之后添加一个bindtag并绑定到:

e.bindtags(((str(e)), "TEntry", "post-click", ".", "all"))
e.bind_class("post-click", "<1>", on_click)

这样您就可以将回调绑定到在上面引用中提到的所有操作之后处理的标记,因此您将看到光标位于位置0。

请注意,这会影响所有点击,包括双击,三击,控制点击,...
(顺便说一句,不要拖动,因为它以<ButtonRelease-1>事件结束。)

答案 1 :(得分:0)

替代解决方案

def on_click(event):
    root.after_idle(event.widget.icursor, 0)

Source