Python 的 Flexx:如何在应用上下文之外获取 PyComponent 实例(watchdog EventHandler)

Flexx for Python: how to get PyComponent instance outside of the app context (watchdog EventHandler)

我目前正在研究 Flexx 为我的 Python 程序制作 UI。我开始掌握它的窍门,但我 运行 遇到了问题。

我需要能够调用 PyComponent's method from outside the scope of the App。我知道 app.cls 给出了用于实例化应用程序的 class,但它不是实际实例,所以我不能做类似 app.cls.my_method(...).

的事情

有没有办法在只知道 App 实例的情况下获取应用程序包装器中的组件实例?

谢谢!

编辑: 查看源代码后,我发现大部分未记录的 AppManagerSession 定义可以通过以下方式获得对组件实例的引用:

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

但是如果我从 watchdog 库实例化的 watchdog.events.FileSystemEventHandler 调用它的方法之一,我会得到以下回溯:

  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 动作,它改变了 属性。我怀疑看门狗处理程序 运行 在不同线程上的问题,但我看不到要更改的内容...

正如所怀疑的那样,问题可能来自于 FileSystemEventHandler 与 Flexx 循环在不同线程上的 运行。感谢作者 almarklein help 解决了这个问题。

解决方案是获取对根对象的引用,而不是使用我问题中上述的复杂方法,而是使用 launch 调用中的 return 值:

root = app.launch('app')

然后在事件处理程序中,告诉主循环调用我的方法(用 @flx.action 装饰):

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

希望有一天这对某人有所帮助!