2017-09-16 47 views
8

Otrzymuję następujące ostrzeżenia w mojej aplikacji GTK 3:"Przydzielanie rozmiar do ..." GTK Warning podczas korzystania Gtk.TreeView wewnątrz Gtk.ScrolledWindow

Gtk-WARNING **: wielkość podziału __main__+MCVEWindow 0000000004e93b30 bez wywoływania funkcji gtk_widget_get_preferred_width/height(). W jaki sposób kod zna rozmiar do przydzielenia?

Ostrzeżenia występuje, gdy Gtk.ScrolledWindow zawierający Gtk.TreeView jest przyłączony do sieci, sama siatka jest przymocowana do gtk.ApplicationWindow i istnieje wystarczająco dużo elementów do przewijania, aby rzeczywiście pojawią. Jeśli nie ma wystarczającej liczby elementów, aby przewinąć, ostrzeżenie nie pojawia się.

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

Powinieneś być w stanie skopiować, wkleić i uruchomić ten kod, jeśli masz skonfigurowane środowisko.

Ostrzeżenia nie mają określonego wzorca, czasami jest jedno ostrzeżenie, czasami dwa lub więcej. Ostrzeżenia pojawiają się również po rozwinięciu wszystkich elementów drzewa.

wersja GTK jest 3.22.18

Co mogło spowodować te ostrzeżenia?

+0

Czy masz [MCVE] (https://stackoverflow.com/help/mcve)? – theGtknerd

+0

Tak, zredagowałem pytanie. Powinieneś być w stanie go uruchomić, jeśli masz skonfigurowane środowisko. – Doom8890

+0

Niestety, nie mogę utworzyć tego błędu za pomocą Gtk 3.18. Czy wpływają one na użyteczność twojej aplikacji? – theGtknerd

Odpowiedz

0

Otrzymałem odpowiedź na liście aplikacji GTK dev wiadomości, które prowadzą mnie do rozwiązania:

Mocowanie TreeView do GTK siatki, która jest następnie dodawany do ScrolledWindow rozwiązać ten problem dla mnie.

Zamiast tego

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

trzeba wykonać następujące czynności

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

Niestety, nie jest to udokumentowane w dowolnym miejscu.