调整网格后GTK3不会重画

2024-04-24 14:30:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个简单的例子,我正在尝试使用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()

这总是导致一个空窗口。如果我删除size-allocate处理程序,那么这些项确实会呈现,但是当窗口大小改变时,当然不会进行调整。在

我尝试过在窗口和滚动视图上使用self.queue_draw()来强制重画,但是这些似乎没有帮助。在


Tags: selfaddgtkgetondefconnectcol
1条回答
网友
1楼 · 发布于 2024-04-24 14:30:48

create_items()运行之后,按钮仍然是隐藏的;您应该将visible=True添加到Gtk.Button构造函数中,或者在create_items()结束时重新运行win.show_all()。在

相关问题 更多 >