简体   繁体   English

“将大小分配给…” GTK在Gtk.ScrolledWindow中使用Gtk.TreeView时发出警告

[英]“Allocating size to…” GTK Warning when using Gtk.TreeView inside Gtk.ScrolledWindow

I'm receiving the following warnings in my GTK 3 application: 我在GTK 3应用程序中收到以下警告:

Gtk-WARNING **: Allocating size to __main__+MCVEWindow 0000000004e93b30 without calling gtk_widget_get_preferred_width/height(). __main__+MCVEWindow 0000000004e93b30警告**:将大小分配给__main__+MCVEWindow 0000000004e93b30而不调用gtk_widget_get_preferred_width / height()。 How does the code know the size to allocate? 代码如何知道要分配的大小?

The warnings occurs when Gtk.ScrolledWindow containing Gtk.TreeView is attached to the grid, the grid itself is attached to the gtk.ApplicationWindow and there are enough elements for the scrollbar to actually appear. Gtk.ScrolledWindow包含Gtk.TreeView附加到网格,将网格本身附加到gtk.ApplicationWindow且有足够的元素实际显示滚动条时,将发生警告。 If there aren't enough elements to make it scrollable, the warning doesn't appear. 如果没有足够的元素使其可滚动,则不会出现警告。

import gi
gi.require_version("Gtk", "3.0")
from gi.repository import Gtk as gtk


class MCVEWindow(gtk.ApplicationWindow):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

        self._tree_view = gtk.TreeView()
        self._tree_view.set_hexpand(True)
        self._tree_view.set_vexpand(True)

        self.populate_tree_view()  # populate tree view with fake items

        window_column = gtk.TreeViewColumn(
            "Window", gtk.CellRendererText(),
            text=0
        )
        window_column.set_resizable(True)
        handle_column = gtk.TreeViewColumn(
            "Handle", gtk.CellRendererText(),
            text=1
        )
        class_column = gtk.TreeViewColumn(
            "Class name", gtk.CellRendererText(),
            text=2
        )
        self._tree_view.append_column(window_column)
        self._tree_view.append_column(handle_column)
        self._tree_view.append_column(class_column)

        scrolled_tree_view = gtk.ScrolledWindow()
        scrolled_tree_view.add(self._tree_view)

        toolbar = gtk.Toolbar()

        expand_tree_view_button = gtk.ToolButton(icon_name="list-add")
        expand_tree_view_button.connect(
            "clicked",
            lambda e: self._tree_view.expand_all()
        )
        collapse_tree_view_button = gtk.ToolButton(icon_name="list-remove")
        collapse_tree_view_button.connect(
            "clicked",
            lambda e: self._tree_view.collapse_all()
        )
        toolbar.insert(expand_tree_view_button, -1)
        toolbar.insert(collapse_tree_view_button, -1)

        status_bar = gtk.Statusbar()
        status_bar.push(
            status_bar.get_context_id("Status message"),
            "A status message."
        )

        self._master_grid = gtk.Grid()
        self._master_grid.attach(toolbar, 0, 0, 1, 1)
        self._master_grid.attach(scrolled_tree_view, 0, 1, 1, 1)
        self._master_grid.attach(status_bar, 0, 2, 1, 1)
        self.add(self._master_grid)

        self.connect("delete-event", gtk.main_quit)

        self.show_all()

    def populate_tree_view(self):
        tree_store = gtk.TreeStore(str, str, str)
        # Warnings don't occur when there are less than 100 "root" items
        for i in range(100):
            item1 = tree_store.append(
                None,
                ["Window " + str(i + 1), "12345678", "ClassName"]
            )
            for j in range(3):
                item2 = tree_store.append(
                    item1,
                    ["Window " + str(i + 1) + str(i + 2),
                     "12345678",
                     "ClassName"]
                )
                for k in range(5):
                    tree_store.append(
                        item2,
                        ["Window " + str(i + 1) + str(j + 1) + str(k + 1),
                         "12345678",
                         "ClassName"]
                    )

        self._tree_view.set_model(tree_store)


class MCVEApp(gtk.Application):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

    def do_activate(self):
        MCVEWindow()
        gtk.main()


if __name__ == "__main__":
    MCVEApp().run()

You should be able to copy, paste and run this code if you have environment set up. 如果已设置环境,则应该能够复制,粘贴和运行此代码。

The warnings don't follow any specific pattern, sometimes there is one warning, sometimes two or more. 警告不遵循任何特定的模式,有时只有一个警告,有时是两个或更多个。 The warrnings also pop up whenever I expand all tree items. 每当我展开所有树项时,警告也会弹出。

GTK version is 3.22.18 GTK版本是3.22.18

What could cause these warnings? 是什么引起这些警告?

I received the answer on the GTK App dev mailing list which lead me to the solution: 我在GTK App开发人员邮件列表中收到了答案,这使我找到了解决方案:

Attaching TreeView to GTK Grid which is then added to the ScrolledWindow solved the issue for me. 将TreeView附加到GTK网格,然后将其添加到ScrolledWindow中,为我解决了这个问题。

Instead of this 代替这个

scrolled_tree_view = gtk.ScrolledWindow()
scrolled_tree_view.add(self._tree_view)

you need to do the following 您需要执行以下操作

scrolled_tree_view = gtk.ScrolledWindow()
grid = gtk.Grid()
grid.attach(self._tree_view, 0, 0, 1, 1)
scrolled_tree_view.add(grid)

Unfortunately, this isn't documented anywhere. 不幸的是,这在任何地方都没有记录。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM