изменить положение курсора в событии клика на записи tkinter - PullRequest
0 голосов
/ 29 мая 2018

Я пытаюсь изменить местоположение указателя мыши, когда щелкаю внутри записи.Я использую метод 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))

у кого-нибудь есть идеи, какисправить это?

Ответы [ 2 ]

0 голосов
/ 29 мая 2018

Альтернативный раствор

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

Источник

0 голосов
/ 29 мая 2018

Это связано с порядком, в котором события обрабатываются в Tkinter.

Для подробного объяснения прочитайте этот ответ , но в коротких событиях они обрабатываются в порядке bindtags.Чтобы увидеть, что это такое, вы можете print(e.bindtags()), который печатает

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

Здесь .!entry - текущий виджет e, TEntry - класс ttk Entry, . - это Toplevel илиTk instance и all - это тег, который можно привязать к тому, что есть у всех виджетов.

Теперь, когда вы делаете e.bind("<1>", on_click), вы связываете функцию on_click с виджетом e.Когда вы щелкаете виджет, сначала вызывается ваша функция on_click, которая помещает курсор в начало, а затем вызывается событие по умолчанию для поля ввода ttk.Событие по умолчанию от ttk Entry наследуется от стандартного Tkinter Entry, который, согласно руководству , равен

Нажатие кнопки мыши 1 устанавливает курсор вставки непосредственно перед символом подкурсор мыши, устанавливает фокус ввода для этого виджета и очищает любой выбор в виджете.При перетаскивании кнопкой мыши 1 происходит выделение между курсором вставки и символом под мышью.

Таким образом, даже если вы сделали , поместите курсор в положение 0, вход по умолчаниюСобытием для кнопки мыши является изменение местоположения курсора в том месте, где вы щелкнули.Поскольку это порядок, в котором обрабатываются события, вы никогда не увидите курсор в местоположении 0.

Однако вы можете добавить событие после события по умолчанию, которое было обработано.Для этого вы можете добавить bindtag после класса и привязать к нему:

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

Таким образом, вы привязываете свой обратный вызов к тегу, который обрабатывается после всех тех действий, упомянутых в приведенной выше цитате, так что вы будетечтобы курсор находился в позиции 0.

Имейте в виду, что это влияет на все щелчки, включая двойной щелчок, тройной щелчок, нажатие клавиши управления, ...
(кстати, не перетаскивать, так каккоторый заканчивается <ButtonRelease-1> событием).

...