2013年1月15日 星期二

[PySide]導論

Python寫出來的程式大多是文字介面,雖然簡單但不夠人性化。目前Python可以用的GUI介面有幾種:內建的tkinter、連結Qt的PyQt和PySide、PyGTK、wxPython等等,然而應用在python3上的僅有內建的tkinter以及Qt系列的那兩種綁定,不過也幸好是QT系列有支援,因為他有許多強大的工具可以直接使用。
也許你會問:那PyQt與PySide的差別又在哪裡呢?
由於發展PyQt的公司Riverbank堅持不使用LGPL授權,要嘛就是GPL,要嘛就跟我買商業授權。當年Qt母公司Nokia交涉未果的情況下,只好自行另外做一個,形成少見的同樣套件功能卻有兩種實作。目前PyQt比較成熟,網路上的資源也很多。而PySide到近期才跨進Python3,比起來可能還比較不穩定,不過我倒希望有天也能和tkinter一樣收進標準程式庫。
雖然兩套系出同源,但還是有一些差別,另外目前中文資料大多是PyQt with Python2。為了以後查詢可以不用在腦內翻譯一次,直接打在這以後做參考。
第一件事當然就是安裝拉~
對於Windows方面,他有推出各種對應版本的安裝程式,建議直接用這個裝比較不會有問題,畢竟安裝時就折騰了,對它還會有好印象嗎?(笑) 
下載位置:[http://qt-project.org/wiki/PySide_Binaries_Windows]
安裝後趕緊來測試一下,首先到python的IDLE或是命令列模式內,打入下面這行:
import PySide

如果沒有任何錯誤的話,接下來打入下面這行:

PySide.__version__

它會顯示目前安裝的PySide的版本,我現在的就顯示 1.1.2,到這邊都沒問題的話,恭喜你已經完成安裝了,接下來可以開香檳會快速帶過一次如何建立一個基本的視窗。

首先開頭匯入PySide程式庫,幾乎所有的PySide至少需要匯入以下三個模組

import sys
from PySide.QtCore import *
from PySide.QtGui import *

接著建立PySide的程式實體,他負責處理大大小小你看不見的瑣事,注意:程式實體不等同於視窗,一個程式可以有很多個視窗(就像MSN之類的軟體,大學時代會開到20幾個對話視窗,但還是只有一個MSN的實體,想當年... ),但只會有一個實體。

app = QApplication(sys.argv)

接著我們建立一個按鈕,對應的是QPushButton物件

button = QPushButton("按我")

這裡要說明的是,由於PySide是以物件的方式寫的,所以當我們建立視窗元件時,他們會繼承視窗的特性,因此即使只有建立按鈕,Qt也會自動做建立視窗等動作。它的繼承序列如下:

QObject->QWidget->QAbstractButton->QPushButton

打個比方:就像我們跟電腦店老闆說我想要玩星海2,老闆會連同整台電腦灌好Windows系統最後加上星海2交給你(哪裡有這麼好的老闆!!!),不用刻意說我需要那些滑鼠、記憶體。

如果想要個人化一點可以加入下面的程式碼:

#改變按鈕大小
button.resize(200, 75)
#改變視窗在螢幕的位置
button.move(500,300)
#設定視窗標題
button.setWindowTitle("我的第一個程式")

以上的設定很明顯都是從它的父元件繼承來的

接著由於預設視窗是隱藏的,因此在做好設定之後,我們要讓醜媳婦見公婆

button.show()

基本上到這裡就沒事了,以前還要再多個button.exec_()  但經過我測試之後,發現現在不用這行視窗也不會自己關掉了(註一),現在執行看看效果如何

t

哈,看到視窗出來也沒有很興奮阿,不過別急著點擊按鈕,它是不會有任何反應的,下一篇再來介紹如何讓按鈕可以有實質的用途~

完整程式碼:

import sys
from PySide.QtCore import *
from PySide.QtGui import *

app = QApplication(sys.argv)

button = QPushButton("按我")

#改變按鈕大小
button.resize(200, 75)
#改變視窗在螢幕的位置
button.move(500,300)
#設定視窗標題
button.setWindowTitle("我的第一個程式")

button.show()

註一:由於windows上的程式基礎是事件驅動,比如說滑鼠點擊就是事件的一種,在事件沒發生時,大多晾在那邊等。然而傳統的python程式執行完程式碼就自己關掉了,這可不行,因此要使用exec_()讓我們的程式進入捕獲事件的狀態,而不要自己關掉說掰掰。

沒有留言:

張貼留言