wxPython 入門教程
這篇文章是關(guān)于 wxPython,但 wxPython 實(shí)際是兩件事物的組合體:Python 腳本語言和 GUI 功能的 wxWindows 庫(kù)(關(guān)于 wxWindows 的介紹,請(qǐng)參閱 developerWorks上的 “細(xì)述 wxWindows” )。wxWindows 庫(kù)是為了最大可移植性的 C/C++ 庫(kù),而抽取 GUI 功能。所以 wxWindows 應(yīng)用程序與生俱來地可以運(yùn)行在 Windows、帶 X、KDE 或 Gnome 的 UNIX 或者 wxWindows 已移植到的平臺(tái)上(很不幸,還不包括 Macintosh)。當(dāng)然 Python, 作為腳本引擎,具有很強(qiáng)的移植性( 可以 運(yùn)行在 Macintosh 上,但如果您想要編寫桌面 GUI 代碼,它是不行的)。把 wxWindows 與 Python 腳本語言組合起來,意味著:wxPython 應(yīng)用程序不僅快速和易于編寫,而且可以在不作任何更改情況下,運(yùn)行在 Windows 或 UNIX 環(huán)境下。
您可能想,“但是那也是我有 Java 的原因,Java 也是可移植的?!睕]錯(cuò),如果您曾試過在 Windows 上安裝 Java 應(yīng)用程序,您就可能認(rèn)識(shí)到完全不是這么回事。Java 虛擬機(jī)是 大的 ,它并不總是以您所想的方式工作,最糟糕的是,恕我直言,Java 窗口不是真正意義上的窗口,所以 Java 虛擬機(jī)與主機(jī)系統(tǒng)之間的交互總是有點(diǎn)力不從心。
另一方面,Python 占有相對(duì)小的空間。wxPython 庫(kù)的窗口是真正實(shí)在的本地窗口,它可以做本地窗口能做的任何事情,使您的 wxPython 程序如同窗口的程序一樣。wxPython 的全部家當(dāng)可以打包成一個(gè)易于安裝的軟件包。也許我是一個(gè)固執(zhí)的人,但我發(fā)現(xiàn)做同樣的事情,wxPython 要比 Java 容易得多。
但是您可能沒有聽說過桌面上的 Python,它是服務(wù)器端編程社區(qū)的一員,作為腳本語言這一塊的新生兒(特別是與應(yīng)用程序服務(wù)器框架連接,如 Zope)?,F(xiàn)在人們正趕上 Python 的熱潮。Python 的好處在于,不象其它腳本語言,它從一開始就是面向?qū)ο蟮恼Z言。所以您不會(huì)忽視 Java 由于喜愛 Python 而失去品嘗 OO 好處。
聽起來很酷,不是嗎?讓我們看一些代碼,您將會(huì)明白我所說的。為了易于討論,我在示例中插入了一些行標(biāo)簽。它們不是代碼中的一部分;這就是為什么它們以 藍(lán)色斜體 表示。
|
我們一行行地看,這樣容易明白該代碼的工作原理。這就是為什么它是世界上最小的 wxPython 程序(我已經(jīng)把所有無關(guān)的細(xì)節(jié)剔除了)。這段代碼只能創(chuàng)建了一帶有一個(gè)編輯字段的窗口。您可以在這個(gè)字段中編輯,但很明顯沒有辦法保存。該應(yīng)用程序看上去就象在 Windows 下一樣(我在里面輸入了一些東西):
第一行和第二行是很重要的,在后面會(huì)需要它們。事實(shí)上,在這個(gè)示例中, 不 需要 sys
和 os
,但由于幾乎每個(gè)程序都要用到,所以先把它們放進(jìn)這段代碼,在后面會(huì)針對(duì)它們提一些問題。第二行比較有趣,導(dǎo)入 wxPython 的 wx 庫(kù)。當(dāng)然,wx 庫(kù)(基本 wxPython 聲明)包括基本類,如框架和應(yīng)用程序。
/注意這些行的結(jié)尾沒有分號(hào)。如果您編寫過 Perl 程序,那您要花費(fèi)一點(diǎn)功夫來熟悉 Python 的輸入習(xí)慣。但等等,它對(duì)您來說是陌生的。
在第三行,定義了第一個(gè) Python 類 -- main_window
。 main_window
類是在 wx 模塊中定義的 wxFrame
類的派生類。正如您猜想的,任何窗口都是 wxFrame
類。
在第四行,定義了初始化方法, main_window
需要定義的唯一方法(當(dāng)然,其它的在 wxFrame 類中)。初始化方法取參數(shù) parent
、 id
、 title
以及當(dāng)然還有(作為該對(duì)象的引用的) self
。 self
參數(shù)是所有 Python 方法的第一個(gè)參數(shù)。
到 現(xiàn)在為止,如果您編寫過 C/C++,您一定奇怪為什么沒有花括號(hào)。是很奇怪,Python 把縮進(jìn)當(dāng)作重要的句法。任何有子語句的語句以冒號(hào)結(jié)束,所有該行下的縮進(jìn)行都屬于以該冒號(hào)終止的語句。當(dāng)縮進(jìn)回復(fù)到原來的縮進(jìn)時(shí),這一塊就完成了。更為奇 怪的是,這種安排實(shí)際上很好用,剛開始編程的程序員發(fā)現(xiàn),這要比用花括號(hào)來說明結(jié)構(gòu)要容易。幸運(yùn)地是,這還意味著更少的擊鍵次數(shù),所以老程序員也能接受 它。
所以縮進(jìn)的第 5、6 和 7 行屬于在第 4 行中定義的方法。它們分別調(diào)用 wxFrame 父類的初始化例程(實(shí)際進(jìn)行設(shè)置一個(gè)窗口的所有繁重工作),定義一個(gè)控件以適合新的主窗口,以及確保窗口是可見的。
wxPython 會(huì)重新調(diào)整父窗口的大小,除非專門告訴不要這樣做。如果您曾編寫過 任何 Microsoft Windows 代碼,通過重新調(diào)整控件大小來匹配父窗口,那您會(huì)很快喜歡 wxPython。第 6 行的實(shí)際意義是完成一個(gè)如同 Notepad 一樣的編輯器。這還不算什么。用 C/C++ 代碼,則需要 更多 才能實(shí)現(xiàn),不是嗎?記住 -- 我們?cè)谶@做的不是固定大小的對(duì)話框,它是真正在窗口主體中和可調(diào)整大小的帶編輯器的 Windows- 化應(yīng)用程序。
讓我們繼續(xù)。第 8 行定義了由 wxApp
類派生的 App
對(duì)象。它指定了應(yīng)用程序?qū)ο?,?dāng)運(yùn)行時(shí),創(chuàng)建一個(gè) main_window
對(duì)象,并將它設(shè)置為頂部窗口。
最后定義完類,創(chuàng)建應(yīng)用程序?qū)ο?,開始運(yùn)行它的主循環(huán)。如果您做過任何 C/C++ Windows 編程,會(huì)認(rèn)識(shí)到 MainLoop 方法是所有 Windows 程序的正常事件循環(huán)。這個(gè)啟動(dòng)代碼的風(fēng)格確實(shí)與腳本語言保持一致。記住,Python 解釋器逐行讀取代碼,并邊讀邊執(zhí)行它。所以,一旦定義了類,我們只需在腳本中調(diào)用它。
這就是 它 。在這十五行代碼中,實(shí)現(xiàn)了一個(gè)簡(jiǎn)單的文本編輯器,這段代碼無需修改就可以在 Windows 或 UNIX 上運(yùn)行。而且很容易添加更多特性,這太好了,在下一節(jié)將要講述這些。
您可能認(rèn)為,“解釋型語言,效率不高。對(duì)于較大的程序,執(zhí)行起來會(huì)很慢?!痹谝欢ǔ潭壬?,這是正確的。事實(shí)上,任何影響性能的代碼通常用 C/C++ 重新實(shí)現(xiàn),并鏈接到 Python 解釋器,這是很容易做的。所以 Python 通常用作綁定功能性模塊和 GUI 顯示(或應(yīng)用程序服務(wù)器功能,如果您需要該功能)的粘合劑。但作為粘合劑,Python 是非常有效的。您可以在很短的時(shí)間內(nèi)用 Python 實(shí)現(xiàn)真正的程序,由于其面向?qū)ο蠛透袷椒矫嬗邢薜膭?chuàng)造機(jī)會(huì),它們通??墒褂煤脦讉€(gè)星期。
而且,如果您懷疑使用解釋型語言將大程序結(jié)合在一起的想法,那您不妨考慮一下 Microsoft Word 的早期版本是如何實(shí)現(xiàn)的。至少最近的 Windows 的 Word 版本 6.0,其 Word Basic 函數(shù)事實(shí)上只是編譯過的代碼;而 GUI 是由 pcode 解釋性型語言構(gòu)建的。(MS Word 6.0 是用 Word Basic 編寫的,很有效,這是一個(gè)很聰明的設(shè)計(jì),其原因之一 -- 它是最早用內(nèi)置解釋器的桌面程序。)
這里您所損失的是在性能方面(實(shí)際上,很少),但您可以很容易地通過簡(jiǎn)化實(shí)現(xiàn)和(更重要)簡(jiǎn)化定制來彌補(bǔ)。事實(shí)上,通過包含 Python 您已經(jīng)自動(dòng)包括了易于展現(xiàn)給您的用戶的腳本語言,同時(shí),對(duì)于編程的新手來說,該語言也證明了其易于學(xué)習(xí)。如果鉆研它,可以用比您現(xiàn)在花費(fèi)的要少的功夫創(chuàng)作出世界級(jí)的軟件。因?yàn)?,如果該語言能為 Microsoft 服務(wù),那么,它也能為您服務(wù)!
無論如何,言歸正傳,這里向您展示一個(gè)程序,它事實(shí)上做一些值得做的事情。這個(gè)程序讓您創(chuàng)建一個(gè)稱之為項(xiàng)目的文本文件列表。您可以編輯和保存它們。更重要的是,您可以很容易地看到如何進(jìn)一步增強(qiáng)基本組織器。我使用一個(gè)擴(kuò)展版本為 CVS(標(biāo)準(zhǔn)開放源碼版本控制系統(tǒng))的前端。 這里是代碼 。我們(仍然相當(dāng)?。┑膽?yīng)用程序從 15 行擴(kuò)展到大約 300行,但它現(xiàn)在能實(shí)現(xiàn)許多事情。
清單 2 中我沒有列出行號(hào),因?yàn)楹苊黠@無論如何您都要月閱讀該代碼。我只是一般性地講述一下這個(gè)程序是做什么以及它所用的 Python 與 wxPython 的功能是什么。有關(guān)Python 更詳細(xì)說明,請(qǐng)您本地的書店找 Mark Lutz 寫的 O'Reilly 這本書,或者閱讀隨 Python(Guido Rossum 著,Python 的實(shí)際作者)一起的文檔。
第一個(gè)有趣的事是這個(gè)應(yīng)用程序處理命令行。列表 sys.argv
是命令行,為了使用它您需要理解 Python 列表語法。該示例用的語法很基本,但這足夠讓您理解這個(gè)程序了。
接下來,為了在調(diào)試時(shí)易于使用,定義一個(gè) MsgBox 函數(shù)。注意,用于函數(shù)聲明和類方法聲明的語法正好相同。唯一的區(qū)別是類方法需要帶參數(shù) self
,該參數(shù)包含了正在調(diào)用的對(duì)象的引用。(當(dāng)然,您不一定要稱它為 "self"。但如果不這樣做,您會(huì)迷惑的。)
真正有趣的是在更為復(fù)雜的 __init__
方法。這里,我們沒有構(gòu)建象上例一樣的簡(jiǎn)單的、缺乏控件的菜單,而是構(gòu)建了一個(gè)菜單欄,并附加菜單事件到回調(diào)例程,以及構(gòu)建窗口分割欄、樹控件和編輯控 件。您可以撇去這些來看整個(gè)工作怎樣。(如果您以前未做過 GUI 編程,往下看,您會(huì)覺得很困難。)Visual Basic 用一種幕后的方式可以做所有這些,但如果在文本編輯器僅僅打開表格文件,您仍然可以看到它。如果您曾用 C/C++ 做過 GUI 工作,那會(huì)覺得很熟悉。
一旦有構(gòu)造了的窗口,接下來我們就可以來看程序的實(shí)際代碼。首先,在方法 __init__
后有兩個(gè)用于載入和保存項(xiàng)目文件的方法。在那可以看到 Python 如何用 open
等等來處理文件 I/O。注意,事實(shí)上, 關(guān)閉 文件是一種輕松的事 -- 正如它所發(fā)生的那樣,對(duì)于 Python 來講,文件句柄僅僅是內(nèi)存管理的對(duì)象,且該對(duì)象由計(jì)數(shù)器引用。當(dāng)該引用變?yōu)闊o效時(shí),Python 知道,并會(huì)清除它,這時(shí)文件會(huì)自動(dòng)關(guān)閉。也有不能完全信任的情形(文件不能自動(dòng)關(guān)閉),例如,您將再次打開已寫的文件,并讀它。這時(shí),您要明確地關(guān)閉它。這個(gè)問題就是無用信息收集的問題(非 C 的人喜歡討論的問題)。
載入/保存函數(shù)的另一個(gè)有趣的特性是他們會(huì)碰到由壞文件調(diào)用產(chǎn)生的例外( IOError
例外)。我讓代碼來說明自己,但那是您如何做的,孩子們。
新代碼剩下的問題是事件處理程序,用于處理在程序執(zhí)行過程中所碰到的。我再次讓程序自己來說明大部分。注意,使用一般的對(duì)話框( wxMessageDialog
、 wxFileDialog
和 wxTextEntryDialog
)來處理許多常規(guī)用戶交互。這些調(diào)用與“常規(guī)”Windows 編程的相應(yīng)用法有一點(diǎn)不同,這里我只給您一些線索:首先,對(duì)話框是一個(gè)由合理的調(diào)用創(chuàng)建的對(duì)象,它用ShowModal()
顯示,用完后并破壞它;其次,用戶單擊的按鈕作為返回值從 ShowModal()
返回,用對(duì)話框附屬的方法可得到其它值。例如,在文件對(duì)話框交互期間,用戶選擇的路徑是作為 dlg.GetPath()
而獲得。這與 Windows API 的工作方式相當(dāng)不同。正是這樣您知道的。
讓我說,wxWindows API 的文檔處于……開發(fā)中。這個(gè)平臺(tái)最大的弱點(diǎn)是缺乏好的文檔,我正在積極地改變這種狀況。下半年情況會(huì)有所好轉(zhuǎn)。同時(shí),Python 本身有一些好的書籍,其中 Python 的在線文檔就不差。對(duì)于 wxWindows,C++ 的文檔很好。有時(shí),在 Python 框架中,如何使這些文檔合理些,是相當(dāng)神秘的。在那里,有一些具體的 Python 注釋,但在很多情況下,您會(huì)發(fā)現(xiàn)必須要讀隨 wxPython 一起的演示代碼,或者,必須向郵件列表中的專家詢問您的問題。幸運(yùn)地是,這些專家是“有跡可尋”的。
一旦通過了最初的學(xué)習(xí)曲線,您會(huì)覺得這要比在 Windows API 中做同樣的任務(wù)要簡(jiǎn)單的多。相信我,這份材料是很好的。
- 關(guān)于 wxWindows 的介紹,請(qǐng)參閱 developerWorks上的 “細(xì)述 wxWindows”。
- wxPython 主頁(yè) 鏈接到該文檔、下載和相關(guān)站點(diǎn)。該站點(diǎn)的鏡像在 SourceForge ,它已經(jīng)鏈接到 wxWindows 相關(guān)人員、wxPython 郵件列表等等。您也可以在這下載 wyPython。
- 在 Python 語言網(wǎng)站 上找到有關(guān) Python 語言的下載、最新開發(fā)和文檔。
- Programming Python Mark Lutz 著 (O'Reilly, 1996),ISBN 1-56592-197-6,是我使用 Python 的參考書。它與其說是一本參考書還不如說是一份教程,它是我到目前為止發(fā)現(xiàn)的最好的一本書。
- 如果您想動(dòng)動(dòng)腦筋,可以閱讀 Christian Tismer 的 Stackless Python,它有效實(shí)現(xiàn)了協(xié)同例程、發(fā)生器、延續(xù)和微線程。如果承受不了這種腦力運(yùn)動(dòng),請(qǐng)不要輕易嘗試。
- Vaults of Parnassu 的 Python 資源 是最好的常規(guī)初學(xué)者園地,以獲關(guān)于 Python 中基于文本的用戶界面工具的信息。
- Python.net 是用于 .NET 的 Python 的開發(fā)園地。
- 在三月份舉行的 Ninth International Python Conference。
- 閱讀 JPython: the Felicitous union of Python and Java, Learning Python(O'Reilly, 1999) 一書的摘錄。
![]() |
||
![]() |
Michael Roberts 從事編程已有十三年。這篇文章是他幾個(gè)月前寫的。您可以給他發(fā) e-mail michael@vivtek.com 或訪問他的網(wǎng)站 www.vivtek.com。 越多越好。 |
相關(guān)文章
Python使用struct處理二進(jìn)制的實(shí)例詳解
這篇文章主要介紹了Python使用struct處理二進(jìn)制的實(shí)例詳解的相關(guān)資料,希望通過本文大家能掌握這部分內(nèi)容,需要的朋友可以參考下2017-09-09Pandas?多進(jìn)程處理數(shù)據(jù)提高速度
這篇文章主要介紹了Pandas?多進(jìn)程處理數(shù)據(jù)提高速度,Pandas多進(jìn)程的方法,pandarallel?庫(kù),下面具體的測(cè)試方法,需要的朋友可以參考一下,希望對(duì)你的學(xué)習(xí)有所幫助2022-04-04解決pyinstaller打包exe文件出現(xiàn)命令窗口一閃而過的問題
今天小編就為大家分享一篇解決pyinstaller打包exe文件出現(xiàn)命令窗口一閃而過的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-10-10Django 解決上傳文件時(shí),request.FILES為空的問題
這篇文章主要介紹了Django 解決上傳文件時(shí),request.FILES為空的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-05-05