顯示具有 python 標籤的文章。 顯示所有文章
顯示具有 python 標籤的文章。 顯示所有文章

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!)

2016年1月14日 星期四

以 SOLVCON 專案為例,使用 conda 來維護、建立 python 執行與開發環境

一套可以正常運作的應用程式往往需要有很多其他配套的軟體互相支援,這造成了建構軟體中常見的「版本相依性」問題。如果是使用者的身份,這類問題可以透過(雖然這不一定是最好的方法)將所有相依的軟體都打成一包釋出。但身為開發者,常常遇到的問題是「開發者自己的作業系統環境」和「想開發的應用程式所需要的環境」有所不同。一般來說,開發者大概不太願意去更動自己的作業系統環境來配合自己的開發標的軟體,因為這可能會導致開發者自己的作業系統本身、或是作業系統下的其他應用程式無法正常運作。一個直觀的解決方案當然就是「那我弄一個專門給想開發的軟體使用的環境總可以了吧?」,conda 就是這樣的一個工具。

conda 是 anaconda 和 miniconda 所羅列的工具之一 。anaconda 和 miniconda 也是想做一樣的事情,但是前者可以堪稱是「包山包海」;這是優點也是缺點,優點就是一口氣把所有第三方的軟體都先準備好,以後幾乎不用再煩惱,缺點就是一定會準備了很多其實用不到的東西。miniconda 可以想像成是精簡版本的 anaconda 、然後有管理 python package 功能的 virtualenv[1]。

最近 SOLVCON 從原來的 python 2 移植到 python 3 ,主要的核心移植已經堪稱完成。然而最近想持續開發的 parallel 運算能力則在移植前便已經過時,剛好趁這次大搬家把這個 feature 修回來。

要熟悉一個程式的 feature,我還滿喜歡從研究它相關的 unittest 開始著手。理由如下:

從 unittest 中,我們可以看到
  1. 使用者的角度 - 這個功能如何被使用
  2. 測試者的角度 - 這個功能所產生的結果如何被解讀
有頭(如何 input 和使用)有尾(如何解讀 output)的情況下,就可以開始從外部行為來觀察程式執行 runtime 這個可以被視為黑盒子的部份。可以觀察外在的行為(unittest)加上可以觀察內在的行為(例如 source code)的話,幾乎就是一個說明清楚的 step by step tutorial。

有點扯太遠,總而言之要處理下面這兩件事情:
  1. 準備可以運行的 SOLVCON。SOLVCON 不再使用 scons 做套件管理(悲劇!!打包成 debian package 的 rule file 又要重寫 XD ),而改為使用 python setuptool ;因此要把對應的第三方工具告訴 setuptool。這裡我們採用 conda 當作解決方案。
  2. 利用 ftests 中的 nosetest 去研究和修復 SOLVCON 的平行運算功能。

準備好 conda 之後(這部份略過啦!好久以前就裝好了 XD 裝 anaconda 或是 miniconda 之後就有這個指令可以使用),先確認環境變數有告訴系統哪裡去找 conda 這個工具(通常是 anaconda 或是 miniconda 當初安裝的位置),例如有加入 PATH 變數。

啟動並且進入 conda 環境;我自己是把他寫成一個 alias 比較方便
alias solvconenv="export PATH=$MYLOCALINSTALLATION/miniconda3/solvcon-dev/bin:$PATH; source activate $MYLOCALINSTALLATION/miniconda3/solvcon-dev"

接著使用這個指令去安裝缺少的套件
conda search <package name>

安裝則是
conda install <package name>

例如安裝 python
conda install python
安裝 python3
conda install python=3
後面的等於3表示指定特定版本號碼。


更多使用方法請見 help
conda -h

[1] virtualenv 是用來建立獨立 python 套件環境的工具。