• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            任我行

            一天一個(gè)腳印......
            每日一句:
            posts - 54, comments - 218, trackbacks - 1, articles - 0
              C++博客 :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

            Python完全新手教程(lesson11-lesson13)

            Posted on 2005-10-11 16:41 任我行 閱讀(1020) 評(píng)論(0)  編輯 收藏 引用 所屬分類: Python
            Lesson 11 走向模塊化的第二步

            函數(shù)上面還能是什么呢??jī)?nèi)嵌函數(shù)^_^,其實(shí)python是支持的。不過用起來會(huì)讓你吐血的,LGB名稱查找規(guī)則。。。(寒)。python是面向?qū)ο蟮?,?duì)于面向?qū)ο蟮闹С滞猛娴摹?BR>

            class person:
                def __init__(self):
                    self.name = 'taowen'
                    self.id = 20022479
                def say_id(self):
                    print "%s's id is %d" % (self.name, self.id)


            me = person()
            me.say_id()

            比較復(fù)雜了吧。如果不熟悉面向?qū)ο蟮母拍畹?,可能?huì)覺得暈。我來解釋一下。所謂面向?qū)ο笫前褦?shù)據(jù)和操作數(shù)據(jù)的函數(shù)放到同一個(gè)類中去,然后用類來創(chuàng)建對(duì)象,操作的時(shí)候能夠比較方便(很不精確的說法,任何一個(gè)OO高手都可以把我罵得屁都不是)。


            類是class關(guān)鍵來定義的。class person:就是說定義一個(gè)類,名字叫person。

            對(duì)象
            對(duì)象是用類來產(chǎn)生的。所以me就是對(duì)象,產(chǎn)生的辦法就是像調(diào)用函數(shù)一樣,person(),而且()中是能夠放參數(shù)的,什么時(shí)候要參數(shù),看下面的“初始化函數(shù)“

            初始化函數(shù)
            類可以有自己的初始化函數(shù),每次類被創(chuàng)建的時(shí)候(調(diào)用person()這樣的語句的時(shí)候),都會(huì)調(diào)用它。這個(gè)在C++中的名稱是構(gòu)造函數(shù)。__init__是必須的名字,你不能用其他名字來當(dāng)初始化函數(shù)。但是你可以沒有初始化函數(shù)。

            類的數(shù)據(jù)
            類的數(shù)據(jù)是所有類產(chǎn)生的對(duì)象共享的數(shù)據(jù)。這里沒有用到類的數(shù)據(jù),要寫的話是這樣:


            class person:
                school = 'bit'
                def __init__(self):
                    self.name = 'taowen'
                    self.id = 20022479
                def say_id(self):
                    print "%s's id is %d" % (self.name, self.id)


            me = person()
            me.say_id()
            print me.school

            對(duì)象的數(shù)據(jù)
            對(duì)象的數(shù)據(jù)是用
            self.變量名 = 。。。
            來生成的。這里self.name就是對(duì)象的數(shù)據(jù)。對(duì)象的數(shù)據(jù)和類的數(shù)據(jù)不同,因?yàn)閷?duì)象之間的數(shù)據(jù)是互不共享的,而類的數(shù)據(jù)是被所有由類生成的對(duì)象共享的。

            對(duì)象的函數(shù)(類的函數(shù))
            兩個(gè)沒有區(qū)別,是類的就是對(duì)象的。其實(shí)就是類的(我說的是底層實(shí)現(xiàn),不過不用管,如果關(guān)心怎么實(shí)現(xiàn)的,等我寫Hacking OO吧,還沒影呢)。say_id就是對(duì)象的函數(shù),你能夠調(diào)用它。每個(gè)對(duì)象的函數(shù)都需要一個(gè)self參數(shù),表示[color]這個(gè)對(duì)象。

            為什么使用面向?qū)ο缶幊?BR>除去讓人覺得你比較專業(yè)外,當(dāng)然由切實(shí)的好處。比較淺顯的是你能夠表達(dá)一定的層次關(guān)系,類與類之間能夠有包含和繼承的關(guān)系(當(dāng)然你現(xiàn)在還不會(huì)。。。)。而且對(duì)象能夠把數(shù)據(jù)和操作數(shù)據(jù)的函數(shù)放在一起,能夠比較清晰。雖然有所謂的數(shù)據(jù)隱藏的概念,但是在python中其實(shí)就是一個(gè)不要直接調(diào)用對(duì)象中的數(shù)據(jù)的約定,而要用一個(gè)函數(shù)作為中轉(zhuǎn)。其實(shí)不懂面向?qū)ο蠛苷?,其?shí)有的時(shí)候就是要在用的中間感悟的。什么時(shí)候把用函數(shù)編程用牛了,用出個(gè)道道來了,說不定你已經(jīng)感覺到了什么是面向?qū)ο缶幊?。另外:所謂什么OO,都是一些認(rèn)為規(guī)定,不用語法支持,只要心中有這個(gè)想法(什么想法?自己悟啊),就能夠?qū)懗鯫O的代碼,不管你用的是什么語言,什么語法。

            Lesson 12 python to exe

            about py2exe

            本文講述如何將一個(gè)python源代碼編譯成一個(gè)exe.....我會(huì)的只是最初步最基本的.....實(shí)際上那個(gè)py2exe似乎有著更強(qiáng)大的功能

            1:下載安裝py2exe.....from http://twh@bitunion.org
            2:假設(shè)你寫好了一個(gè)python程序....guess_number.py.......存在了c:\Python23\下面
            3:再寫一個(gè)setup.py....也存在c:\Python23\下面......內(nèi)容如下

            # setup.py
            from distutils.core import setup
            import py2exe

            setup(name="guess_number",
                  scripts=["guess_number.py"],
            )

            其中name和scripts是需要你到時(shí)候具體修改的....

            4:找到windows的dos模式(命令提示符).....或者自己做個(gè)快捷方式也可以....
            C:\Python23>
            C:\Python23>python setup.py py2exe
            構(gòu)造就開始了....
            幾秒鐘以后....
            在你的C:\Python23就會(huì)出現(xiàn)兩個(gè)文件夾build和dist,前面那個(gè)里面似乎是源程序(這個(gè)我不太清楚)....dist里面的就是編譯好的.exe了.....ok....

            btw....等國(guó)兩天有了實(shí)際應(yīng)用再來翻譯這些東西

            Specifying additional files
            Some applications need additional files at runtime, this maybe configuration files, fonts, bitmaps, whatever.

            py2exe can copy these files into subdirectories of dist\myscript if they are specified in the setup script with the data_files option. data_files should contain a sequence of (target-dir, files) tuples, where files is a sequence of files to be copied.

            Here's an example:
            # setup.py
            from distutils.core import setup
            import glob
            import py2exe

            setup(name="myscript",
                  scripts=["myscript.py"],
                  data_files=[("bitmaps",
                               ["bm/large.gif", "bm/small.gif"]),
                              ("fonts",
                               glob.glob("fonts\\*.fnt"))],
            )

            This would create a subdirectory bitmaps in dist\myscript, containing the two bitmaps, and a subdirectory fonts, containing all the *.fnt files.

            相關(guān)資料出處....
            http://starship.python.net/crew/theller/py2exe/

            Lesson 13 寫一個(gè)簡(jiǎn)單的界面很容易

            圖形界面是非常有吸引力的東西。但是制作出來似乎不是那么容易,這個(gè)觀點(diǎn)對(duì)于用C來笨拙寫windows的窗口程序來說,是比較正確的。微軟公司出品的windows是一個(gè)圖形界面的操作系統(tǒng),這個(gè)和dos或者linux這些不一樣,他們一開始出來是針對(duì)字符界面的,然后再在上面加上一些庫(kù)來提供圖形的功能。windows則不同,它是包含在自己的最原始的功能之中,而這些圖形功能的提供是在user32.dll這樣的system目錄下的dll文件中以函數(shù)導(dǎo)出的形式提供的,但是要使用這些東西必須使用c語言的函數(shù)接口,而且編寫麻煩。有一個(gè)很大的wndproc中要填入所有的事件處理代碼,非常丑陋。而作為腳本語言,所應(yīng)該有的簡(jiǎn)潔性,python對(duì)這個(gè)進(jìn)行了封裝。但是事情不是如你所想象。中間過程非常復(fù)雜,而且python用的也不是自己的庫(kù),還是tcl的一個(gè)tk的庫(kù)再封裝了一次。雖然經(jīng)過層層封裝,裹得非常嚴(yán)實(shí),但是除了影響其在比較高性能的圖形場(chǎng)合下的應(yīng)用之外,并沒有帶來太大的麻煩。你能夠用很少的代碼,來完成其他語言+庫(kù)要很大行代碼才能表達(dá)的圖形樣式,雖然非常簡(jiǎn)陋,不過足夠使用。而且python除了自己原包裝帶的這個(gè)tkinter庫(kù)之外,還有其他的第三方的選擇,比較豐富,而且也有能夠勝任各種應(yīng)用的選擇。甚至,還有opengl和directx的庫(kù)的封裝庫(kù),能夠用來編寫2d和3d的游戲,這個(gè)非常的誘人哦。但是我不會(huì),

            圖形界面的奧秘其實(shí)并不深?yuàn)W。我相信很多人學(xué)習(xí)windows編程都是從寫一個(gè)窗口開始的,而且都是從嘗試?yán)斫饽莻€(gè)消息和事件驅(qū)動(dòng)的模型入手的。大體的過程是這樣的,窗口就是用象素畫出來的。你可以把一個(gè)窗口想象成一個(gè)窗口,也可以把窗口看成一堆象素的集合。就像有人說看女色不過是皮肉色相一樣。而且窗口中的按鈕,編輯礦,各種圖標(biāo),無論是什么看起來像一個(gè)”物體“的東西,其實(shí)本質(zhì)上都是有應(yīng)用程序或者是庫(kù)或者是操作系統(tǒng)調(diào)用顯卡的驅(qū)動(dòng),通過顯卡的功能在屏幕上繪畫一些點(diǎn)出來。而所謂的”物體“有很多稱法,在windows中一般成為控件(control)。

            而對(duì)于圖形界面的操控一般是通過鼠標(biāo)和鍵盤來完成的。鼠標(biāo)在屏幕上有一個(gè)自己的形象,那就是一個(gè)箭頭(當(dāng)然你也可以調(diào)整這個(gè)圖形為其他好玩的東西,it is your freedom)。而鍵盤呢則一般表示為一個(gè)虛線的框,表示這個(gè)是鍵盤的”焦點(diǎn)“所在的地方。或者是編輯框中閃動(dòng)的豎杠。這兩點(diǎn)中有一個(gè)共同點(diǎn),就是都有一個(gè)位置來確定要操作的對(duì)象。你點(diǎn)下鼠標(biāo)的時(shí)候,你操作的就是鼠標(biāo)的箭頭尖端指向的那個(gè)空間,而鍵盤按下也是在其焦點(diǎn)所在的控件那兒放聲。發(fā)生的是什么呢?發(fā)生的過程從硬件層面到軟件層面之后,最終是被操作系統(tǒng)接收。操作系統(tǒng)能夠知道你是點(diǎn)擊的是鼠標(biāo)還是鍵盤,在什么一個(gè)地方點(diǎn)下的,而且按下的是左鍵還是右鍵。操作系統(tǒng)還知道當(dāng)前窗口各處擺放的位置。綜合各路的信息,操作系統(tǒng)就能夠知道把這個(gè)”事件“作為”消息“發(fā)送給哪個(gè)窗口來處理。從中應(yīng)該能夠明白什么叫事件,而消息呢則是一個(gè)C中的結(jié)構(gòu)體,其中有幾個(gè)field中間放了有關(guān)這個(gè)事件的信息,然后就像一封信一樣從操作系統(tǒng)投遞到了窗口所在的應(yīng)用程序。然后應(yīng)用程序有一個(gè)事先注冊(cè)的”窗口過程“,其實(shí)就是一個(gè)函數(shù),用來接收這封“信”。其實(shí)就是接收到傳過來的參數(shù)。然后再進(jìn)行一些判斷,作出一定的響應(yīng)。這個(gè)就是所謂的事件驅(qū)動(dòng)。在沒有冗長(zhǎng)的代碼,和展示所有細(xì)節(jié)的情況下,如果你真的以前對(duì)這個(gè)過程一無所知,肯定會(huì)覺得非常茫然。這個(gè)一筆帶過的敘述其實(shí)只是讓你有一個(gè)感性的認(rèn)識(shí)。其實(shí)在python中使用窗口根本不用管諸葛么多。基本上只是把自己要的窗口和控件,給一些位置的參數(shù),一些文字的提示內(nèi)容的參數(shù)就能把窗口擺好,顯示出來。然后再通過代碼告訴python,當(dāng)“這個(gè)按鈕按下的時(shí)候執(zhí)行這個(gè)函數(shù)”,然后就能讓窗口有響應(yīng)。最后記得給一個(gè)退出窗口的辦法就一切OK了。其中能省的復(fù)雜度基本上都被庫(kù)給隱藏掉了。付出的代價(jià)是慢一些,但是我就不相信你能感覺出來,除非你用的電腦連vcd都看不流暢。所以大可放心的享受這種便利。

            OK,下面來正式的看看怎么在python中創(chuàng)建一個(gè)窗口,然后顯示出來。


            from Tkinter import *
            root = Tk()
            root.mainloop()

            就3行就能夠把主窗口顯示出來了。root是一個(gè)變量名稱,其代表了這個(gè)主窗口。以后創(chuàng)建控件的時(shí)候指定控件創(chuàng)建在什么窗口之中,就要用這個(gè)root來表示了。而Tk()是一個(gè)Tkinter庫(kù)之中的函數(shù)(其實(shí)是類的構(gòu)造函數(shù),構(gòu)造了一個(gè)對(duì)象)。而mainloop則是主窗口的成員函數(shù),也就是表示讓這個(gè)root工作起來,開始接收鼠標(biāo)的和鍵盤的操作。你現(xiàn)在就能夠通過鼠標(biāo)縮放以及關(guān)閉這個(gè)窗口了。注意到窗口的標(biāo)題是tk,我們可以進(jìn)行一些修改

            root= Tk(className='bitunion')

            然后窗口的標(biāo)題就變成了bitunion了。下面要作的是把這個(gè)窗口的內(nèi)容填充一下,讓其有一些東西。先加入一個(gè)標(biāo)簽,所謂標(biāo)簽就是一行字。

            from Tkinter import *
            root = Tk(className='bitunion')
            label = Label(root)
            label['text'] = 'be on your own'
            label.pack()
            root.mainloop()

            我們很驚訝的發(fā)現(xiàn)窗口變小了,但是其中多了一行字。變小了是因?yàn)榇翱谥幸呀?jīng)放了東西了,python的Tkinter非常智能,能夠根據(jù)內(nèi)容自動(dòng)縮放,而不用和傳統(tǒng)的windows程序一樣,手工的指定絕對(duì)坐標(biāo)了。對(duì)于label,它還是一個(gè)變量而已。不過這個(gè)變量代表了一個(gè)標(biāo)簽,也就是那一行字。而這個(gè)label的創(chuàng)建是用Label,而Label的參數(shù)是root表明了這個(gè)控件是root主窗口的成員控件,或者說是子窗口。label['text']表示設(shè)置這個(gè)標(biāo)簽的text屬性為'be on your own',也就是文字內(nèi)容了。label.pack和root.mainloop一樣費(fèi)解,但是內(nèi)涵一樣深刻。你現(xiàn)在可以簡(jiǎn)單理解為把label顯示出來的功能,因?yàn)槟惆裵ack去掉,那你就看不到東西了。其實(shí)pack是和控件的布局排版有關(guān)西的。

            再添加一個(gè)按鈕就能夠有更加豐富的內(nèi)容了,方法是很類似的??粗桑?BR>
            from Tkinter import *
            root = Tk(className='bitunion')
            label = Label(root)
            label['text'] = 'be on your own'
            label.pack()
            button = Button(root)
            button['text'] = 'change it'
            button.pack()
            root.mainloop()

            只不過把button替換了label而Button替換了Label。注意一下Button和Label這些都是Tkinter這些庫(kù)提供的,而button和Button這樣大小寫之間的差別僅僅是巧合,你能夠隨便的給變量取名字,但是Button和Label這些則是需要記住的東西,寫代碼的時(shí)候要經(jīng)常用到的名字。但是點(diǎn)擊按鈕你會(huì)比較失望,因?yàn)椴]有什么反應(yīng)。不過也是當(dāng)然的事情,你并沒有告訴計(jì)算機(jī)對(duì)于這樣一個(gè)按鈕的點(diǎn)擊操作需要作出一個(gè)什么樣的反應(yīng)來反饋給用戶。而這個(gè)指定作出什么反應(yīng)的工作只需要一個(gè)行,但是作出具體什么樣反應(yīng)的描述則需要新建一個(gè)函數(shù)來進(jìn)行處理。

            from Tkinter import *
            def on_click():
                label['text'] = 'no way out'
            root = Tk(className='bitunion')
            label = Label(root)
            label['text'] = 'be on your own'
            label.pack()
            button = Button(root)
            button['text'] = 'change it'
            button['command'] = on_click
            button.pack()
            root.mainloop()

            button['command'] = on_click表示對(duì)于button(按鈕)的點(diǎn)擊屬性用on_click這個(gè)函數(shù)來處理。而on_click函數(shù)也很簡(jiǎn)潔,只是把label的文本重新設(shè)置一下。這個(gè)完成了一個(gè)事件消息的處理,如果用C來寫,需要比這個(gè)長(zhǎng)更加不好懂的寫法。另外你是否會(huì)對(duì)on_click中出現(xiàn)label這個(gè)變量比較奇怪呢?明明在on_click前面沒有定義label這個(gè)變量啊。如果我在C中這么寫程序,編譯器一定會(huì)告訴我出錯(cuò)的。而python是怎么知道label這個(gè)變量存在,然后沒有報(bào)錯(cuò)的呢?其實(shí)python在你寫的時(shí)候根本就不用知道其是否存在,只是要在運(yùn)行的時(shí)候找得到label就可以了。而運(yùn)行的前后關(guān)系,是通過時(shí)間來關(guān)聯(lián)的而不是代碼上前后行的關(guān)系。這里由于label = Label(root)先于on_click執(zhí)行,所以當(dāng)on_click執(zhí)行的時(shí)候,label就是一個(gè)已經(jīng)定義的變量。如果沒有定義呢?那就報(bào)告出錯(cuò)嘍。

            最后一個(gè)例子:

            from Tkinter import *
            def on_click():
                label['text'] = text.get()

            root = Tk(className='bitunion')
            label = Label(root)
            label['text'] = 'be on your own'
            label.pack()
            text = StringVar()
            text.set('change to what?')
            entry = Entry(root)
            entry['textvariable'] = text
            entry.pack()
            button = Button(root)
            button['text'] = 'change it'
            button['command'] = on_click
            button.pack()
            root.mainloop()

            這個(gè)就比較復(fù)雜了。里面有一個(gè)StringVar。這個(gè)代表一個(gè)字符串,但是跟一般字符串不一樣。一般的這樣'dfsdf'的字符串是不可變的,你只能把變量指定為不同的字符串,但是字符串本身的內(nèi)容是不可改變的。而StringVar則是可變的字符串。所以了set和get來設(shè)置和取得其內(nèi)容。主要是entry(單行輸入框)要求一個(gè)這樣的屬性來設(shè)置和接收其輸入框的內(nèi)容。一開始可能不習(xí)慣,但是用多了之后會(huì)覺得很方便的,因?yàn)橹灰眠@個(gè)變量text,就能一直得到當(dāng)前輸入框的內(nèi)容。當(dāng)你能夠完整的把這個(gè)例子看懂的時(shí)候,你已經(jīng)入門了。但是離自己寫一個(gè)有窗口的應(yīng)用程序還有一定距離。主要是缺少更加豐富的控件和事件響應(yīng)的處理能力,以及合理排版布局的能力。這個(gè)下次再說。

            The End~~~~~~~~
            一本一道久久a久久精品综合| 久久99免费视频| 国产精品99久久精品爆乳| 久久99久久99精品免视看动漫| 久久久久免费精品国产| 久久天天躁夜夜躁狠狠| 伊人久久大香线蕉综合热线| 无夜精品久久久久久| 精品无码久久久久久久动漫| 久久99精品久久久久久不卡| 久久婷婷五月综合色99啪ak| 久久久久亚洲AV无码专区网站| 免费一级欧美大片久久网| 亚洲七七久久精品中文国产| 久久精品国产乱子伦| 久久精品无码一区二区无码| 青青青伊人色综合久久| 亚洲成人精品久久| 久久综合日本熟妇| 亚洲国产另类久久久精品| 国产精品99久久免费观看| 久久国产免费观看精品| 久久国产香蕉一区精品| 欧美国产成人久久精品| 国产成人久久AV免费| 久久99精品久久久久久噜噜| 国产99久久久国产精品小说| 久久精品午夜一区二区福利| 久久精品综合一区二区三区| 国产aⅴ激情无码久久| 久久香蕉一级毛片| 亚洲精品国精品久久99热| 久久丫精品国产亚洲av| 久久久久婷婷| 国产成人久久精品一区二区三区| 久久久久一级精品亚洲国产成人综合AV区| 久久人人爽人人爽人人av东京热| 97久久超碰国产精品2021| 日日狠狠久久偷偷色综合96蜜桃| 久久w5ww成w人免费| 99久久国产亚洲综合精品|