flexforpython:如何在app上下文之外获取PyComponent实例(watchdog EventHandler)

2024-09-30 12:35:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我目前正在潜入Flexx为我的Python程序制作UI。我开始掌握窍门了,但我遇到了一个问题。你知道吗

我需要能够从^{}范围之外调用^{}的方法。我知道app.cls给出了用于实例化应用程序的类,但它不是实际的实例,所以我不能执行类似app.cls.my_method(...)的操作。你知道吗

有没有办法只知道App实例就可以在app包装器中获取组件的实例?你知道吗

谢谢!你知道吗

编辑:查看源代码后,我找到了大多数未记录的AppManagerSession定义,并可以通过以下方式获得对组件实例的引用:

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

但是如果我从^{}库实例化的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操作,它改变了一个属性。我怀疑一个问题,看门狗处理程序运行在不同的线程上,但我看不到要更改什么。。。你知道吗


Tags: 实例inpyloopeventappgetlib
1条回答
网友
1楼 · 发布于 2024-09-30 12:35:29

正如所怀疑的,问题可能来自这样一个事实:FileSystemEventHandler运行在不同于flex循环的线程上。感谢作者almarklein关于解决这个问题的help。你知道吗

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

root = app.launch('app')

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

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

希望有一天这能帮上忙!你知道吗

相关问题 更多 >

    热门问题