获取Gtk.Grid中的列数?

时间:2018-04-10 14:20:28

标签: python python-3.x gtk3 pygobject

下面的示例代码创建了一个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. 遍历子窗口小部件并找到MAX(宽度+列)
  2. 连接到添加列时发出的Gtk.Grid信号并更新计数器。
  3. 问题(1)是当我的网格包含1000个孩子时,它似乎会很慢。 问题(2)是我没有为此目的看到记录的信号。

1 个答案:

答案 0 :(得分:1)

网格不会在任何地方存储列数,因此检索起来并不容易。在内部,网格只是将left-attachwidth属性与每个子窗口小部件相关联。

计算网格中列数的最简单方法是迭代其所有子项并找到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...

这个问题是您必须覆盖的大量方法:addattachattach_next_toinsert_columnremove_column,{ {3}},insert_next_to,还有一些我错过的内容。这是很多工作,容易出错。

当来自容器的子窗口小部件为removeadded时,事件,但这实际上没有帮助 - 您真正 >需要拦截的是子窗口小部件的属性被修改,据我所知,没有办法做到这一点。我试图覆盖removed方法,但它永远不会被调用。