Как я могу установить фокус на виджет (это не запись), нажав на него? - PullRequest
0 голосов
/ 22 октября 2018

Причина, по которой мне нужно это сделать, заключается в том, что мне нужно изменить текст метки без использования записей;Вместо этого я хочу использовать события.

Я пробовал это:

import tkinter as tk

root = tk.Tk()
root.bind("<Button-1>", lambda _: root.focus())

l = tk.Label(root, width=50, height=50, bg="white")
l.bind("<Button-1>", lambda _: l.focus())
l.bind("1", lambda _: l.config(bg="yellow"))
l.bind("2", lambda _: l.config(bg="white"))
l.pack()

root.mainloop()

Когда я запустил программу, я ожидал, что смогу изменить цвет метки l на желтыйщелкнув по нему (который, как я думал, установил фокус на нем), затем нажав 1, и изменив его обратно на белый, нажав 2;при условии, что я не щелкнул за пределами метки и установил фокус на корневой виджет (где ключи 1 и 2 не были привязаны ни к какому обратному вызову).

Я знаю, что вы можете привязать ключи к обратным вызовам(проверил это), и я также знаю, что можно установить фокус на виджеты, которые не являются записями (это тоже проверено), но, похоже, это не работает.

Кто-нибудь может мне помочь?

1 Ответ

0 голосов
/ 22 октября 2018

Проблема в том, что у вас есть две привязки для нажатия кнопки: одна на самом виджете метки и одна в корневом окне.Из-за способа обработки событий привязка в корневом окне срабатывает после события на метке.Это означает, что любой фокус, который вы установили на привязку метки, будет отменен с привязкой в ​​корневом окне.

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

root.bind("<Button-1>", lambda event: event.widget.focus_set())

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

def callback(event):
    l.focus()
    return "break"
l.bind("<Button-1>", callback)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...