0

我目前正在研究Flexx,以便为我的 Python 程序制作 UI。我开始掌握它,但我遇到了一个问题。

我需要能够PyComponentApp. 我知道这app.cls给出了用于实例化应用程序的类,但它不是实际实例,所以我不能做类似app.cls.my_method(...).

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

谢谢!

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

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

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

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

4

1 回答 1

0

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

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

root = app.launch('app')

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

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

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

于 2019-03-07T14:13:01.753 回答