Во-первых, напоследок - я не слишком знаком с концепциями ООП, так что это может быть просто некая форма Python, о которой я не знаю.
В Kivy мы можем изменить поведение и внешний видвиджетов путем создания дочерних классов для виджетов, функции которых мы хотим изменить, например:
class MyWidget(Button):
def __init__(self, **kwargs):
super(MyWidget, self).__init__(**kwargs)
self.size_hint = None
self.size = 200, 100
Затем используйте MyWidget:
или <MyWidget>
для создания экземпляра виджета в kv .Это хорошо, если я хочу, чтобы мои виджеты были родительскими для корневого виджета, но бывают случаи, когда это не требуется, например, когда требуется временный Popup
.
. В этом случае я просто создаютипичный класс, который создается при запуске события.Вот так:
class Interface():
def __init__(self):
btn = Button()
btn.bind(on_press=self.some_callback)
self.popup = Popup(content=btn)
self.popup.open()
def some_callback(self, instance):
print('woo')
И это, по всей видимости, выглядит хорошо, но события виджета (on_press
здесь) не вызывают функции обратного вызова ???Функция bind()
будет вызывать обратный вызов для события, так как я буду уведомлен, если определение функции обратного вызова имеет неправильный синтаксис, но по какой-то причине содержимое обратного вызова не выполняется - только когда Interface()
наследуется от Widget()
класс (Interface(Widget): ...
).Из документов :
Взаимодействие виджетов строится поверх событий, которые происходят.Если свойство изменяется, виджет может реагировать на изменение в обратном вызове on_.Если ничего не изменится, ничего не будет сделано.
btn
- это виджет, это экземпляр Button()
, который сам является потомком Widget
, его метод вообще не связан счто может быть родительским классом Interface
, так почему же тогда обратный вызов полностью выполняется только тогда, когда Widget
является родительским классом Interface
?Что мне не хватает?