2016年4月7日 星期四

用 python 撰寫 GTK+3 架構下的視窗介面

最近想要寫一個小程式,隨手挑了一套 solution:

python - 程式語言
GTK+3 - 視窗介面程式框架
glade - 畫視窗介面的 IDE

其中 glade 可以把用 IDE 畫好的視窗 layout 直接存成 GTK 可以理解的 xml 格式檔案,藉此增加開發設計視窗外貌的速度。

選擇 GTK+3 的理由滿單純,因為我使用的系統** 上的 glib 會抱怨我所使用的 glade 必須是 3.x 版 ***


** 我是用 Ubuntu 14.04 64 bit
*** import gtk 這種語法似乎就是支援 GTK+2.x,細節可參考這個 stackoverflow 連結



步驟一:使用 glade 畫 layout 後轉成 XML


首先啟動 glade,接著創建一個視窗(在工作 panel 中按視窗即可),注意這個視窗有個名字(預設是 window1),這個名字會被 python GTK+3 拿來取得該視窗物件,所以如果你有更改視窗名稱的話,程式中呼叫的名字也要跟著改。

畫好之後就存檔,檔案本身就會是 XML 了。

步驟二:開始寫程式


整個 python GTK+3 架構大致如下:
使用 builder 取得視窗物件、註冊 signal、設定組態等等。最後開始執行 Gtk main loop 等待事件。

範例如下:

from gi.repository import Gtk

class HellowWorldGTK(object):
    """This is a Hello World GTK application"""
    def __init__(self):
        # layout generated by glade
        layout_filename = "layout.xml"
        builder = Gtk.Builder()
        builder.add_from_file(layout_filename)
        #builder.connect_signals(self)
        self.window = builder.get_object("window1")
        if self.window:
            self.window.connect("destroy", Gtk.main_quit)
        self.window.show_all()
if __name__ == "__main__":
    hwg = HellowWorldGTK()
    Gtk.main()


其中 layout.xml 是步驟一用 glade 存成的 XML 檔案名稱,window1 也是步驟一中提到的視窗名稱。這裡比較要注意的是使用這行程式碼來讓我們可以關掉視窗的時候,同時退出 Gtk main loop。如果沒有這行,程式一但執行後就會一直跑,只能另外請作業系統殺掉它了。

self.window.connect("destroy", Gtk.main_quit)


步驟三:執行


步驟二中的範例程式碼存成 go.py,執行 go.py 即可。




更多資訊可以參考 Python GTK+3 Tutorial (剛好昨天才 release!)