2017-01-11 3 views
0

私はgtk.TableEventBoxと組み合わせて、すべてのセルが色付きのグリッドを描くようにしています。最小限の例を試した後、私はウィンドウが実際のテーブルの2倍の大きさであることを発見しました。また、アプリケーションの実行中にウィンドウを縮小することもできません。なぜgtk.Tableは必要以上に2倍のスペースを必要としますか?

enter image description here

何かが間違っている恐ろしい行ったようだが、私は原因を把握することはできませんよ。ここで不正行為を再現するために、最小限の例です:

#!/usr/bin/env python 

import pygtk 
pygtk.require('2.0') 
import gtk 

class MyProgram: 

    def __init__(self): 
     app_window = gtk.Window(gtk.WINDOW_TOPLEVEL) 
     app_window.set_border_width(10) 
     app_window.connect("delete_event", lambda w,e: gtk.main_quit()) 
     vbox_app = gtk.VBox(False, 0) 
     table_layout = gtk.Table(rows=1,columns=1, homogeneous=True) 
     for col in range(1,10): 
       for row in range(1,5): 
         event_box = gtk.EventBox() 
         label_day = gtk.Label("") 
         label_day.set_size_request(18,18) 
         label_day.show() 
         event_box.add(label_day) 
         event_box.modify_bg(gtk.STATE_NORMAL, 
           event_box.get_colormap().alloc_color("orange")) 
         event_box.set_border_width(25) 
         event_box.show() 
         table_layout.attach(event_box, 0, col, 0, row, 0,0,0,0) 
     vbox_app.pack_start(table_layout) 
     app_window.add(vbox_app) 
     app_window.show_all() 
     return 

def main(): 
    gtk.main() 
    return 0 

if __name__ == "__main__": 
    MyProgram() 
    main() 

答えて

2

それはそれは痛いあなたevent_box.set_border_width(25)ですが判明しました。ラベルを均等に配置したい場合は、代わりにGtkTable::attachのパディング引数を使用してください。 をdelete-event信号に接続しないでください。代わりにdestroy信号に接続してください。 信号をdelete-event信号に接続しないでください。 delete-eventは、終了する前に何かしたいときです(例えば、ポップアップを表示しますか?はい/いいえ)。しかし、あなたが望むのは、ウィンドウが本当に破壊されたときにgtkを終了することです。

また、テーブルに追加するときにウィジェットを追加するのではなく、ウィジェットを追加し、0から始まる範囲を使用するようにしてください。ウィジェットが追加される場所(テーブルのインデックスはゼロベース)を見やすくなります。

あなたのVBoxに関しては、この文脈では役に立たない。コンテンツがウィンドウ全体を占めるウィジェットだけを持っている場合、GtkWindowに直接追加してください(ただし、アンインストールされたバージョンのプログラムでは必要かもしれません)。

最後に、各ウィジェットでgtk_widget_showに電話する必要はありません。ちょうどあなたのウィジェット階層を構築することに焦点を当てて、gtk_widget_show_allをトップレベルウィンドウで実行してください。それは再帰的にそれのすべてのウィジェットを表示します。最後に私たちを与える

#!/usr/bin/env python 

import pygtk 
pygtk.require('2.0') 
import gtk 

class MyProgram: 

    def __init__(self): 
     app_window = gtk.Window(gtk.WINDOW_TOPLEVEL) 
     app_window.set_border_width(10) 
     app_window.connect('destroy', lambda w: gtk.main_quit()) 
     table = gtk.Table(rows=1, columns=1, homogeneous=True) 

     for col in range(0,9): 
      for row in range(0,4): 
       event_box = gtk.EventBox() 
       label_day = gtk.Label('') 
       label_day.set_size_request(18, 18) 
       event_box.add(label_day) 
       event_box.modify_bg(gtk.STATE_NORMAL, 
         event_box.get_colormap().alloc_color("orange")) 
#    event_box.set_border_width(25) 
       table.attach(event_box, col, col + 1, row, row + 1, 0, 0, 12, 12) 
     app_window.add(table) 
     app_window.show_all() 


if __name__ == '__main__': 
    MyProgram() 
    gtk.main() 

またgtk-inspectorというツールを持っているが、私はそれはGTK 2で動作しない場合ならば、gtk-parasiteにフォールバック分かりません。これらのツールは、実行中のgtkユーザーインターフェースを分析し、そのウィジェットの特性を見るのに役立ちます。

また、GTK 3は数年前からリリースされていますが、GTK 4は現在進行中です。新しいコードにGTK 3を使用することを検討してください。これはpygtkをもう使用しません。これは、giパッケージ(GObjectイントロスペクション)の代わりにpygobjectです。

ここでのpython公式チュートリアルでGTK 3です:あなたの助けのおかげで、すべてのヒント

https://python-gtk-3-tutorial.readthedocs.io/en/latest/index.html

+0

!残念ながらこのプロジェクトではGTK 2を使用することを余儀なくされましたが、次回はGTK 3をチェックアウトします。 – rednammoc

関連する問題