Следующий код кажется немного нелогичным (вы удаляете что-то, определенное позже в коде), но работает:
import flet as ft
def main(page: ft.Page):
def on_keyboard(e: ft.KeyboardEvent):
page.remove(cntnr)
page.update()
page.on_keyboard_event = on_keyboard
cntnr = ft.Container(width=100, height=100, bgcolor=ft.colors.RED)
page.add(cntnr)
if __name__ == "__main__":
ft.app(target=main)
Если я сначала определяю и добавляю контейнер, а затем добавляю обратный вызов клавиатуры, чтобы сделать что-то с этим определенным контейнером позже, обратный вызов клавиатуры внезапно не работает (нажатия клавиш игнорируются, и я просто слышу звуковые сигналы при нажатии клавиш):
import flet as ft
def main(page: ft.Page):
cntnr = ft.Container(width=10, height=10, bgcolor=ft.colors.RED)
page.add(cntnr)
def on_keyboard(e: ft.KeyboardEvent):
page.remove(cntnr)
page.update()
page.on_keyboard_event = on_keyboard
if __name__ == "__main__":
ft.app(target=main)
Почему это так? Я что-то упустил в документации Flet?
Пока это тестировалось только на Mac, но я думаю, что это можно воспроизвести и на Linux, и на Windows. Это ошибка?






На данный момент Flet — это небольшой проект с качественной документацией. Я не участвую в разработке Flet, но проверка реализации (page.py и page.dart ) показывает, что это не ошибка, а ограничение. (Вы можете опубликовать проблему здесь, чтобы получить точную обратную связь.)
В вашем первом коде вызов page.add() в клиенте Python инициировал вызов метода _PageControlState.build() на сервере Dart. Поскольку вы вызвали page.add() после настройки обработчика клавиатуры, метод build() настроил обработчик аппаратной клавиатуры. Но во втором коде метод build() этого не сделал, поскольку обработчик клавиатуры не был настроен во время его вызова.
Чтобы исправить это, вы можете вызвать page.update() вот так.
...
def main(page: ft.Page):
...
page.on_keyboard_event = on_keyboard
page.update()
...