如何在Enaml网格容器中设置固定的宽度/高度

时间:2020-06-23 07:15:38

标签: user-interface enaml

我刚刚遇到过Enaml用于python GUI编程。我之前只使用PySide2做一个简单的计算器GUI样机,所以我对Qt和Enaml都是陌生的。原谅我的无知;)

基本上,我希望有一个由Field或其他元素组成的规则网格,并具有固定的正方形大小。在研究了一些示例之后,我想到了:

from enaml.layout.api import grid
from enaml.widgets.api import Window, Container, Field


enamldef DigitField(Field):
    # The fields will contain a single digit for testing.
    mask = 'D'
    max_length = 1
    # These don't have any effect?
    hug_width = 'required'
    hug_height = 'required'

enamldef Main(Window):
    Container:
        constraints = [
            grid(
                [f11, f12],
                [f21, f22],
            ),
        ]

        DigitField: f11:
            text = '1'
        DigitField: f12:
            text = '1'

        DigitField: f21:
            text = '1'
        DigitField: f22:
            text = '1'

但是hug_widthhug_height似乎不起作用。然后,我尝试在约束内部手动设置f11.width == 50,但是kiwisolver向我大喊无法解决的约束。我尝试了从示例中可以找到的有关设置宽度值的所有内容,但是适用于vbox的东西似乎无法与grid一起玩。

有什么想法吗?另外,如果有人拥有使用Enaml制作的完整应用程序,并且该应用程序是开源的,那么我想看看。这些文档还可以,但是一些更高级的示例会很棒。

1 个答案:

答案 0 :(得分:0)

好吧,我想我已经找到一种使它起作用的方法。 hug_width将宽度限制为字段内容加上一些默认的填充(来自Qt工具包)。相反,使用resist_width = 'ignore'我可以完全删除填充。可以使用手动或自动方法生成网格。

手动方法:

from enaml.layout.api import grid
from enaml.widgets.api import Window, Container, Field


enamldef DigitField(Field):
    # The fields will contain a single digit for testing.
    mask = 'D'
    max_length = 1
    resist_width = 'ignore'
    resist_height = 'ignore'

enamldef Main(Window):
    Container:
        constraints = [
            grid(
                [f11, f12],
                [f21, f22],
            ),
            f11.width == f11.height,
            f12.width == f12.height,
        ]

        DigitField: f11:
            text = '1'
        DigitField: f12:
            text = '1'

        DigitField: f21:
            text = '1'
        DigitField: f22:
            text = '1'

这太可湿了,而且规模惊人,所以我们有了...

工厂方法:

from itertools import zip_longest

from enaml.core.api import Include
from enaml.layout.api import align, grid, factory
from enaml.widgets.api import Window, Container, Field


enamldef DigitField(Field):
    mask = 'D'
    max_length = 1
    resist_width = 'ignore'
    resist_height = 'ignore'

def generate_grid(container, num_cols):
    rows = []
    widgets = container.visible_widgets()
    row_iters = (iter(widgets),) * num_cols
    rows = list(zip_longest(*row_iters))
    return [grid(*rows), align('width', *widgets)]

enamldef Main(Window):
    Container:
        Container:
            constraints << [factory(generate_grid, 3)]
            Include:
                objects << [DigitField(text=str(1)) for i in range(9)]

我嵌套了Container,因为主窗口中可能还会有其他东西,并且Enaml窗口需要一个主Container