为何动态添加Traits后调用modal模式configure_traits()会崩溃?
动态添加Traits后调用
configure_traits(kind="modal")崩溃问题 关联GitHub Issue:traitsui#2064
测试代码
#! /usr/bin/env python # Minimal test case for demonstrating problem w/ dynamically # added Traits in modal call of `configure_traits()`. # # David Banas <capn.freako@gmail.com> # March 4, 2025 from traits.api import HasTraits, Int class Foo(HasTraits): Bar = Int(5) def __init__(self): super().__init__() self.add_trait("Blatz", Int(10)) if __name__ == "__main__": foo = Foo() # foo.configure_traits() # 此调用正常运行 foo.configure_traits(kind="modal") # 此调用会崩溃
报错信息
被注释的configure_traits()调用运行正常,但未注释的modal模式调用会崩溃,报错如下:
$ ./configure_traits_crash.py Traceback (most recent call last): File "C:\Users\dbanas\tmp\configure_traits_crash.py", line 21, in <module> foo.configure_traits(kind="modal") File "C:\Users\dbanas\.venv\pybert-dev\Lib\site-packages\traits\has_traits.py", line 2099, in configure_traits rc = toolkit().view_application( ^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\dbanas\.venv\pybert-dev\Lib\site-packages\traitsui\qt\toolkit.py", line 237, in view_application return view_application.view_application( ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\dbanas\.venv\pybert-dev\Lib\site-packages\traitsui\qt\view_application.py", line 92, in view_application return ViewApplication( ^^^^^^^^^^^^^^^^ File "C:\Users\dbanas\.venv\pybert-dev\Lib\site-packages\traitsui\qt\view_application.py", line 127, in __init__ self.ui = self.view.ui( ^^^^^^^^^^^^^ File "C:\Users\dbanas\.venv\pybert-dev\Lib\site-packages\traitsui\view.py", line 457, in ui ui.ui(parent, kind) File "C:\Users\dbanas\.venv\pybert-dev\Lib\site-packages\traitsui\ui.py", line 234, in ui self.rebuild(self, parent) File "C:\Users\dbanas\.venv\pybert-dev\Lib\site-packages\traitsui\qt\toolkit.py", line 176, in ui_modal ui_modal.ui_modal(ui, parent) File "C:\Users\dbanas\.venv\pybert-dev\Lib\site-packages\traitsui\qt\ui_modal.py", line 49, in ui_modal _ui_dialog(ui, parent, BaseDialog.MODAL) File "C:\Users\dbanas\.venv\pybert-dev\Lib\site-packages\traitsui\qt\ui_modal.py", line 67, in _ui_dialog BaseDialog.display_ui(ui, parent, style) File "C:\Users\dbanas\.venv\pybert-dev\Lib\site-packages\traitsui\qt\ui_base.py", line 294, in display_ui ui.owner.init(ui, parent, style) File "C:\Users\dbanas\.venv\pybert-dev\Lib\site-packages\traitsui\qt\ui_modal.py", line 183, in init self.add_contents(panel(ui), bbox) ^^^^^^^^^ File "C:\Users\dbanas\.venv\pybert-dev\Lib\site-packages\traitsui\qt\ui_panel.py", line 270, in panel panel = _GroupPanel(content[0], ui).control ^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\dbanas\.venv\pybert-dev\Lib\site-packages\traitsui\qt\ui_panel.py", line 621, in __init__ layout = self._add_items(content, inner) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\dbanas\.venv\pybert-dev\Lib\site-packages\traitsui\qt\ui_panel.py", line 855, in _add_items editor = factory_method( ^^^^^^^^^^^^^^^ File "C:\Users\dbanas\.venv\pybert-dev\Lib\site-packages\traitsui\editor_factory.py", line 117, in simple_editor return self.simple_editor_class( ^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\dbanas\.venv\pybert-dev\Lib\site-packages\traitsui\editor.py", line 540, in __init__ self.old_value = getattr(self.object, self.name) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ AttributeError: 'Foo' object has no attribute 'Blatz'
环境信息
- 操作系统:Windows 10
$ python --version Python 3.12.4 $ pip show Traits Name: traits Version: 7.0.2 {snip} $ pip show TraitsUI Name: traitsui Version: 8.0.0 {snip}
问题
默认调用configure_traits()可以处理动态添加的Traits,但modal模式调用却无法处理,这是为什么?
内容的提问来源于stack exchange,提问作者David Banas
相关产品推荐
相关产品推荐

