Python 如何制作定制容器?

Python 如何制作定制容器?,python,enaml,Python,Enaml,我想制作一个标题与横幅示例中类似的可重用容器。 (因此它就像一个自定义的GroupBox)。所以我添加到类中的每个元素都应该 可以添加到类子容器中,而不是添加到其自身。请参阅下面的代码,我已标记 我只想写子元素的位置 from enaml.widgets.api import * from enaml.layout.api import * from enaml.styling import * enamldef BannerSheet(StyleSheet): Style:

我想制作一个标题与横幅示例中类似的可重用容器。 (因此它就像一个自定义的GroupBox)。所以我添加到类中的每个元素都应该 可以添加到类子容器中,而不是添加到其自身。请参阅下面的代码,我已标记 我只想写子元素的位置

from enaml.widgets.api import *
from enaml.layout.api import *
from enaml.styling import *

enamldef BannerSheet(StyleSheet):
    Style:
        element = 'Label'
        style_class = 'banner'
        Setter:
            field = 'background'
            value = ('lineargradient(x1: 0, y1:0, x2:0, y2:1, '
                        'stop: 0 #222222, stop: 0.5 #1A1A1A, stop: 1 #111111)')
        Setter:
            field = 'color'
            value = '#FFFFEF'
        Setter:
            field = 'padding'
            value = '5px'
        Setter:
            field = 'font'
            value = '18pt Verdana'

enamldef Banner(Container):
    BannerSheet:
        pass
    padding = 0
    alias title : lbl.text
    constraints = [lbl.left == left, 
                   lbl.right == right, 
                   con.top == lbl.bottom,
                   con.bottom<=bottom]
    Label: lbl:
        name = 'abd'   
        style_class = 'banner'

    Container: con:
        pass


enamldef DemoContainer(Container):
    padding = 0
    Banner: b:
        title = 'Bar'
        #i want children here to be put into the banner.con container.
        #so e.g.
        Label:
             text = 'This should be below the title label"
从enaml.widgets.api导入*
从enaml.layout.api导入*
从enaml.styleing导入*
Enmaldef横幅表(样式表):
风格:
元素='Label'
style_class='banner'
塞特:
字段='背景'
值=('lineargradient(x1:0,y1:0,x2:0,y2:1,'
‘停止:0#222222,停止:0.5#1A1A1A,停止:1#111111)’
塞特:
字段='color'
值='#FFFFEF'
塞特:
字段='填充'
值='5px'
塞特:
字段='font'
值='18pt Verdana'
搪瓷横幅(容器):
横幅纸:
通过
填充=0
别名标题:lbl.text
约束=[lbl.left==left,
lbl.right==右,
con.top==lbl.bottom,

con.bottomEnaml不允许您使用声明性语法(您可以使用Include和过程代码)委托小部件在层次结构中的位置。您最简单的选择是在横幅上使用包含小部件的子容器。如下所示:

from enaml.widgets.api import *


enamldef BannerContainer(Container):
    alias text: label.text
    Label: label:
        pass


enamldef Main(Window):
    Container:
        BannerContainer:
            text = 'First Banner'
            Container:
                padding = 0
                Field: pass
                Field: pass
                Field: pass
        BannerContainer:
            text = 'Second Banner'
            Container:
                padding = 0
                PushButton: pass
                PushButton: pass
                PushButton: pass


或者,您可以将container子类化并重新实现layout_constraints方法,以便为布局目的执行任何操作(请参见TaskDialog实现中的示例),或者使用模板和每个循环的编译时来展开子小部件(请参见高级模板示例)。

是否可以继续展开“这不管用"并且解释一下当它工作时你会期望什么?另外,你说你想覆盖
add\u child
,但是在代码中只有
child\u added
被覆盖。这是一个错误吗?你是对的,child\u add是错误的方法。但是据我所知,没有add\u child。有一个insert\u children方法,但是调用它会使程序崩溃解释者。我现在更困惑了。请解释更多关于您使用粘贴的代码时预期会发生什么以及实际发生的情况。正如我所写的,我的代码可能是错误的。因此,我将尝试更清楚地解释我想要什么。在Enmal的样式示例中有一个很好的横幅示例。我想做一个可重用类/Enmaldef,which有一个title属性,像一个简单的容器一样接受child。你能把它添加到原始问题中,添加一个你想如何调用/使用你的类的例子,并添加一个指向你提到的例子的链接吗?