如何在 Enaml 网格容器中设置固定 width/height
How to set fixed width/height in Enaml grid container
我刚刚遇到用于 python GUI 编程的 Enaml。我之前只用过一次 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_width
和 hug_height
似乎不起作用。然后我尝试手动设置 f11.width == 50
,例如,在约束内,但 kiwisolver 对我大喊无法解决的约束。我尝试了所有我能从设置宽度值的例子中找到的东西,但是适用于 vbox
的东西似乎不适用于 grid
.
有什么想法吗?此外,如果有人拥有使用 Enaml 制作的完整应用程序(开源),我很乐意看一看。文档还可以,但一些更高级的示例会很棒。
好吧,我想我已经找到了让它工作的方法。 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
,因为主要 window 中可能还有其他东西,而 Enaml windows 需要一个主控 Container
。
我刚刚遇到用于 python GUI 编程的 Enaml。我之前只用过一次 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_width
和 hug_height
似乎不起作用。然后我尝试手动设置 f11.width == 50
,例如,在约束内,但 kiwisolver 对我大喊无法解决的约束。我尝试了所有我能从设置宽度值的例子中找到的东西,但是适用于 vbox
的东西似乎不适用于 grid
.
有什么想法吗?此外,如果有人拥有使用 Enaml 制作的完整应用程序(开源),我很乐意看一看。文档还可以,但一些更高级的示例会很棒。
好吧,我想我已经找到了让它工作的方法。 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
,因为主要 window 中可能还有其他东西,而 Enaml windows 需要一个主控 Container
。