【问题标题】:change cursor location in click event on tkinter entry在 tkinter 条目的单击事件中更改光标位置
【发布时间】:2018-05-29 06:46:57
【问题描述】:

我正在尝试在单击条目内部时更改鼠标指针位置。我在输入时使用 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()

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

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

print(e.index(INSERT))

有人知道如何解决这个问题吗?

【问题讨论】:

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


    【解决方案1】:

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

    详细解释请阅读this answer,但简而言之,事件按bindtags 的顺序处理。要查看这些是什么,您可以print(e.bindtags()) 打印出来

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

    这里.!entry是当前小部件eTEntry是ttk Entry类,.是小部件的Toplevel或Tk实例,all是一个可以绑定到所有小部件的标签.

    现在,当您执行e.bind("&lt;1&gt;", on_click) 时,您将on_click 函数绑定到小部件e。当您单击小部件时,首先会调用 on_click 函数,将光标置于开头,然后调用 ttk 输入框的默认事件。 ttk 条目的默认事件继承自标准 Tkinter 条目,根据the manual,它是

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

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

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

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

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

    请记住,这会影响所有点击,包括双击、三次点击、控制点击……
    (顺便说一句,不要拖,因为它以 &lt;ButtonRelease-1&gt; 事件结束)。

    【讨论】:

      【解决方案2】:

      替代解决方案

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

      Source

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-01-17
        • 2012-03-23
        • 1970-01-01
        • 2015-07-03
        • 1970-01-01
        • 2020-09-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多