2013年5月14日 星期二

Python Gtk glade開發GUI程式

最近看到幾個有趣的軟體使用的開發技術很有意思: Python, GTK, Glade
Python: 由Google主推的高階直譯語言,強調其容易學習使用。
GTK: 用來建立GUI的底層軟體。
Glade: 設計UI的工具,可以視覺化的以所見即所得方式來作業。

有意思的地方:
1. Python為高階直譯,所以馬上寫馬上可執行,不需編譯
2. 看文件強調為跨平台,所以寫一次可在多個平台跑
3. 為開源碼,意即為自己用不用花錢
4. 開發方式簡單

在MacOSX上,在10.7(Lion)做了以下測試:
1. 先用Macport安裝python 2.7 (因為太久前做的,已忘了確切作法,可以參考以下網址:http://astrofrog.github.io/macports-python/)
2. 再去安裝PyGTK(http://macpkg.sourceforge.net/)
取得PyGTK.pkg後,按兩下後,出現安裝精靈,大致上就是下一步,下一步的做就可以了,最後會告訴你去跑一下/opt/gtk/bin/pygtk-demo, 這其實是一支python程式,內容:
#! /usr/bin/env python

import sys
import os.path
pygtklibdir = os.path.join("/opt/gtk/lib", "pygtk", "2.0")
sys.path.insert(0, pygtklibdir)
execfile(os.path.join(pygtklibdir, "pygtk-demo.py"))
不用學過python程式設計,也大概可以猜到它只是去叫另一支python程式起來而已。執行結果如下:


使用方式為:選取左邊選項,可以在右邊看到該項的說明及程式寫法(要切換頁籤)如果要看到其實際執行情況,就在左邊選項上按兩下就可以了。先簡單的試用後發現,命令列總是會出現: clip: empty path.以及其他錯誤訊息。有時候還會有程式當掉的情況,但簡單的程式是還可以正常的執行。看來,在MacOSX上,這個開發組合模式,還有一些問題要改善。

3. 找一個簡單的範例來試試(來源:http://python-gtk-3-tutorial.readthedocs.org/en/latest/builder.html)
from gi.repository import Gtk

class Handler:
    def onDeleteWindow(self, *args):
        Gtk.main_quit(*args)

    def onButtonPressed(self, button):
        print "Hello World!"

builder = Gtk.Builder()
builder.add_from_file("builder_example.glade")
builder.connect_signals(Handler())

window = builder.get_object("window1")
window.show_all()

Gtk.main()
這支python程式需要另一個檔案"builder_example.glade", 這個.glade檔的內容為XML結構, 用來描述UI。但請不要自行輸入這個XML內容,可以使用Glade工具很快的建立。工具的使用方式,如下影片:
看了影片,就知道只要點點選選就可以建立UI了。
我們只要先點視窗,然後在視窗裡再加入一個按鈕就可以了,視窗及按鈕的訊號(事件)要設成和程式裡的名稱一樣(onDeleteWindow, onButtonPressed)就可以了。最後記得要存檔成"builder_example.glade",如果你使用另存新檔,請注意到在存檔畫面下方有一個選項可二選一(檔案格式:GtkBuilder 或 Libglade),這裡要選GtkBuilder。

此時我們手上在同一個目錄下有兩個檔案:一個.py和一個.glade
在Ubuntu下我試了可以執行,但移到MacOSX就不行了!
稍加修改:
# from gi.repository import Gtk
import gtk
class Handler:
    def onDeleteWindow(self, *args):
        gtk.main_quit(*args)

    def onButtonPressed(self, button):
        print "Hello World!"

builder = gtk.Builder()
builder.add_from_file("builder_example.glade")
builder.connect_signals(Handler())

window = builder.get_object("window1")
window.show_all()

gtk.main()
在MacOSX下就可以執行了。執行結果符合預期的的行為。
而在Ubuntu下,這個修改過的版本也可以正常的執行。
張貼留言