Tkinter (Python): как рассматривать измененный клик как просто клик - PullRequest
0 голосов
/ 29 июня 2018

Когда Tkinter обнаруживает измененное событие щелчка, такое как <Shift-Button-1>, <Control-Button-1> и т. Д., Есть ли способ «заглушить» клавишу-модификатор и обработать ее как просто <Button-1> вместо этого?

Единственный подход, который я могу придумать - который не работает для моего варианта использования - это создать привязки событий для различных модификаторов, а затем направить их всех на обратный вызов, который запускает неизмененное событие. Например.,

import Tkinter as tk
root = tk.Tk()
lst = tk.Listbox(root,selectmode=tk.EXTENDED)
[...geometry setup...]

def clickOnly(*args):
    lst.event_generate('<Button-1>')

lst.bind('<Shift-Button-1>',clickOnly)
lst.bind('<Control-Button-1>',clickOnly)
[...other related bindings...]

tk.mainloop()

Когда я запускаю этот код, нажатие клавиши shift и т. Д. Перехватывается обратным вызовом, но результаты поведения отличаются от того, что будет делать обычный щелчок. Например. Shift-click привязывается к элементу с индексом 0 и по-прежнему выбирает несколько элементов вместо только одного.

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

(Среда - Python 2.7.x, работающая в Windows 7/10.)

РЕДАКТИРОВАТЬ: Я пытаюсь сделать это так:

  1. Пользователь указывает и щелкает: поведение по умолчанию
  2. Точки пользователя и нажатия на клавишу Shift: Shift игнорируется, поведение по умолчанию для щелчка
  3. Точки пользователя и управляющие щелчки: управление игнорируется, поведение по умолчанию для щелчка
  4. Точки пользователя и alt-клики: Alt игнорируется, поведение по умолчанию для клика
  5. (вы поняли)

т.е. Есть ли способ заставить Tkinter игнорировать модификаторы?

1 Ответ

0 голосов
/ 30 июня 2018

Самое простое решение - создать явные привязки для выполнения именно того, что вам нужно, а затем предотвратить привязку по умолчанию. Вы можете сделать последнее, если ваша связанная функция возвращает строку "break".

Пример:

import Tkinter as tk
root = tk.Tk()
lst = tk.Listbox(root,selectmode=tk.EXTENDED)
lst.pack()
lst.insert("end", "one", "two", "three", "four", "five")

def clickOnly(event):
    index = '@%s,%s' % (event.x, event.y)
    event.widget.focus_set()
    event.widget.select_clear(0, "end")
    event.widget.select_set(index)
    event.widget.activate(index)
    event.widget.select_anchor(index)
    return "break"

lst.bind('<Any-ButtonPress-1>', clickOnly)

tk.mainloop()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...