2017-01-11 28 views
0

我正在使用gtk.Table結合EventBox爲每個單元繪製彩色網格。在嘗試了一個最小例子後,我發現窗口是實際表格的兩倍大。此外,當應用程序運行時,無法進一步收縮窗口。爲什麼gtk.Table需要兩倍的空間比它應該?

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的填充參數。

以下是無關的改進: 請勿將gtk_main_quit連接到delete-event信號,而應將其連接到destroy信號。 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。

這裏的GTK 3在python官方教程:

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

+0

感謝您的幫助和所有的提示!不幸的是,對於這個項目我不得不使用GTK 2,但下次我肯定會檢查GTK 3。 – rednammoc

相關問題