我下面的示例代码创建了一个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-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
,insert_next_to
,remove
,可能还有更多我错过了。这需要大量工作并且容易出错。有一些事件表明何时子容器是容器中的added或removed,但这并没有真正的帮助-您真正需要拦截的是子容器的属性被修改时,据我所知没有做到这一点的方法。我试图覆盖
child_set_property
方法,但是它从未被调用。关于python - 获取Gtk.Grid中的列数?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49756058/