获取 Gtk.Grid 中的列数?

Get number of columns in Gtk.Grid?

我下面的示例代码创建了一个 2 行 x 10 列的网格。 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. 遍历子控件并找到 MAX(width + column)
  2. 连接到添加列并更新计数器时发出的 Gtk.Grid 信号。

(1) 的问题是,当我的网格包含 1000 个子项时,它似乎会很慢。 (2) 的问题是我没有看到用于此目的的记录信号。

网格不会在任何地方存储列数,因此不容易检索。在内部,网格只是将 left-attach and a 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, insert_next_to, remove,可能还有一些我错过了。这是很多工作并且容易出错。


事件用于子部件是 added or removed from a container, but that doesn't really help - what you really need to intercept is when a child widget's properties are modified, and as far as I know there's no way to do that. I tried to override the child_set_property 方法,但它永远不会被调用。