我下面的示例代码创建了一个2行x 10列的网格。网格的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()


我考虑了以下内容:


遍历子窗口小部件并找到MAX(width + column)
连接到添加列时发出的Gtk.Grid信号并更新计数器。


(1)的问题是,当我的Grid包含1000个孩子时,它看起来会很慢。
(2)的问题是我看不到为此目的记录的信号。

最佳答案

网格不会在任何地方存储列数,因此检索起来并不容易。在内部,网格仅将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_columninsert_next_toremove,可能还有更多我错过了。这需要大量工作并且容易出错。



有一些事件表明何时子容器是容器中的addedremoved,但这并没有真正的帮助-您真正需要拦截的是子容器的属性被修改时,据我所知没有做到这一点的方法。我试图覆盖child_set_property方法,但是它从未被调用。

关于python - 获取Gtk.Grid中的列数?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49756058/

10-12 16:39