Python GTK3韩元';调整网格后重新绘制

Python GTK3韩元';调整网格后重新绘制,python,gtk3,Python,Gtk3,我有一个简单的例子,我正在尝试使用GTK3,我想要一个简单的网格,可以在调整大小时重新调整: #!/usr/bin/python3 from gi.repository import Gtk, Gdk class Window(Gtk.Window): def __init__(self): Gtk.Window.__init__(self, title='Grid Test') self.scroll = Gtk.ScrolledWindow()

我有一个简单的例子,我正在尝试使用GTK3,我想要一个简单的网格,可以在调整大小时重新调整:

#!/usr/bin/python3

from gi.repository import Gtk, Gdk

class Window(Gtk.Window):
    def __init__(self):
        Gtk.Window.__init__(self, title='Grid Test')

        self.scroll = Gtk.ScrolledWindow()
        self.scroll.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC)
        self.add(self.scroll)

        self.grid = Gtk.Grid()
        self.scroll.add(self.grid)

        self.create_items()

        # quit on ctrl-w
        accel = Gtk.AccelGroup()
        accel.connect(Gdk.keyval_from_name('W'), Gdk.ModifierType.CONTROL_MASK, 0, self.exit)
        self.add_accel_group(accel)

        style_provider = Gtk.CssProvider()
        style_provider.load_from_data(bytes('''
        .button {
            background: none;
            border: none;
        }
        '''.encode()))
        Gtk.StyleContext.add_provider_for_screen(
            Gdk.Screen.get_default(),
            style_provider,
            Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION
        )

        self.width = self.scroll.get_allocated_width()
        self.scroll.connect("size-allocate", self.on_resize, self.scroll, self.grid)

    def create_items(self):
        # remove existing
        for wid in self.grid.get_children():
            self.grid.remove(wid)

        col, row = 0, 0
        cols = self.scroll.get_allocated_width() / (40 + self.grid.get_column_spacing())
        for i in range(10):
            button = Gtk.Button(label='foo{}'.format(i))
            button.connect('clicked', self.on_click)
            self.grid.attach(button, col, row, 1, 1)

            if col >= cols:
                col = 0
                row += 1
            else:
                col += 1

    def on_click(self, widget):
        print('clicked')

    def exit(self, *args):
        Gtk.main_quit()

    def on_resize(self, a, b, c, grid):
        new_width = self.scroll.get_allocated_width()
        if new_width != self.width:
            self.create_items()
            self.width = new_width

if __name__ == '__main__':
    win = Window()
    win.connect('delete-event', Gtk.main_quit)
    win.show_all()
    Gtk.main()
这总是导致一个空窗口。如果我删除
大小分配
处理程序,那么这些项目会呈现,但当然不会在窗口大小更改时进行调整


我曾尝试在窗口和滚动视图上使用
self.queue\u draw()
强制重画,但这些似乎都没有帮助。

运行
create\u items()
后按钮仍然隐藏;您应该将
visible=True
添加到
Gtk.按钮中,或者在
create\u items()的末尾重新运行
win.show\u all()