Как Вы проверяете, фокусируется ли виджет в Tkinter?

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

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

Так мой совет: не используйте интерфейсы, пока Вам действительно не будут нужны они. (С Visual Studio можно извлечь интерфейс из существующего класса через 2 секунды - так не спешите.)

Однако когда необходимо создать интерфейс?

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

И это работает: o)

Одно исключение: когда я, когда к фиктивным объектам, интерфейс намного более легче использовать. Таким образом, я часто создаю интерфейс только для этого.

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

С уважением, Sylvain.

12
задан Cœur 31 August 2017 в 18:53
поделиться

1 ответ

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

import tkinter as tk

root = tk.Tk()
e1 = tk.Entry(root)
e2 = tk.Entry(root)
e1.pack()
e2.pack()

def handleReturn(event):
    print("return: event.widget is",event.widget)
    print("focus is:", root.focus_get())

e1.bind("<Return>", handleReturn)

Обратите внимание, что обработчик вызывается только в том случае, если первая запись имеет фокус, когда вы нажимаете return.

Если вам действительно нужна глобальная привязка и нужно знать, какой виджет имеет фокус, используйте метод focus_get () для корневой объект. В следующем примере выполняется привязка "." (главный верхний уровень), так что он срабатывает независимо от того, что имеет фокус:

import tkinter as tk

root = tk.Tk()
e1 = tk.Entry(root)
e2 = tk.Entry(root)
e1.pack()
e2.pack()

def handleReturn(event):
    print("return: event.widget is",event.widget)
    print("focus is:",root.focus_get())

root.bind("<Return>", handleReturn)

Обратите внимание на разницу между ними: в первом примере обработчик будет вызываться только тогда, когда вы нажмете return в виджете первой записи. Нет необходимости проверять, какой виджет находится в фокусе. Во втором примере обработчик будет вызываться независимо от того, какой виджет имеет фокус.

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

20
ответ дан 2 December 2019 в 18:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: