久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

十五行代碼實現(xiàn)文本編輯器窗口

 DavinTang 2011-03-04

這篇文章是關(guān)于 wxPython,,但 wxPython 實際是兩件事物的組合體:Python 腳本語言和 GUI 功能的 wxWindows 庫(關(guān)于 wxWindows 的介紹,請參閱 developerWorks上的 “細(xì)述 wxWindows” ),。wxWindows 庫是為了最大可移植性的 C/C++ 庫,,而抽取 GUI 功能。所以 wxWindows 應(yīng)用程序與生俱來地可以運行在 Windows,、帶 X,、KDE 或 Gnome 的 UNIX 或者 wxWindows 已移植到的平臺上(很不幸,還不包括 Macintosh),。當(dāng)然 Python,, 作為腳本引擎,具有很強(qiáng)的移植性( 可以 運行在 Macintosh 上,,但如果您想要編寫桌面 GUI 代碼,,它是不行的)。把 wxWindows 與 Python 腳本語言組合起來,,意味著:wxPython 應(yīng)用程序不僅快速和易于編寫,,而且可以在不作任何更改情況下,運行在 Windows 或 UNIX 環(huán)境下,。

您可能想,,“但是那也是我有 Java 的原因,Java 也是可移植的,。”沒錯,,如果您曾試過在 Windows 上安裝 Java 應(yīng)用程序,您就可能認(rèn)識到完全不是這么回事,。Java 虛擬機(jī)是 大的 ,,它并不總是以您所想的方式工作,最糟糕的是,,恕我直言,,Java 窗口不是真正意義上的窗口,所以 Java 虛擬機(jī)與主機(jī)系統(tǒng)之間的交互總是有點力不從心,。

另一方面,,Python 占有相對小的空間。wxPython 庫的窗口是真正實在的本地窗口,,它可以做本地窗口能做的任何事情,,使您的 wxPython 程序如同窗口的程序一樣,。wxPython 的全部家當(dāng)可以打包成一個易于安裝的軟件包。也許我是一個固執(zhí)的人,,但我發(fā)現(xiàn)做同樣的事情,,wxPython 要比 Java 容易得多。

但是您可能沒有聽說過桌面上的 Python,,它是服務(wù)器端編程社區(qū)的一員,,作為腳本語言這一塊的新生兒(特別是與應(yīng)用程序服務(wù)器框架連接,如 Zope)?,F(xiàn)在人們正趕上 Python 的熱潮,。Python 的好處在于,不象其它腳本語言,,它從一開始就是面向?qū)ο蟮恼Z言,。所以您不會忽視 Java 由于喜愛 Python 而失去品嘗 OO 好處。

世界上最小的 wxPython 程序,,剖析,!

聽起來很酷,不是嗎,?讓我們看一些代碼,您將會明白我所說的,。為了易于討論,,我在示例中插入了一些行標(biāo)簽。它們 不是代碼中的一部分,;這就是為什么它們以 藍(lán)色斜體 表示,。


清單 1. 一段很小的代碼樣本
                
            
            [1]
            
             import sys, os
            
            
            [2]
            
             from   wxPython.wx import *
            
            
            [3]
            
             class main_window(wxFrame):
            
            
            [4]
            
             def __init__(self, parent, id, title):
            
            
            [5]
            
             wxFrame.__init__(self, parent, -1, title, size = (200, 100),
            style=wxDEFAULT_FRAME_STYLE|wxNO_FULL_REPAINT_ON_RESIZE)
            
            
            [6]
            
             self.control = wxTextCtrl(self, -1, style=wxTE_MULTILINE)
            
            
            [7]
            
             self.Show(true)
            
            
            [8]
            
             class App(wxApp):
            def OnInit(self):
            frame =
            main_window(None, -1, "wxPython: (A Demonstration)")
            self.SetTopWindow(frame)
            return true
            
            
            [9]
            
             app = App(0)
            app.MainLoop()
            

我們一行行地看,這樣容易明白該代碼的工作原理,。這就是為什么它是世界上最小的 wxPython 程序(我已經(jīng)把所有無關(guān)的細(xì)節(jié)剔除了),。這段代碼只能創(chuàng)建了一帶有一個編輯字段的窗口。您可以在這個字段中編輯,,但很明顯沒有辦法保存,。該應(yīng)用程序看上去就象在 Windows 下一樣(我在里面輸入了一些東西):




讓我們查看代碼

第一行和第二行是很重要的,在后面會需要它們,。事實上,,在這個示例中, 需要 sysos ,,但由于幾乎每個程序都要用到,,所以先把它們放進(jìn)這段代碼,在后面會針對它們提一些問題,。第二行比較有趣,,導(dǎo)入 wxPython 的 wx 庫,。當(dāng)然,wx 庫(基本 wxPython 聲明)包括基本類,,如框架和應(yīng)用程序,。

/注意這些行的結(jié)尾沒有分號。如果您編寫過 Perl 程序,,那您要花費一點功夫來熟悉 Python 的輸入習(xí)慣,。但等等,它對您來說是陌生的,。

在第三行,,定義了第一個 Python 類 -- main_windowmain_window 類是在 wx 模塊中定義的 wxFrame 類的派生類,。正如您猜想的,,任何窗口都是 wxFrame 類。

在第四行,,定義了初始化方法,, main_window 需要定義的唯一方法(當(dāng)然,其它的在 wxFrame 類中),。初始化方法取參數(shù) parent ,、 idtitle 以及當(dāng)然還有(作為該對象的引用的) self ,。 self 參數(shù)是所有 Python 方法的第一個參數(shù),。

到現(xiàn)在為止,如果您編寫過 C/C++,,您一定奇怪為什么沒有花括號,。是很奇怪,Python 把縮進(jìn)當(dāng)作重要的句法,。任何有子語句的語句以冒號結(jié)束,,所有該行下的縮進(jìn)行都屬于以該冒號終止的語句。當(dāng)縮進(jìn)回復(fù)到原來的縮進(jìn)時,,這一塊就完成了,。更為奇 怪的是,這種安排實際上很好用,,剛開始編程的程序員發(fā)現(xiàn),,這要比用花括號來說明結(jié)構(gòu)要容易。幸運地是,,這還意味著更少的擊鍵次數(shù),,所以老程序員也能接受 它。

所以縮進(jìn)的第 5、6 和 7 行屬于在第 4 行中定義的方法,。它們分別調(diào)用 wxFrame 父類的初始化例程(實際進(jìn)行設(shè)置一個窗口的所有繁重工作),,定義一個控件以適合新的主窗口,以及確保窗口是可見的,。

wxPython 會重新調(diào)整父窗口的大小,,除非專門告訴不要這樣做。如果您曾編寫過 任何 Microsoft Windows 代碼,,通過重新調(diào)整控件大小來匹配父窗口,,那您會很快喜歡 wxPython。第 6 行的實際意義是完成一個如同 Notepad 一樣的編輯器,。這還不算什么,。用 C/C++ 代碼,則需要 更多 才能實現(xiàn),,不是嗎,?記住 -- 我們在這做的不是固定大小的對話框,它是真正在窗口主體中和可調(diào)整大小的帶編輯器的 Windows- 化應(yīng)用程序,。

讓我們繼續(xù),。第 8 行定義了由 wxApp 類派生的 App 對象。它指定了應(yīng)用程序?qū)ο?,?dāng)運行時,,創(chuàng)建一個 main_window 對象,并將它設(shè)置為頂部窗口,。

最后定義完類,,創(chuàng)建應(yīng)用程序?qū)ο螅_始運行它的主循環(huán),。如果您做過任何 C/C++ Windows 編程,會認(rèn)識到 MainLoop 方法是所有 Windows 程序的正常事件循環(huán),。這個啟動代碼的風(fēng)格確實與腳本語言保持一致,。記住,Python 解釋器逐行讀取代碼,,并邊讀邊執(zhí)行它,。所以,一旦定義了類,,我們只需在腳本中調(diào)用它,。

這就是 。在這十五行代碼中,,實現(xiàn)了一個簡單的文本編輯器,,這段代碼無需修改就可以在 Windows 或 UNIX 上運行。而且很容易添加更多特性,這太好了,,在下一節(jié)將要講述這些,。


性能怎樣?

您可能認(rèn)為,,“解釋型語言,,效率不高。對于較大的程序,,執(zhí)行起來會很慢,。”在一定程度上,這是正確的,。事實上,,任何影響性能的代碼通常用 C/C++ 重新實現(xiàn),并鏈接到 Python 解釋器,,這是很容易做的,。所以 Python 通常用作綁定功能性模塊和 GUI 顯示(或應(yīng)用程序服務(wù)器功能,如果您需要該功能)的粘合劑,。但作為粘合劑,,Python 是非常有效的。您可以在很短的時間內(nèi)用 Python 實現(xiàn)真正的程序,,由于其面向?qū)ο蠛透袷椒矫嬗邢薜膭?chuàng)造機(jī)會,,它們通常可使用好幾個星期,。

而且,,如果您懷疑使用解釋型語言將大程序結(jié)合在一起的想法,那您不妨考慮一下 Microsoft Word 的早期版本是如何實現(xiàn)的,。至少最近的 Windows 的 Word 版本 6.0,,其 Word Basic 函數(shù)事實上只是編譯過的代碼;而 GUI 是由 pcode 解釋性型語言構(gòu)建的,。(MS Word 6.0 是用 Word Basic 編寫的,,很有效,這是一個很聰明的設(shè)計,,其原因之一 -- 它是最早用內(nèi)置解釋器的桌面程序,。)

這里您所損失的是在性能方面(實際上,很少),,但您可以很容易地通過簡化實現(xiàn)和(更重要)簡化定制來彌補(bǔ),。事實上,通過包含 Python 您已經(jīng)自動包括了易于展現(xiàn)給您的用戶的腳本語言,,同時,,對于編程的新手來說,該語言也證明了其易于學(xué)習(xí)。如果鉆研它,,可以用比您現(xiàn)在花費的要少的功夫創(chuàng)作出世界級的軟件,。因為,如果該語言能為 Microsoft 服務(wù),,那么,,它也能為您服務(wù)!


更有趣的事:初步的項目組織器

無論如何,,言歸正傳,,這里向您展示一個程序,它事實上做一些值得做的事情,。這個程序讓您創(chuàng)建一個稱之為項目的文本文件列表,。您可以編輯和保存它們。更重要的是,,您可以很容易地看到如何進(jìn)一步增強(qiáng)基本組織器,。我使用一個擴(kuò)展版本為 CVS(標(biāo)準(zhǔn)開放源碼版本控制系統(tǒng))的前端。 這里是代碼 ,。我們(仍然相當(dāng)?。┑膽?yīng)用程序從 15 行擴(kuò)展到大約 300行,但它現(xiàn)在能實現(xiàn)許多事情,。




程序中的趣事

清單 2 中我沒有列出行號,,因為很明顯無論如何您都要月閱讀該代碼。我只是一般性地講述一下這個程序是做什么以及它所用的 Python 與 wxPython 的功能是什么,。有關(guān)Python 更詳細(xì)說明,,請您本地的書店找 Mark Lutz 寫的 O'Reilly 這本書,或者閱讀隨 Python(Guido Rossum 著,,Python 的實際作者)一起的文檔,。

第一個有趣的事是這個應(yīng)用程序處理命令行。列表 sys.argv 是命令行,,為了使用它您需要理解 Python 列表語法,。該示例用的語法很基本,但這足夠讓您理解這個程序了,。

