Flexx для Python: как получить экземпляр PyComponent вне контекста приложения (сторожевой таймер EventHandler) - PullRequest
0 голосов
/ 06 марта 2019

В настоящее время я погружаюсь в Flexx для создания пользовательского интерфейса для моей программы Python.Я начинаю понимать это, но сталкиваюсь с проблемой.

Мне нужно иметь возможность вызывать метод PyComponent вне области действияApp.Я понимаю, что app.cls дает класс, который использовался для создания экземпляра приложения, но это не фактический экземпляр, поэтому я не могу сделать что-то вроде app.cls.my_method(...).

Есть ли способ получить экземпляркомпонента внутри оболочки приложения, только зная экземпляр App?

Спасибо!

РЕДАКТИРОВАТЬ: После просмотра источника я обнаружил, в основном, без документов AppManager и Session определений и может получить ссылку на экземпляр компонента с помощью:

from flexx.app import manager
app_instance = manager.get_connections('MyAppName')[0].app

Но если я вызову один из его методов из watchdog.events.FileSystemEventHandler, экземпляром которого является watchdog*Библиотека 1030 *, я получаю следующую трассировку:

  File "myfile.py", line 37, in on_created
    manager.get_connections('MyAppName')[0].app.update_verbose(False)
  File "lib\site-packages\flexx\event\_action.py", line 150, in __call__
    if loop.can_mutate(ob):
  File "lib\site-packages\flexx\event\_loop.py", line 85, in can_mutate
    active = self.get_active_component()
  File "lib\site-packages\flexx\event\_loop.py", line 103, in get_active_component
    if len(self._local._active_components) > 0:
AttributeError: '_thread._local' object has no attribute '_active_components'

Обратите внимание, что update_verbose - это действие Flexx, которое изменяет свойство.Я подозреваю проблему, когда сторожевой обработчик работает в другом потоке, но я не вижу, что изменить ...

1 Ответ

0 голосов
/ 07 марта 2019

Как и предполагалось, проблема, вероятно, связана с тем, что FileSystemEventHandler работает в потоке, отличном от цикла Flexx.Спасибо автору almarklein за его помощь в решении этой проблемы.

Решением было получить ссылку на корневой объект не с помощью сложного метода, описанного выше в моем вопросе, а скорее свозвращаемое значение из вызова launch:

root = app.launch('app')

Затем внутри обработчика событий скажите главному циклу вызвать мой метод (украшенный @flx.action):

flx.loop.call_soon(root.my_action, 'argument`)

Надеюсь, это поможет кому-нибудь когда-нибудь!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...