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

Posted

技术标签:

【中文标题】“将大小分配给...”在 Gtk.ScrolledWindow 中使用 Gtk.TreeView 时出现 GTK 警告【英文标题】:"Allocating size to..." GTK Warning when using Gtk.TreeView inside Gtk.ScrolledWindow 【发布时间】:2018-02-25 11:11:55 【问题描述】:

我在 GTK 3 应用程序中收到以下警告:

Gtk-WARNING **:在不调用 gtk_widget_get_preferred_width/height() 的情况下将大小分配给 __main__+MCVEWindow 0000000004e93b30。代码如何知道要分配的大小?

当包含Gtk.TreeViewGtk.ScrolledWindow 附加到网格,网格本身附加到gtk.ApplicationWindow 并且有足够的元素使滚动条实际出现时,会出现警告。如果没有足够的元素使其可滚动,则不会出现警告。

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()

如果您设置了环境,您应该能够复制、粘贴和运行此代码。

警告不遵循任何特定模式,有时只有一个警告,有时是两个或更多。每当我展开所有树项目时,也会弹出警告。

GTK 版本为3.22.18

什么可能导致这些警告?

【问题讨论】:

你有MCVE吗? 是的,我编辑了这个问题。如果您设置了环境,您应该能够运行它。 抱歉,我无法使用 Gtk 3.18 创建该错误。它们是否会影响您应用的可用性? 它们不会影响可用性,但会向终端发送垃圾邮件。我基于谷歌搜索的怀疑是它是一个 GTK 错误,并且由于您无法在早期版本中重现它,我可能是对的,尽管我不能确定。非常感谢您的尝试,我希望有人也想尝试一下。 我将您的程序翻译成 C 语言并且出现警告。 gist.github.com/mywtfmp3/bf17df5a3d13c889acd673740c9c2898。我正在运行 Gtk 3.22.21。 【参考方案1】:

我在 GTK 应用程序开发邮件列表中收到了答案,这让我找到了解决方案:

将 TreeView 附加到 GTK Grid 然后添加到 ScrolledWindow 为我解决了这个问题。

不是这个

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

您需要执行以下操作

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

不幸的是,这在任何地方都没有记录。

【讨论】:

以上是关于“将大小分配给...”在 Gtk.ScrolledWindow 中使用 Gtk.TreeView 时出现 GTK 警告的主要内容,如果未能解决你的问题,请参考以下文章

分配的变量引用在哪里,在堆栈中还是在堆中?

NOIP 2015 & SDOI 2016 Round1 & CTSC 2016 & SDOI2016 Round2游记

秋的潇洒在啥?在啥在啥?

上传的数据在云端的怎么查看,保存在啥位置?

在 React 应用程序中在哪里转换数据 - 在 Express 中还是在前端使用 React?

存储在 plist 中的数据在模拟器中有效,但在设备中无效