Это связано с порядком, в котором события обрабатываются в 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>
событием).