接下來,為了在調(diào)試時易于使用,,定義一個 MsgBox 函數(shù),。注意,用于函數(shù)聲明和類方法聲明的語法正好相同,。唯一的區(qū)別是類方法需要帶參數(shù) self ,,該參數(shù)包含了正在調(diào)用的對象的引用。(當(dāng)然,您不一定要稱它為 "self",。但如果不這樣做,,您會迷惑的。)

真正有趣的是在更為復(fù)雜的 __init__ 方法,。這里,,我們沒有構(gòu)建象上例一樣的簡單的、缺乏控件的菜單,,而是構(gòu)建了一個菜單欄,,并附加菜單事件到回調(diào)例程,以及構(gòu)建窗口分割欄,、樹控件和編輯控 件,。您可以撇去這些來看整個工作怎樣。(如果您以前未做過 GUI 編程,,往下看,,您會覺得很困難。)Visual Basic 用一種幕后的方式可以做所有這些,,但如果在文本編輯器僅僅打開表格文件,,您仍然可以看到它。如果您曾用 C/C++ 做過 GUI 工作,,那會覺得很熟悉,。

一旦有構(gòu)造了的窗口,接下來我們就可以來看程序的實際代碼,。首先,,在方法 __init__ 后有兩個用于載入和保存項目文件的方法。在那可以看到 Python 如何用 open 等等來處理文件 I/O,。注意,,事實上, 關(guān)閉 文件是一種輕松的事 -- 正如它所發(fā)生的那樣,,對于 Python 來講,,文件句柄僅僅是內(nèi)存管理的對象,且該對象由計數(shù)器引用,。當(dāng)該引用變?yōu)闊o效時,,Python 知道,并會清除它,,這時文件會自動關(guān)閉,。也有不能完全信任的情形(文件不能自動關(guān)閉),例如,,您將再次打開已寫的文件,,并讀它,。這時,您要明確地關(guān)閉它,。這個問題就是無用信息收集的問題(非 C 的人喜歡討論的問題),。

載入/保存函數(shù)的另一個有趣的特性是他們會碰到由壞文件調(diào)用產(chǎn)生的例外( IOError 例外)。我讓代碼來說明自己,,但那是您如何做的,,孩子們。

新代碼剩下的問題是事件處理程序,,用于處理在程序執(zhí)行過程中所碰到的,。我再次讓程序自己來說明大部分。注意,,使用一般的對話框( wxMessageDialog ,、 wxFileDialogwxTextEntryDialog )來處理許多常規(guī)用戶交互。這些調(diào)用與“常規(guī)”Windows 編程的相應(yīng)用法有一點不同,,這里我只給您一些線索:首先,,對話框是一個由合理的調(diào)用創(chuàng)建的對象,它用 ShowModal() 顯示,,用完后并破壞它,;其次,用戶單擊的按鈕作為返回值從 ShowModal() 返回,,用對話框附屬的方法可得到其它值,。例如,在文件對話框交互期間,,用戶選擇的路徑是作為 dlg.GetPath() 而獲得,。這與 Windows API 的工作方式相當(dāng)不同。正是這樣您知道的,。


文檔狀況

讓我說,,wxWindows API 的文檔處于……開發(fā)中。這個平臺最大的弱點是缺乏好的文檔,,我正在積極地改變這種狀況,。下半年情況會有所好轉(zhuǎn)。同時,,Python 本身有一些好的書籍,,其中 Python 的在線文檔就不差。對于 wxWindows,,C++ 的文檔很好,。有時,在 Python 框架中,,如何使這些文檔合理些,,是相當(dāng)神秘的。在那里,,有一些具體的 Python 注釋,,但在很多情況下,您會發(fā)現(xiàn)必須要讀隨 wxPython 一起的演示代碼,,或者,,必須向郵件列表中的專家詢問您的問題。幸運地是,,這些專家是“有跡可尋”的,。

一旦通過了最初的學(xué)習(xí)曲線,您會覺得這要比在 Windows API 中做同樣的任務(wù)要簡單的多,。相信我,,這份材料是很好的。

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購買等信息,,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請點擊一鍵舉報,。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多