• <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>

            任我行

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

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

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

            函數上面還能是什么呢?內嵌函數^_^,其實python是支持的。不過用起來會讓你吐血的,LGB名稱查找規則。。。(寒)。python是面向對象的,對于面向對象的支持挺好玩的。


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

            比較復雜了吧。如果不熟悉面向對象的概念的,可能會覺得暈。我來解釋一下。所謂面向對象是把數據和操作數據的函數放到同一個類中去,然后用類來創建對象,操作的時候能夠比較方便(很不精確的說法,任何一個OO高手都可以把我罵得屁都不是)。


            類是class關鍵來定義的。class person:就是說定義一個類,名字叫person。

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

            初始化函數
            類可以有自己的初始化函數,每次類被創建的時候(調用person()這樣的語句的時候),都會調用它。這個在C++中的名稱是構造函數。__init__是必須的名字,你不能用其他名字來當初始化函數。但是你可以沒有初始化函數。

            類的數據
            類的數據是所有類產生的對象共享的數據。這里沒有用到類的數據,要寫的話是這樣:


            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

            對象的數據
            對象的數據是用
            self.變量名 = 。。。
            來生成的。這里self.name就是對象的數據。對象的數據和類的數據不同,因為對象之間的數據是互不共享的,而類的數據是被所有由類生成的對象共享的。

            對象的函數(類的函數)
            兩個沒有區別,是類的就是對象的。其實就是類的(我說的是底層實現,不過不用管,如果關心怎么實現的,等我寫Hacking OO吧,還沒影呢)。say_id就是對象的函數,你能夠調用它。每個對象的函數都需要一個self參數,表示[color]這個對象。

            為什么使用面向對象編程
            除去讓人覺得你比較專業外,當然由切實的好處。比較淺顯的是你能夠表達一定的層次關系,類與類之間能夠有包含和繼承的關系(當然你現在還不會。。。)。而且對象能夠把數據和操作數據的函數放在一起,能夠比較清晰。雖然有所謂的數據隱藏的概念,但是在python中其實就是一個不要直接調用對象中的數據的約定,而要用一個函數作為中轉。其實不懂面向對象很正常,其實有的時候就是要在用的中間感悟的。什么時候把用函數編程用牛了,用出個道道來了,說不定你已經感覺到了什么是面向對象編程。另外:所謂什么OO,都是一些認為規定,不用語法支持,只要心中有這個想法(什么想法?自己悟啊),就能夠寫出OO的代碼,不管你用的是什么語言,什么語法。

            Lesson 12 python to exe

            about py2exe

            本文講述如何將一個python源代碼編譯成一個exe.....我會的只是最初步最基本的.....實際上那個py2exe似乎有著更強大的功能

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

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

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

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

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

            btw....等國兩天有了實際應用再來翻譯這些東西

            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.

            相關資料出處....
            http://starship.python.net/crew/theller/py2exe/

            Lesson 13 寫一個簡單的界面很容易

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

            圖形界面的奧秘其實并不深奧。我相信很多人學習windows編程都是從寫一個窗口開始的,而且都是從嘗試理解那個消息和事件驅動的模型入手的。大體的過程是這樣的,窗口就是用象素畫出來的。你可以把一個窗口想象成一個窗口,也可以把窗口看成一堆象素的集合。就像有人說看女色不過是皮肉色相一樣。而且窗口中的按鈕,編輯礦,各種圖標,無論是什么看起來像一個”物體“的東西,其實本質上都是有應用程序或者是庫或者是操作系統調用顯卡的驅動,通過顯卡的功能在屏幕上繪畫一些點出來。而所謂的”物體“有很多稱法,在windows中一般成為控件(control)。

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

            OK,下面來正式的看看怎么在python中創建一個窗口,然后顯示出來。


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

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

            root= Tk(className='bitunion')

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

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

            我們很驚訝的發現窗口變小了,但是其中多了一行字。變小了是因為窗口中已經放了東西了,python的Tkinter非常智能,能夠根據內容自動縮放,而不用和傳統的windows程序一樣,手工的指定絕對坐標了。對于label,它還是一個變量而已。不過這個變量代表了一個標簽,也就是那一行字。而這個label的創建是用Label,而Label的參數是root表明了這個控件是root主窗口的成員控件,或者說是子窗口。label['text']表示設置這個標簽的text屬性為'be on your own',也就是文字內容了。label.pack和root.mainloop一樣費解,但是內涵一樣深刻。你現在可以簡單理解為把label顯示出來的功能,因為你把pack去掉,那你就看不到東西了。其實pack是和控件的布局排版有關西的。

            再添加一個按鈕就能夠有更加豐富的內容了,方法是很類似的。看著吧:

            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這些庫提供的,而button和Button這樣大小寫之間的差別僅僅是巧合,你能夠隨便的給變量取名字,但是Button和Label這些則是需要記住的東西,寫代碼的時候要經常用到的名字。但是點擊按鈕你會比較失望,因為并沒有什么反應。不過也是當然的事情,你并沒有告訴計算機對于這樣一個按鈕的點擊操作需要作出一個什么樣的反應來反饋給用戶。而這個指定作出什么反應的工作只需要一個行,但是作出具體什么樣反應的描述則需要新建一個函數來進行處理。

            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表示對于button(按鈕)的點擊屬性用on_click這個函數來處理。而on_click函數也很簡潔,只是把label的文本重新設置一下。這個完成了一個事件消息的處理,如果用C來寫,需要比這個長更加不好懂的寫法。另外你是否會對on_click中出現label這個變量比較奇怪呢?明明在on_click前面沒有定義label這個變量啊。如果我在C中這么寫程序,編譯器一定會告訴我出錯的。而python是怎么知道label這個變量存在,然后沒有報錯的呢?其實python在你寫的時候根本就不用知道其是否存在,只是要在運行的時候找得到label就可以了。而運行的前后關系,是通過時間來關聯的而不是代碼上前后行的關系。這里由于label = Label(root)先于on_click執行,所以當on_click執行的時候,label就是一個已經定義的變量。如果沒有定義呢?那就報告出錯嘍。

            最后一個例子:

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

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

            The End~~~~~~~~
            欧美粉嫩小泬久久久久久久 | 久久人妻少妇嫩草AV蜜桃| 精品久久久久久99人妻| 亚洲精品成人网久久久久久| 亚洲色婷婷综合久久| 国产高潮国产高潮久久久91| 久久精品国产色蜜蜜麻豆| 热久久这里只有精品| 亚洲欧洲日产国码无码久久99| 久久精品无码一区二区三区| 久久久高清免费视频| Xx性欧美肥妇精品久久久久久| 色婷婷久久久SWAG精品| 精品午夜久久福利大片| 久久精品免费一区二区| 久久性生大片免费观看性| 99久久国语露脸精品国产| 久久久久久精品成人免费图片| 99久久国产综合精品成人影院| 久久人人爽人人爽人人片AV不| 亚洲精品无码久久久久AV麻豆| 日本道色综合久久影院| 91视频国产91久久久| 久久精品夜夜夜夜夜久久| 久久天天躁狠狠躁夜夜不卡| 久久人人爽人人澡人人高潮AV | 日日躁夜夜躁狠狠久久AV| 亚洲日韩欧美一区久久久久我| 2020最新久久久视精品爱| 97久久精品无码一区二区| 少妇人妻88久久中文字幕| 综合网日日天干夜夜久久| 久久SE精品一区二区| 久久久久se色偷偷亚洲精品av| 麻豆久久久9性大片| 91麻豆国产精品91久久久| 久久亚洲AV无码精品色午夜麻豆| 久久夜色精品国产www| 日本精品久久久久影院日本 | 美女久久久久久| 久久人人青草97香蕉|