获取 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()
我考虑了以下几点:
- 遍历子控件并找到 MAX(width + column)
- 连接到添加列并更新计数器时发出的 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
方法,但它永远不会被调用。
我下面的示例代码创建了一个 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()
我考虑了以下几点:
- 遍历子控件并找到 MAX(width + column)
- 连接到添加列并更新计数器时发出的 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
方法,但它永远不会被调用。