下面的示例代码创建了一个2行x 10列Grid。 Grid的len()似乎打印了小部件的数量,而不是行数或列数。如何获得列数?
import gi
gi.require_version("Gtk", "3.0")
from gi.repository import Gtk
window = Gtk.Window()
window.connect("destroy", Gtk.main_quit)
grid = Gtk.Grid(column_homogenous=True)
for i in range(5):
grid.add(Gtk.Label(str(i)))
grid.attach(Gtk.Label("123456789A"), 0, 1, 10, 1)
window.add(grid)
window.show_all()
print(len(grid))
Gtk.main()
我考虑过以下事项:
问题(1)是当我的网格包含1000个孩子时,它似乎会很慢。 问题(2)是我没有为此目的看到记录的信号。
答案 0 :(得分:1)
网格不会在任何地方存储列数,因此检索起来并不容易。在内部,网格只是将left-attach和width属性与每个子窗口小部件相关联。
计算网格中列数的最简单方法是迭代其所有子项并找到left-attach + width
的最大值:
def get_grid_columns(grid):
cols = 0
for child in grid.get_children():
x = grid.child_get_property(child, 'left-attach')
width = grid.child_get_property(child, 'width')
cols = max(cols, x+width)
return cols
另一个选项是子类Gtk.Grid
并覆盖添加,删除或移动子窗口小部件的所有方法:
class Grid(Gtk.Grid):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.columns = 0
def add(self, child):
super().add(child)
self.columns = max(self.columns, 1)
def attach(self, child, left, top, width, height):
super().attach(child, left, top, width, height)
self.columns = max(self.columns, left+width)
# etc...
这个问题是您必须覆盖的大量方法:add
,attach
,attach_next_to
,insert_column
,remove_column
,{ {3}},insert_next_to
,还有一些我错过的内容。这是很多工作,容易出错。
当来自容器的子窗口小部件为remove
或added时,是事件,但这实际上没有帮助 - 您真正 >需要拦截的是子窗口小部件的属性被修改,据我所知,没有办法做到这一点。我试图覆盖removed方法,但它永远不会被调用。