Как любая техника программирования, которые добавляют гибкость к Вашей системе, интерфейсы также, добавляет некоторый уровень сложности. Они являются часто великими, и Вы могли использовать его везде (можно создать интерфейс для всех классов) - но выполнение так, Вы создали бы более сложную систему, которую будет более трудно обслужить.
существует компромисс здесь, как обычно: гибкость по пригодности для обслуживания. Какой более важен? Нет никаких ответов - это зависит от проекта. Но просто помните, что каждый программные обеспечения должны будут сохраняться...
Так мой совет: не используйте интерфейсы, пока Вам действительно не будут нужны они. (С Visual Studio можно извлечь интерфейс из существующего класса через 2 секунды - так не спешите.)
Однако когда необходимо создать интерфейс?
я делаю это, когда я осуществляю рефакторинг метод что внезапно потребность обработать два или больше подобных класса. Я тогда создаю интерфейс, присваиваю этот интерфейс двум (или больше) подобные классы, и я изменяюсь, тип параметра метода (замените тип класса интерфейсным типом).
И это работает: o)
Одно исключение: когда я, когда к фиктивным объектам, интерфейс намного более легче использовать. Таким образом, я часто создаю интерфейс только для этого.
пз: когда я пишу "интерфейс", я имею в виду: "интерфейс любого базового класса", включая чистые интерфейсные классы. Обратите внимание, что абстрактные классы являются часто лучшей ставкой тогда чистые интерфейсы, так как можно добавить логику к ним.
С уважением, Sylvain.
Если вы хотите что-то делать, когда пользователь нажимает клавишу ввода, только если фокус находится на виджете ввода, просто добавьте привязка к виджету входа. Он сработает только в том случае, если этот виджет находится в фокусе. Например:
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 в определенном виджете, используйте первое. Если вам нужна глобальная привязка, но в этой привязке выполняются разные действия в зависимости от того, что имеет или не имеет фокус, выполните второй пример.