【问题标题】:Non-hacky solution for runtime created traits can't be displayed in View运行时创建的特征的非 hacky 解决方案无法在视图中显示
【发布时间】:2015-10-25 02:51:45
【问题描述】:

我反复发现自己处于这种情况,

class MainDisplay(HasTraits):
    a=Instance(A,())    
    def __init__(self):
        self.a=A()
    traits_view=View(...)

class A(HasTraits):
    i=Int()
    j=Int()
    k=Int()
    def __init__(self):
        i,j,k=something
    a_display=Group('i','j','k')

问题:我想在我的主显示器中显示 a.i,a.j,a.k。

约束:

(1) i,j,k 绝对必须是 A 而不是 MainDisplay 的成员。将它们包含在 MainDisplay 中只是没有意义,如果我对每个特征都这样做,MainDisplay 会变得过于混乱。

(2) MainDisplay 不能继承 A 类。如果这样做,我可以在 traits_view 中执行“Include('a_display')”。这是从 MainDisplay 划分一些代码的好技巧,但在我的情况下它不起作用。

(3) MainDisplay 不能简单地复制 A 中的特征,然后同步它们。例如 MainDisplay.dummy_i=Int(),然后在稍后的 init 中,self.sync_traits('dummy_i',self.a,'i',mutual=True)。最后在 MainDisplay.traits_view 中使用“dummy_i”。这同样有效,但 MainDisplay 类再次变得如此混乱!此外,每次我想更改 GUI(或特征)时,我都有两个地方要编辑,这会减慢开发速度。

我是 GUI 新手,但我觉得无法在运行时创建变量是一个奇怪而尴尬的限制。我的印象是,看起来要取代traitsUI的Enaml也有这个限制。

我的主要兴趣是展示 Mayavi 创建的 3D 几何图形并与之交互。 PyQt可能没有这个限制吗?

【问题讨论】:

    标签: python-2.7 pyqt enthought mayavi traitsui


    【解决方案1】:

    在 MainDisplay 的视图中,您可以引用 Item("object.a.i") 等,其中 object 是您输入的字面意思(不是占位符)。这在 TraitsUI 文档的“高级视图概念”部分Multi-Object Views 中有描述。

    【讨论】:

    • 令人着迷。谢谢您的帮助。我确信在某些情况下我可以利用它,但我还没有完全摆脱困境。例如,如果 a.i 实际上是一个范围特征,其高低也由 a 上的 int 特征给出,比如 a.ceil_i,a.floor_i,那么 MainDisplay 会抱怨它缺少 ceil_i, floor_i
    • 问题 2:如果您在成员的一组特征上而不是单独尝试每个特征,则此技巧将不起作用。例如项目('object.a.a_group')。我的猜测是,如果我从不调用 a.configure_traits() ,那么 a_group 就永远不存在。
    • 不确定您的范围示例。第二,要在视图中显示视图,请使用 Instance(...)
    • Johnathan,我不太明白这里如何使用Instance。我已经尝试了所有我能想到的方法。也许我有一个错字。你能说得更直白一点吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-08
    • 1970-01-01
    相关资源
    最近更新 更多