2016-10-05 7 views
0

を調整した後に再描画しませんリサイズに再-調整:これは、常にその結果GTK3は私が、私はシンプルなグリッドたい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()を使って再描画を強制しようとしましたが、それらは役に立たないようです。

答えて

0

create_items()の実行後でもボタンは隠れています。その中のGtk.Buttonコンストラクタにvisible=Trueを追加するか、create_items()の末尾にwin.show_all()を再実行してください。

関連する問題