2017-09-16 27 views
8

我收到我的GTK 3應用程序下面的警告GTK警告:「分配大小...」使用Gtk.TreeView裏面的時候Gtk.ScrolledWindow

GTK的警告**:分配大小不需要調用gtk_widget_get_preferred_width/height()就可以調用__main__+MCVEWindow 0000000004e93b30。代碼如何知道分配的大小?

的警告,當Gtk.ScrolledWindow含有Gtk.TreeView被附接到柵格發生時,電網本身附接至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

什麼會導致這些警告?

+0

你有[MCVE](https://stackoverflow.com/help/mcve)嗎? – theGtknerd

+0

是的,我編輯了這個問題。如果您設置了環境,您應該可以運行它。 – Doom8890

+0

對不起,我無法使用Gtk 3.18創建該錯誤。它們是否影響到您的應用程序的可用性? – theGtknerd

回答

0

我收到的GTK應用程序開發郵件列表,它使我的解決方案的答案:

附加的TreeView到GTK網格,然後將其添加到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) 

不幸的是,這是不記錄任何地方。