首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Enaml网格容器中固定宽度/高度的设置

Enaml网格容器中固定宽度/高度的设置
EN

Stack Overflow用户
提问于 2020-06-23 07:15:38
回答 1查看 149关注 0票数 0

我刚刚遇到Enaml进行python编程。我以前只使用过一次PySide2作为一个简单的计算器GUI模型,所以我对Qt和Enaml都很陌生。原谅我的无知;)

本质上,我希望有一个规则的网格的Field或其他元素,与固定的,平方大小。在回顾了其中的一些例子之后,我想到了:

代码语言:javascript
复制
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,这是开放源码,我想看看。文档是可以的,但是一些更高级的例子将是很棒的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-06-23 10:34:59

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

手动方法:

代码语言:javascript
复制
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'

这是太湿和可怕的鳞片,所以我们有.

工厂方法:

代码语言:javascript
复制
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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62529297

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档