Python程序設(shè)計基礎(chǔ) 課件 第8-10章 圖形用戶界面設(shè)計、數(shù)據(jù)分析與可視化、網(wǎng)絡(luò)爬蟲_第1頁
Python程序設(shè)計基礎(chǔ) 課件 第8-10章 圖形用戶界面設(shè)計、數(shù)據(jù)分析與可視化、網(wǎng)絡(luò)爬蟲_第2頁
Python程序設(shè)計基礎(chǔ) 課件 第8-10章 圖形用戶界面設(shè)計、數(shù)據(jù)分析與可視化、網(wǎng)絡(luò)爬蟲_第3頁
Python程序設(shè)計基礎(chǔ) 課件 第8-10章 圖形用戶界面設(shè)計、數(shù)據(jù)分析與可視化、網(wǎng)絡(luò)爬蟲_第4頁
Python程序設(shè)計基礎(chǔ) 課件 第8-10章 圖形用戶界面設(shè)計、數(shù)據(jù)分析與可視化、網(wǎng)絡(luò)爬蟲_第5頁
已閱讀5頁,還剩135頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

第八章圖形用戶界面設(shè)計早期的計算機(jī)工作界面就如現(xiàn)在的“控制臺應(yīng)用”一般,并無圖形用戶界面,甚至不是多線程多任務(wù)的工作環(huán)境。計算機(jī)處理器技術(shù)和顯示技術(shù)的發(fā)展,推動了圖形用戶界面(GraphicalUserInterface)的蓬勃發(fā)展。Windows視窗操作系統(tǒng)就是一個典型的圖形用戶界面系統(tǒng),圖形用戶界面使計算機(jī)操作變得友好且直觀。第八章圖形用戶界面設(shè)計圖形用戶界面按其作用不同主要分為兩類:其一,作為程序的控制和顯示界面而存在的圖形用戶界面,例如,窗體和控件等;其二,作為計算結(jié)果而存在的圖形用戶界面,例如,畫布和圖形等。Python語言中,實(shí)現(xiàn)圖形用戶界面設(shè)計的包稱為Tkinter,而且Tkinter是Python自帶的一個標(biāo)準(zhǔn)GUI包。本章主要介紹借助于Tkinter進(jìn)行圖形用戶界面設(shè)計的技巧。本章將分別用六節(jié)來介紹借助于Tkinter進(jìn)行圖形用戶界面設(shè)計的技巧:8.1視窗設(shè)計 8.4常用控件8.2界面布局設(shè)計 8.5畫布與繪圖技術(shù)8.3“復(fù)數(shù)計算器”程序算法設(shè)計 8.6事件綁定與自定義事件第八章圖形用戶界面設(shè)計下面是使用Tkinter進(jìn)行圖形用戶界面設(shè)計,創(chuàng)建一個空的窗體的程序:8.1視窗設(shè)計第1行裝載tkinter包,并賦以別名tk。第3行“mainform=tk.Tk()”創(chuàng)建一個Tk類的窗口對象,賦給mainform。第4行“mainform.title('復(fù)數(shù)計算器')”設(shè)置mainform窗口的標(biāo)題為“復(fù)數(shù)計算器”。第5行“mainform.geometry('500x300+100+100')”設(shè)置窗口的大小為寬500像素點(diǎn)、高300像素點(diǎn)、窗口左上角(x,y)為(100,100),大小格式為“寬度x高度+左上角x坐標(biāo)+左上角y坐標(biāo)”(其中,“寬度x高度”中間的“x”為小寫的字母x)。第6行“mainform.mainloop()”調(diào)用mainloop函數(shù)啟動窗口,等待系統(tǒng)發(fā)送事件。圖形用戶界面程序的設(shè)計方法為:(1)設(shè)為主窗口,并為主窗口設(shè)為標(biāo)題(和圖標(biāo));(2)在主窗口上放置各類控件,有些控件本身是容器類控件(用于擺放其他控件),然后,為這些控件編寫事件響應(yīng)程序;(3)啟動窗口后,等待操作系統(tǒng)向窗口發(fā)送消息或觸發(fā)特定的事件,程序收到事件后執(zhí)行相應(yīng)的任務(wù)。因此,圖形用戶界面程序啟動后,一直處于等待外部事件和輸入(包括鍵盤和鼠標(biāo)輸入等)的狀態(tài),直接收到外部輸入(事件),將執(zhí)行相應(yīng)的功能。8.1視窗設(shè)計接下來的實(shí)例,將在類的基礎(chǔ)上實(shí)現(xiàn)空窗體的創(chuàng)建(功能與上一個實(shí)例相同):8.1視窗設(shè)計第1行裝載包tkinter,并賦以別名tk。第2~6行定義類MainForm,繼承了父類tk.Tk,MainForm作為主窗口控件(也稱主窗體)。第3~6行為類MainForm的構(gòu)造方法。第4行“super().__init__()”調(diào)用父類的構(gòu)造方法;第5行“self.title('復(fù)數(shù)計算器')”設(shè)置主窗口的標(biāo)題為“復(fù)數(shù)計算器”。第6行“self.geometry('500x300+100+100')”設(shè)置主窗口的大小為500×300,左上角的坐標(biāo)為(100,100),這里的“+100+100”可以省略,由系統(tǒng)確定窗口的位置。第8行“mainform=MainForm()”調(diào)用MainForm類定義窗口對象mainform。第9行“mainform.mainloop()”啟動圖形用戶界面程序,等待用戶輸入或系統(tǒng)事件。視窗常用的方法還有:(1)configure用于設(shè)置窗口樣式,其中最常用的參數(shù)為bg,為設(shè)置窗口背景色,例如:mainform.configure(bg='lightblue')將在上述實(shí)例代碼中插入該語句,可將窗口mainform的背景設(shè)為淡藍(lán)色。(2)iconbitmap用于設(shè)置窗口的圖像,例如:mainform.iconbitmap('fly.ico')

在當(dāng)前的工程目錄下要有圖標(biāo)fly.ico文件(可使用HyperSnap7抓圖軟件隨意抓一幅圖片,將大小修改為128*128,然后,另存為fly.ico文件),在前面實(shí)例中插入相應(yīng)的語句,將使得標(biāo)題欄的圖標(biāo)變?yōu)閒ly.ico表示的圖像。8.1視窗設(shè)計注意:圖標(biāo)文件的擴(kuò)展名為.ico。(3)resizable用于設(shè)置窗口是否可調(diào)整大小,具有兩個參數(shù),第一個參數(shù)為真,則窗口寬度可調(diào)大小,為假,則窗口寬度大小不可調(diào);第二參數(shù)為真,則窗口高度可調(diào)節(jié)大小,為假,則高度不可調(diào)節(jié)大小。例如,mainform.resizable(False,False)在前面的實(shí)例中插入上述語句,即可將窗口大小設(shè)置為不可調(diào)節(jié)。8.1視窗設(shè)計現(xiàn)在擬在前兩個實(shí)例的基礎(chǔ)上,設(shè)計一個“復(fù)數(shù)計算器”,其界面設(shè)計如下圖:8.2界面布局設(shè)計首先來了解復(fù)數(shù)計算器工作界面包含的控件:8.2界面布局設(shè)計現(xiàn)在擬在前兩個實(shí)例的基礎(chǔ)上,設(shè)計一個“復(fù)數(shù)計算器”,其界面設(shè)計如下圖:8.2界面布局設(shè)計8.2界面布局設(shè)計復(fù)數(shù)計算器實(shí)現(xiàn)代碼(第一部分):第1行裝載包tkinter,并賦以別名tk。第2~6行定義類MainForm,繼承了父類tk.Tk,MainForm作為主窗口控件(也稱主窗體)。第3~6行為類MainForm的構(gòu)造方法。第4行“super().__init__()”調(diào)用父類的構(gòu)造方法;第5行“self.title('復(fù)數(shù)計算器')”設(shè)置主窗口的標(biāo)題為“復(fù)數(shù)計算器”。第6行“self.geometry('500x300+100+100')”設(shè)置主窗口的大小為500×300,左上角的坐標(biāo)為(100,100),這里的“+100+100”可以省略,由系統(tǒng)確定窗口的位置。第7行設(shè)置窗口大小不可調(diào)整。第8行調(diào)用myinitgui方法設(shè)置窗口內(nèi)的各個控件。8.2界面布局設(shè)計(第二部分):定義myinitgui方法,用于布局窗口中的各個控件。這里將各個控件均設(shè)為self的成員。第11~15行為創(chuàng)建靜態(tài)文本框控件,顯示“復(fù)數(shù)A:”;調(diào)用控件label1的place方法,將控件放置在窗口內(nèi)部坐標(biāo)(30,15)處,因?yàn)檎Z窗口大小被鎖定,所以這里使用了絕對坐標(biāo)和絕對大小。接著定義tk模塊的字符串變量對象,用于編輯框Entry或靜態(tài)文本框Label中的顯示內(nèi)容。創(chuàng)建編輯框?qū)ο髎txt1,并顯示txt1中的內(nèi)容,用于輸入第1個復(fù)數(shù)。最后設(shè)置stxt1編輯框?qū)ο蟮娘@示位置、寬度和高度。用相同的方法創(chuàng)建“復(fù)數(shù)B”相關(guān)控件。8.2界面布局設(shè)計(第三部分):第23~24行定義靜態(tài)文本框label3,顯示內(nèi)容為“計算結(jié)果:”,“background='#20B2AA',”用于設(shè)定背景色,顏色的表示為“#RRGGBB”?!癴oreground='white'”用于設(shè)定前景色為白色,可以使用系統(tǒng)能識別的顏色英文單詞,例如,blue、red等,可以縮寫為“fg='white'”。第25行調(diào)用label3的place方法放置靜態(tài)文本框。第26行定義tk模塊的字符串變量對象txt3,用于保存編輯框(或靜態(tài)文本框)中的內(nèi)容。第27行定義編輯框stxt3,顯示內(nèi)容為txt3,只讀的背景為淺藍(lán)色。第28行設(shè)置stxt3編輯框?yàn)橹蛔x控件。第29行在窗口中放置stxt3控件。第30行“self.txt3.set(str(0))”設(shè)置顯示內(nèi)容為0。8.2界面布局設(shè)計(第四部分):第32行定義帶標(biāo)簽的框架checkboxgroup,用作兩個復(fù)選框的容器。第33行在窗口中放置框架checkboxgroup。第34行定義兩個復(fù)選框的數(shù)據(jù)列表checkboxvalue,每個復(fù)選框的數(shù)據(jù)為tk模塊的IntVar對象(稱為整型變量對象)。第35行“定義列表checkboxtitle作為兩個復(fù)選框顯示的內(nèi)容。第36~39行為一個for結(jié)構(gòu),循環(huán)兩次設(shè)置兩個復(fù)選框的標(biāo)題和內(nèi)容。第39行“cb.pack(anchor=tk.W)”調(diào)用cb的pack方法放置復(fù)選框,這里的參數(shù)“anchor=tk.W”表示左對齊,“W”是“West”的首字母。8.2界面布局設(shè)計(第五部分):第41行定義一個帶標(biāo)簽“運(yùn)算方式”的框架radiogroup,用作四個單選鈕的容器。第42行放置框架radiogroup。四個單選鈕為一組,每次只能有一個被選中,需要為這四個單選鈕設(shè)定一個共享的取值對象,設(shè)定一個radiovalue對象。第44行設(shè)定radiovalue的值為1,由第45~47行可知,四個單選鈕的值(value)依次為1、2、3、4,所以,這里radiovalue的值為1表示value值為1的單選鈕被選中。第45~47行為一個for結(jié)構(gòu),用于設(shè)置四個單選鈕的顯示內(nèi)容和(選中時的)返回值。第47行將每個單選鈕居中放置。8.2界面布局設(shè)計(第六部分):第49行定義命令按鈕btn1,顯示“計算”,當(dāng)按下該按鈕時,調(diào)用函數(shù)btn1cal。這種按下按鈕將調(diào)用的函數(shù),稱為“回調(diào)函數(shù)”,這是因?yàn)楹瘮?shù)定義好后,在系統(tǒng)中“注冊”了,所謂“注冊”是指該函數(shù)與特定的事件相關(guān)聯(lián),例如,使一個函數(shù)與鼠標(biāo)的左鍵被按下相關(guān)聯(lián),這樣,當(dāng)系統(tǒng)識別到鼠標(biāo)左鍵被按下時,將調(diào)用相關(guān)的被“注冊”好的函數(shù),這個過程必須有操作系統(tǒng)的干預(yù),因此,稱為“回調(diào)”。這里的btn1cal函數(shù)也是“回調(diào)函數(shù)”,表面上沒有調(diào)用入口,實(shí)質(zhì)上是由操作系統(tǒng)認(rèn)別到btn1被單擊時,操作系統(tǒng)調(diào)用的。這里的“command=self.btn1cal”執(zhí)行的是“注冊”函數(shù)的過程。第50行擺放命令按鈕btn1。8.2界面布局設(shè)計(第七部分):第52行定義文本框btxt。第53行放置文本框btxt。第54~65行向文本框btxt內(nèi)寫入顯示內(nèi)容,其中的“INSERT”表示從當(dāng)前光標(biāo)位置插入文本。第66行將btxt設(shè)為“不使能”(即不可編輯、不接收光標(biāo)(或焦點(diǎn)))。8.2界面布局設(shè)計(第八部分):第68~69行定義方法btn1cal,內(nèi)容為空。第72行“mainform=MainForm()”創(chuàng)建MainForm類的對象mainform。第73行“mainform.mainloop()”調(diào)用mainloop方法,使圖形用戶界面程序進(jìn)行等待事件(或消息)狀態(tài)。圖形用戶界面程序的最后一條語句一定是調(diào)用mainloop方法,將程序的控制權(quán)交給操作系統(tǒng),由操作系統(tǒng)管理用戶輸入或鼠標(biāo)按鍵,并將這個輸入轉(zhuǎn)化為事件(或消息),觸發(fā)圖形用戶界面程序中的相應(yīng)控件執(zhí)行相關(guān)的“回調(diào)”函數(shù)(或方法),并輸出執(zhí)行結(jié)果。在上一個實(shí)例的方法myinitgui中,將其中的各個控件均作為self的成員,這是一種標(biāo)準(zhǔn)的設(shè)計方法,但由各個控件創(chuàng)建好后本身不需要管理,所以,可以將各個控件設(shè)為方法中的局部“變量”,只需要將各個控件的數(shù)據(jù)相關(guān)的對象作為self的成員即可。例如,上一個實(shí)例的第14~15行:14self.stxt1=tk.Entry(self,textvariable=self.txt1)15self.stxt1.place(x=100,y=15,width=170,height=20)可以寫為:14stxt1=tk.Entry(self,textvariable=self.txt1)15stxt1.place(x=100,y=15,width=170,height=20)進(jìn)一步可以寫為一行,即:tk.Entry(self,textvariable=self.txt1).place(x=100,y=15,width=170,height=20)8.3“復(fù)數(shù)計算器”程序算法設(shè)計按照上述方法重新改寫了上一個實(shí)例。同時,在代碼中添加了方法btn1cal的代碼,完成了兩個復(fù)數(shù)間的四則運(yùn)算。8.3“復(fù)數(shù)計算器”程序算法設(shè)計(修改部分):下面是修改btn1cal()方法的定義。8.3“復(fù)數(shù)計算器”程序算法設(shè)計第66~90行為方法btn1cal,使用了try-except-else結(jié)構(gòu)。try部分為第68~69行,第68行讀取txt1編輯框中的數(shù)據(jù)并轉(zhuǎn)化為復(fù)數(shù),保存在a中,這里的“get”方法用于獲取控件的內(nèi)容。第69行讀取txt2編輯框中的數(shù)據(jù)并轉(zhuǎn)化為復(fù)數(shù),保存在b中。try部分監(jiān)督第68~69行的代碼,如果遇到異常則執(zhí)行第70~71行,第71行“print(e)”在命令行窗口輸入異常提示信息。注意:在圖形用戶界面程序下,這個異常輸出不顯示;在使用PyCharm運(yùn)行模式下,若有異常輸出,可以PyCharm的命令行窗口中查看異常。如果第68~69行的輸入正常,則執(zhí)行第73~90行。第73~75行為一個if結(jié)構(gòu),表示如果“取共軛”復(fù)選框選中(第73行返回1),則將a和b取共軛。第76~86行為一個match多分支結(jié)構(gòu),根據(jù)單選鈕的狀態(tài),分別計算a和b的和、差、積或商。8.3“復(fù)數(shù)計算器”程序算法設(shè)計第88~89行為一個if結(jié)構(gòu),表示如果“取?!睆?fù)選框選中(第88行返回1),則計算c的模。第90行“self.txt3.set(str(c))”將c的字符串形式賦給txt3。由第25行知,txt3為只讀的編輯框stxt3的顯示內(nèi)容。當(dāng)txt3的值改變后,圖形用戶界面刷新時,將txt3的新值顯示在stxt3控件中。圖形用戶界面程序的刷新率不是固定的,由操作系統(tǒng)決定,一般,當(dāng)某個控件的內(nèi)容變化時,將啟動一次顯示刷新。通過前面幾個實(shí)例的學(xué)習(xí),用戶可基本上掌握了圖形用戶界面設(shè)計的技巧。本節(jié)將用一定量的篇幅介紹一下Tkinter包中的常用控件,并進(jìn)一步回顧一下曾出現(xiàn)在前面實(shí)例中的全部控件。8.4常用控件表中的每個控件都具有眾多的參數(shù),在程序設(shè)計時,將鼠標(biāo)移動到控件類名上方暫停一下,將自動彈出該類控件相關(guān)的參數(shù)。在顯示方面,大部分控件都具有參數(shù)“bg=”、“fg=”、“text=”、“textvariable=”、“image=”、“relief=”、“anchor=”、“width=”、“height=”和“font=”等,依次表示設(shè)置背景色、前景色、顯示的本文、顯示的內(nèi)容(可訪問)、顯示的圖像、顯示的樣式(指3D效果)、位置、寬度、高度和字體樣式等。在后續(xù)小節(jié)中具體介紹各個控件時,將進(jìn)一步介紹上述參數(shù)的具體用法。8.4常用控件命令按鈕為Button類定義的對象,可接受用戶的鼠標(biāo)單擊事件,并能調(diào)用其參數(shù)“command=”指定的回調(diào)函數(shù)。8.4.1命令按鈕第3~17行為類MainForm的構(gòu)造方法。第5行“super().__init__()”調(diào)用父類的構(gòu)造方法。第6行設(shè)置窗口的標(biāo)題為“控件用法演示”。第7行設(shè)置窗口的大小為500×300(注意,語句中為小寫的字母x),窗口初始位置為屏幕的(100,100)坐標(biāo)處,表示窗口左上角位于屏幕的(100,100)坐標(biāo)處。第8行設(shè)置窗口大小不可調(diào)整。第9行調(diào)用myinitgui方法設(shè)置窗口內(nèi)的各個控件。8.4.1命令按鈕第10~15行為界面設(shè)計方法myinitgui。第11~12行定義命令按鈕btn1,顯示內(nèi)容為“顯示版本信息”,單擊該按鈕執(zhí)行的方法為btn1fun,樣式“groove”表示命令按鈕邊緣鑲嵌形式平鋪在窗口中。第13行使用grid方法擺放btn1按鈕,放置在第1行第2行處,距離窗口左邊界20個像素點(diǎn),距上邊界30個像素點(diǎn)。第11行中的參數(shù)“self”表示btn1的父容器,即btn1所在的窗口(或控件),這里的“self”表示類MainForm創(chuàng)建的窗口對象。第14行定義命令按鈕btn2,顯示內(nèi)容為“退出”,單擊該按鈕執(zhí)行的方法為quit,即退出程序;顯示樣式“raised”表示浮雕形3D顯示。第15行將btn2控件擺放在第1行第5列。注意,grid方法擺放控件采用了相對位置方法,當(dāng)放置了命令按鈕btn1后,再放置btn2且指定了同一行,將在同一行顯示。第16~17行定義了方法btn1fun,只有一條語句。第17行調(diào)用showinfo方法彈出一個消息對話框,其標(biāo)題為“版本信號”,顯示內(nèi)容為“版本1.0”。靜態(tài)文本框?yàn)轭怢abel定義的對象,用于輸入不可編輯的文本信息,可以輸出圖像信息。下面的實(shí)例就屬于靜態(tài)文本框的應(yīng)用方法。8.4.2靜態(tài)文本框第3~34行定義MainForm類,繼承了類tk.Tk。第10~24行為設(shè)計界面的方法myinitgui。第11行“self.capt=tk.StringVar(value='狗')”定義capt,初始值為“狗”,用作命令按鈕btn1的顯示內(nèi)容。第17行讀入圖像cat.png賦給pic1,注意,PhotoImage支持PNG、GIF、PGM和PPM四種格式的圖像。第18行“讀入圖像dog.png賦給pic2。第19行“定義靜態(tài)文本框lb1,顯示圖像pic1。第22行定義info用作lb2的顯示內(nèi)容。第23行定義靜態(tài)文本框lb2,設(shè)定前景色為紅色。第26~34行為方法btn1fun。第27~34行為一個if-else結(jié)構(gòu),第27行如果命令按鈕btn1顯示的內(nèi)容為“狗”,則執(zhí)行第28~30行,即將靜態(tài)本文框中的圖像換為狗,命令按鈕btn1顯示的內(nèi)容為“貓”,靜態(tài)文本框lb2顯示的內(nèi)容設(shè)為“這是狗狗!”。否則(第31行),執(zhí)行第32~34行,即將靜態(tài)本文框中的圖像換為貓,命令按鈕btn1顯示的內(nèi)容為“狗”,靜態(tài)文本框lb2顯示的內(nèi)容設(shè)為“這是貓咪!”。8.4.2靜態(tài)文本框8.4.3對話框在tkinter.messagebox模塊中提供了三種類型的消息對話框:(1)信息提示對話框信息提示對話框的形式為showinfo(title='標(biāo)題',message='提示信息')這種形式的信息提示對話框,具有“標(biāo)題”、“提示信息”和一個“OK”按鈕,僅能返回OK信息(即messagebox.OK)。(2)警告提示對話框警告提示對話框的形式有兩種,即showwarning(title='標(biāo)題',message='提示信息')showerror(title='標(biāo)題',message='提示信息')這種形式的信息提示對話框,具有“標(biāo)題”、“提示信息”和一個“OK”按鈕,僅能返回OK信息。8.4.3對話框(3)問題提示對話框問題提示對話框具有五種形式,即askquestion(title='標(biāo)題',message='提示信息')#可返回YES或NOaskokcancel(title='標(biāo)題',message='提示信息')#可返回True或Falseaskretrycancel(title='標(biāo)題',message='提示信息')#可返回True或Falseaskyesno(title='標(biāo)題',message='提示信息')#可返回True或Falseaskyesnocancel(title='標(biāo)題',message='提示信息')#可返回True或False在tkinter.filedialog模塊中,提供了打開文件對話框和保存文件對話框,即askopenfilename和asksaveasfilename等方法。打開文件對話框返回選擇的文件的完整路徑字符串。在tkinter.colorchooser模塊提供了顏色選擇對話框askcolor,返回的顏色值的形式形如“((245,1,10),'#f5010a')”。8.4.3對話框第2~4行裝載messagebox模塊,并賦以別名msgbox;裝載filedialog模塊,并賦以別名filedlg,裝載colorchooser模塊,并賦以別名color。第6~43行為自定義類MainForm,繼承了類tk.Tk。第13~26行為界面設(shè)計方法myinitgui。第14行定義capt對象,作為命令按鈕btn1的顯示內(nèi)容。第15~16行定義命令按鈕btn1,并使用grid方法將按鈕放置到窗口。grid方法使用行、列位置擺放控件,padx和pady用于定義控件相對于窗口邊緣的距離。btn1的單擊事件響應(yīng)方法為btn1fun。第17~18行定義命令按鈕btn2,btn2的單擊事件響應(yīng)方法為btn2fun。下面的實(shí)例展示了這些對話框的用法(第一部分):8.4.3對話框第20~21行定義表靜態(tài)文本框lb1。第23行定義info對象作為靜態(tài)文本框lb2的顯示內(nèi)容;第24~25行定義靜態(tài)文本框lb2。第26行將lb2的鼠標(biāo)左鍵單擊事件(即“<Button-1>”)與方法lb2fun相綁定,即當(dāng)鼠標(biāo)左鍵單擊靜態(tài)文本框lb2時,將觸發(fā)lb2fun函數(shù)。第27~33行為btn1fun函數(shù)。第28~29行調(diào)用askopenfilename方法啟動打開文件對話框。第30行如果file存在,則執(zhí)行第31~33行。第31行將在打開文件對話框中選擇的文件名file對應(yīng)的圖像文件裝入到pic1中。第32行在靜態(tài)文本框lb1中顯示打開的圖像。第33行在lb2中(info為lb2顯示的內(nèi)容)顯示文件名。(第二部分):一個事件用“<>”包括起來,“<Button-1>”表示鼠標(biāo)左鍵單擊事件,“<Button-3>”表示鼠標(biāo)右鍵單擊事件,“<Button-2>”表示鼠標(biāo)中間鍵單擊事件。8.4.3對話框第34~39行為btn2fun。第35行打開“問題提示對話框”,第36行如果問題提示對話框返回YES,則第37行“self.quit()”關(guān)閉程序。第40~43行為lb2fun方法,該方法為靜態(tài)文本框lb2的鼠標(biāo)左鍵單擊事件綁定的方法,故需要一個外部參數(shù)event(參數(shù)名可取任意合法的標(biāo)識符)。第41行打開顏色選擇對話框,返回的顏色值為含有兩個元素的元組,其第二個元素為字符串表示的顏色值。第42行如果col為元組,則第43行設(shè)置靜態(tài)文本框lb2的前景色(即字體顏色)為col[1]表示的顏色。(第三部分):8.4.4消息框消息框也稱靜態(tài)文本控件,是Message類定義的對象,其與Label控件功能相似,但是消息框具有自動換行功能,可視為多行靜態(tài)文本框。注意:Label靜態(tài)文本框支持“\n”手動換行。自定義類MainForm,繼承了類tk.Tk。第10~19行為界面設(shè)計方法myinitgui。第17行定義str對象作為Message對象msg顯示的內(nèi)容,初始為空字符串。第18行定義Message對象msg。第19行表示msg對象放置在第2行第2列處,且占有3列的長度。第20~24行的方法btn1fun為命令按鈕btn1被按下時響應(yīng)的方法。第21行“file=open('zy.txt')”打開文件zy.txt,這里沒有做異常處理,應(yīng)保證當(dāng)前工程目錄下有一個文本文件zy.txt,其內(nèi)容為“Ourclasshas38students.”。第22行讀出file中的文本內(nèi)容,賦給s;第23行關(guān)閉文件對象file。第24行將s賦給str,然后,系統(tǒng)刷新界面,將str顯示在Message對象msg中。8.4.5文本控件文本控件是Text類的對象,借助于文本控件可以實(shí)現(xiàn)類于文檔編輯軟件(例如Word)類似的圖文編輯處理,這個控件是實(shí)現(xiàn)文檔編輯類軟件的必備控件,可以作為容器放置其他控件和圖像。這里重點(diǎn)介紹一下該控件實(shí)現(xiàn)文字編輯的功能,設(shè)文本控件為txt,則(1)在控件中可以手工編輯文字;(2)借助于insert方法可以向txt中插入文字,例如:txt.insert(tk.INSERT,'Apple')向txt文本控件中當(dāng)前光標(biāo)位置處插入字符串“Apple”?;蛘撸簍xt.insert('行號.列號','Apple')表示在第“行號”和第“列號”處插入字符串“Apple”。如,txt.insert('1.3','Apple')表示在第1行第3列處插入字符串“Apple”。這里列號從0開始,行號從1開始。8.4.5文本控件(3)借助于get方法從txt中提取文本,例如:txt.get('行號1.列號1','行號2.列號2')表示從位置“行號1.列號1”至“行號2.列號2”(不含)間的文本被提取出來,返回字符串。(4)借助于delete方法刪除文本,例如:delete('行號1.列號1','行號2.列號2')表示刪除從位置“行號1.列號1”至“行號2.列號2”(不含)間的文本。在上述操作中,可以使用tk.INSERT、tk.END表示文本的當(dāng)前光標(biāo)位置和文本的最后位置(的下一個位置)。8.4.5文本控件下面將介紹文本控件的插入文本操作:自定義類MainForm。第10~18行為用戶界面設(shè)計方法myinitgui。其中,第17行定義文本控件txt,高度為38,高度為10,單位為字符。第18行調(diào)用grid方法在窗口中放置txt控件。第19~21行為方法btn1fun,當(dāng)單擊控件btn1時將觸發(fā)該方法。第20~21行表示在當(dāng)前光標(biāo)處插入文本“Thisisthetextinsertedbyclickingbutton.However,onecaninputtextbyhand.\n”。8.4.6編輯框編輯框?yàn)镋ntry類定義的對象,編輯框類似于“控制臺模式”下的input函數(shù),可以輸入各類數(shù)據(jù)。設(shè)編輯框?qū)ο鬄閑ntry,其textvariable參數(shù)為val,則val.get方法將獲得編輯框entry中的文本,而val.set方法將設(shè)置編輯框中顯示的內(nèi)容,set方法可以使用各種類型,例如,val.set('{'a':5,'b':5,'c':6}')將輸出字典到編輯框中。下面的實(shí)例演示了編輯框的用法(第一部分):第3~37行定義自定義類MainForm,繼承了類tk.Tk。第10~23行為界面設(shè)計方法myinitgui。第17行定義val1對象,作為編輯框entry1的顯示內(nèi)容。第18行定義Entry類的對象entry1。第19行調(diào)用entry1的grid方法將編輯框放置在第2行第2列處,占3列寬度。第21行定義val2對象,用作編輯框entry2的顯示內(nèi)容。第22行定義編輯框?qū)ο骵ntry2。第23行調(diào)用grid方法將編輯框放在窗口的第3行第2列處,占3列寬度。方法grid使用網(wǎng)格進(jìn)行控件的布局,但是其布局的行列大小并不嚴(yán)格,在實(shí)際使用grid方法時,可添加padx和pady參數(shù)調(diào)用控件的橫向和縱向位移,以達(dá)到良好的可視效果。8.4.6編輯框第24~33行為方法btn1fun,當(dāng)命令按鈕btn1被單擊時將調(diào)用該方法。第25~33行為一個try結(jié)構(gòu),當(dāng)異常發(fā)生時,將進(jìn)入第32~33行執(zhí)行異常處理,第33行“pass”表示異常不作處理。第26行讀取entry1編輯框中的文本,賦給str。第27行將字符串以“,”號為分隔符分隔成列表,賦給x。第29~30行為一個for結(jié)構(gòu),將列表x中的各個元素轉(zhuǎn)化為浮點(diǎn)數(shù)并平方后取和。第31行將s顯示在entry2編輯框中。程序段的執(zhí)行結(jié)果如圖所示。在第一個編輯框中,輸入“4,5,6,7,8,9.23”,單擊“計算平方和”,將在第二個編輯框中顯示上述輸入數(shù)據(jù)的平方和,即“275.19”。(第二部分):8.4.6編輯框編輯框還有一些其他的功能,例如:(1)當(dāng)輸入密碼時,可以顯示“*”號,以保護(hù)密碼,使用show=‘*’參數(shù)表示。(2)支持輸入內(nèi)容的合法性驗(yàn)證,例如,要求輸入手機(jī)號,當(dāng)輸入了字母時視為非法輸入。合法性驗(yàn)證借助于三個參數(shù):validate、validatecommand和invalidcommand,其中,validate參數(shù)指定合法性檢驗(yàn)的時刻,詳細(xì)介紹見下表。參數(shù)validatecommand指定檢驗(yàn)輸入是否合法的函數(shù),當(dāng)validate參數(shù)指定了輸入合法性檢驗(yàn)的時刻,則參數(shù)validatecommand需要指定合法性檢驗(yàn)函數(shù),輸入合法性檢驗(yàn)函數(shù)為謂詞函數(shù),返回值為真或假;當(dāng)合法性檢驗(yàn)為假時,將調(diào)用invalidcommand參數(shù)指定的函數(shù)。8.4.7單選鈕單選鈕是Radiobutton類定義的控件,單選鈕的常用定義方式為:Radiobutton(所在的窗口對象,text=顯示的內(nèi)容,variable=選中該單選鈕時返回值保存的變量,value=該單選鈕的設(shè)定值)單選鈕的設(shè)定值一般為1、2、3等正整數(shù),單選鈕常成組使用,即組成一組使用的單選鈕只能有一個處于選中狀態(tài),這些單選鈕共享同一個保存返回值的變量。8.4.7單選鈕下面的實(shí)例展示了單選鈕的用法。將三個單選鈕合并為一組,依次顯示文本“紅色”、“綠色”和“藍(lán)色”,選中其中一種顏色時,單擊“確定”后,靜態(tài)文本框顯示所選的顏色。第3~40行為自定義類MainForm,繼承了類tk.Tk。第10~28行為界面設(shè)計方法myinitgui。第17行定義標(biāo)簽框架lbframe,顯示文本“選擇顏色”。第18行調(diào)用grid方法在第2行第2列處顯示lbframe。第19行定義val對象,用于保存位于同一組中的被選中的單選鈕的值。(第一部分)8.4.7單選鈕第20~21行為一條語句,當(dāng)一條語句被放在兩行時,用“\”表示續(xù)行符,創(chuàng)建一個單選鈕,其位于lbframe中,其設(shè)定值為1,當(dāng)選中該單選鈕時,將其值1保存在val變量中;同理,第22~23行創(chuàng)建另一個單選鈕,其設(shè)定值為3;第24~25行“創(chuàng)建第三個單選鈕,其設(shè)定值為5。上述三個單選鈕均位于帶標(biāo)簽的框架lbframe中,使用pack方法進(jìn)行布局,pack方法僅用于簡單布局,具有一個anchor參數(shù),其具有“N、S、E、W、NE、NW、SE、SW、CENTER”等九個值,依次表示“北、南、東、西、東北、西北、東南、西南、居中”。第27行定義靜態(tài)文本框label,用于顯示選中的顏色。(第二部分)8.4.7單選鈕(第三部分)第29~36行為btn1fun方法,當(dāng)btn1命令按鈕被按下時將執(zhí)行該函數(shù)。第30~36行為一個match多分支結(jié)構(gòu),當(dāng)某個單選鈕被選中時,根據(jù)其值(可能為1、3或5),設(shè)計靜態(tài)文本框的顏色。例如,當(dāng)值為1時(第31行),第32行設(shè)置靜態(tài)文本框(背景色)為紅色。程序運(yùn)行如下圖:8.4.7單選鈕現(xiàn)在,總結(jié)一下布局方法。至此,已經(jīng)使用過三種形式的布局方法,即pack、grid和place。pack布局僅用于容器中少量控件的布局,且僅能用于“九宮格”式的布局,不能實(shí)現(xiàn)精細(xì)地布局。grid布局稱為網(wǎng)格布局,按照行和列的編號放置控件,這里的行和列的尺寸由控件的大小決定,不是嚴(yán)格意義上的行和列。place布局分為相對布局和絕對布局,絕對布局直接使用窗口內(nèi)部的絕對坐標(biāo)值放置控件,絕對布局一旦布局完成不隨窗口大小改變再改變;相對布局使用相對坐標(biāo)在窗口中放置控件,相對布局的控件大小和位置可以隨窗口大小改變而改變。8.4.8復(fù)選鈕復(fù)選鈕,也稱復(fù)選框,是Checkbutton類定義的對象。復(fù)選鈕的典型定義方式為:cb=Checkbutton(復(fù)選鈕所在的容器,text=顯示的文本,variable=復(fù)選鈕的返回值)當(dāng)復(fù)選鈕被選中時,返回的值為1;否則,返回的值為0。第3~34行為自定義類MainForm,繼承了類tk.Tk。第10~27行為界面設(shè)計方法myinitgui。第17行定義帶標(biāo)簽的框架lbframe。第18行調(diào)用grid方法將lbframe控件放在窗口的第2行第2列處。第19~21行定義三個整數(shù)變量對象val1、val2和val3,分別用于保存三個復(fù)選鈕的值。第22行創(chuàng)建三個復(fù)選鈕,顯示內(nèi)容為“紅色”“綠色”“藍(lán)色”。(第一部分)8.4.8復(fù)選鈕(第二部分)第28~30行為方法btn1fun,當(dāng)單擊命令按鈕btn1時執(zhí)行該方法。第29行紅色復(fù)選框的值(未選中為0,選中時為1)乘以255(再左移16位)加上綠色復(fù)選框的值(未選中為0,選中時為1)乘以255(再左移8位),再加上藍(lán)色復(fù)選框的值(未選中為0,選中時為1)乘以255,結(jié)果保存在val中。第30行將val中的值轉(zhuǎn)化為十六進(jìn)制數(shù)表示的顏色值,并用該顏色值設(shè)置靜態(tài)文本框label的顏色。程序運(yùn)行如下圖:8.4.9框架與帶標(biāo)簽框架框架是類Frame定義的對象,帶標(biāo)簽的框架是類LabelFrame定義的對象。框架和帶標(biāo)簽的框架主要用作容器,用于存放其他控件,使其他控件在窗口中擺放整齊。其中,帶標(biāo)簽的框架主要用于擺放單選鈕和復(fù)選鈕,而框架可以用于擺放任意控件。(修改部分)8.4.9框架與帶標(biāo)簽框架在上一個實(shí)例的基礎(chǔ)上,下面的實(shí)例將使用框架擺放命令按鈕。第3~37行定義了類MainForm,繼承了類tk.Tk。第10~30行為界面設(shè)計方法myinitgui。第11行定義了Frame對象frame,邊界為3個像素點(diǎn),使用“groove”(雕刻)方式顯示框架。第12行調(diào)用grid方法將frame對象放置在窗口的第1行第1列處。第14~15行定義命令按鈕對象btn1,并放置在frame中;第17~18行定義命令按鈕對象btn2,并放置在frame中。第20行定義帶標(biāo)簽的框架lbframe,這里releif='raised'表示以3D浮雕型顯示。第21行調(diào)用grid方法將lbframe擺放在窗口的第2行第1列處。8.4.10編輯框列表框是Listbox類定義的對象。列表框以列表的形式顯示各個選項(xiàng)值,設(shè)列表框?qū)ο鬄閘istbox,向其中添加選項(xiàng)的方法有兩種:其一,listbox.insert(tk.END,選項(xiàng))在列表框的尾部添加一個新的選項(xiàng)。其二,self.items=tk.StringVar(value=‘紅色綠色藍(lán)色黑色白色’)借助StringVar生成各個選項(xiàng),選項(xiàng)間用空格分隔,self.listbox=tk.Listbox(self,listvariable=self.items,setgrid=False,width=10,height=6)使用listvariable參數(shù)指定items選項(xiàng)。(第一部分)8.4.10編輯框第3~43行為自定義類MainForm,繼承了類tk.Tk。第10~23行為界面設(shè)計方法myinitgui。第17行定義listbox對象;第18行“調(diào)用grid方法放置listbox對象。第19~20行為一個for結(jié)構(gòu),借助于“self.listbox.insert(tk.END,e)”將選項(xiàng)e添加到列表框的末尾。下面程序段8-14介紹了列表框的用法:(第二部分)第24~39行為btn1fun方法,當(dāng)單擊btn1命令按鈕時將調(diào)用該方法。第25行讀取列表框中選中的選項(xiàng)的索引號,以元組的形式保存在v中。列表框支持四種選擇模式,使用selectmode參數(shù)配置,具有tk.SINGLE(單選)、tk.BROWSE(缺省配置,支持鼠標(biāo)和鍵盤方向鍵選擇)、tk.MULTIPLE(多選)和tk.EXTENDED(多選,支持Shift/Ctrl鍵和鼠標(biāo)拖動選擇)。在列表框中,選項(xiàng)的索引號從0開始。第26行當(dāng)v不為“()”時,說明選中了列表框中的某個選項(xiàng)。第27行將選中的列表框中的選項(xiàng)的索引號賦給v0。第28~38行為一個match結(jié)構(gòu),根據(jù)v0的值執(zhí)行相應(yīng)的分支語句,例如,若v0為2,則第34行被執(zhí)行,靜態(tài)本文框(背景)顯示為藍(lán)色。組合框是Combobox類定義的對象,Combobox類位于模塊tkinter.ttk中。組合框可視為編輯框和列表框的組合體。(第一部分)8.4.11組合框第3行裝載模塊tkinter.ttk,并賦以別名t2k。第4~47行為自定義類MainForm,繼承了tk.Tk類。第11~25行為界面設(shè)計方法myinitgui。第18行定義val對象,作為組合框combo顯示的內(nèi)容。第19~20行定義Combobox類的對象combo,其postcommand方法(即單擊組合框展開其下拉列表時調(diào)用的方法)為comsel,如第26~27行所示,為一個空方法。第21行調(diào)用grid方法在第2行第2列處放置combo模塊。第22行設(shè)置組合框combo的下拉列表框的內(nèi)容。(第二部分)第28~41行為btn1fun方法,當(dāng)單擊“確定”命令按鈕時將調(diào)用btn1fun方法。第29行讀取combo對象的顯示內(nèi)容。第30行“ifv!='':”如果v不為空字符串,則執(zhí)行第31~41行的match多分支結(jié)構(gòu),根據(jù)v的值,調(diào)整label控件的顏色。程序運(yùn)行如下圖:8.4.12滾動條和進(jìn)度條滾動條是Scrollbar類定義的對象。一般地,滾動條需與其他控件配合使用。例如,滾動條與列表框組合在一起時,可使用列表框的xscrollbarcommand或yscrollbarcommand參數(shù)將滾動條控件添加為列表框的橫向滾動條或縱向滾動條。將滾動條的command參數(shù)設(shè)置為列表框的xview或yview。(第一部分)下面的實(shí)例為滾動條作為列表框的縱向滾動條的程序,同時演示了進(jìn)度條的用法。第3~56行定義了類MainForm,繼承了類tk.Tk。第10~36行為界面設(shè)計方法myinitgui。第17行定義框架frame,作為容器放置進(jìn)度條和列表框;第18行在窗口的第2行第2列放置框架;第19行定義豎直滾動條scroll;第20行將滾動條scroll放在容器的右邊并充滿容器邊界。8.4.12滾動條和進(jìn)度條(第二部分)8.4.12滾動條和進(jìn)度條第22行定義列表框中的選項(xiàng)。第23~25行定義列表框?qū)ο髄istbox,其參數(shù)“yscrollcommand”指定為scroll對象的set方法。第27行將scroll對象的command參數(shù)設(shè)為listbox對象的yview方法。這種方式為兩個控件間的雙向綁定技術(shù)。第33行定義整型對象val2,其值設(shè)為50,用作進(jìn)度條的滑塊位置。進(jìn)度條支持IntVar和DoubleVar兩個數(shù)值,這里使用了IntVar。在tkinter中,整形對象使用IntVar,雙精度浮點(diǎn)型對象使用DoubleVar,字符串對象使用StringVar。這些對象都有set和get方法,可以向?qū)ο筚x值或從對象取得值。第34~35行定義水平放置的進(jìn)度條,刻度從0至100,顯示數(shù)據(jù)保存在val2中。第36行在第3行第1列放置進(jìn)度條,進(jìn)度條占3列位置。控件的擺放有place、pack和grid等三種方法,在控件調(diào)用擺放方法前,控件不可見。(第三部分)第37~52行為btn1fun方法,當(dāng)btn1命令按鈕被按下時將調(diào)用該方法。第38行讀取val2(即進(jìn)度條)的值,將val2設(shè)為靜態(tài)文本框(即val1)的值。第39行讀取列表框當(dāng)前選中的選項(xiàng)的索引號(從0開始),賦給v。第40~52行為一個if結(jié)構(gòu),根據(jù)v的值設(shè)定靜態(tài)文本框label的背景色。程序運(yùn)行如下圖:8.4.12滾動條和進(jìn)度條8.4.13菜單控件一般地,應(yīng)用程序具有兩種類型的菜單,即下拉式菜單和鼠標(biāo)右鍵彈出式菜單。在Python語言中,這兩種菜單具有相同的創(chuàng)建方式,均使用Menu類創(chuàng)建菜單對象,并使用add_command、add_radiobuttm或add_checkbutton等方法添加子菜單項(xiàng)。菜單創(chuàng)建完成后,對于下拉式菜單,調(diào)用窗口的config方法將創(chuàng)建好的菜單作為其menu參數(shù);對于彈出式菜單,調(diào)用菜單的post方法彈出菜單,并將彈出菜單的方法與鼠標(biāo)右鍵單擊事件綁定。(第一部分)下面的實(shí)例介紹了這兩種菜單的創(chuàng)建方法。第3~59行定義了類MainForm,繼承了類tk.Tk。第10~37行為界面設(shè)計方法myinitgui。第11行定義整型對象mval,用于保存單擊的菜單的值。第12行創(chuàng)建菜單對象mymenu。第13行創(chuàng)建mymenu的子菜單對象submenu1。第14~15行調(diào)用add_radiobutton方法添加子菜單項(xiàng)“紅色”,其設(shè)定值為1,其值保存在mval中;單擊該子菜單時將執(zhí)行myselect方法。同理,第16~17行添加子菜單項(xiàng)“綠色”;第18~19行添加子菜單項(xiàng)“藍(lán)色”;第20~21行添加子菜單項(xiàng)“黑色”;第22~23行添加子菜單項(xiàng)“白色”。第24行將子菜單submenu1放置在菜單項(xiàng)mymenu中。(第二部分)第26行創(chuàng)建子菜單項(xiàng)submenu2,這里的“tearoff=False”表示子菜單和父菜單間無分隔虛線。第27行添加子菜單項(xiàng)“關(guān)于”,單擊該子菜單時執(zhí)行myabout方法。第28行在子菜單submenu2中添加分隔條。第29行添加子菜單項(xiàng)“退出”,單擊該子菜單時執(zhí)行myexit方法。第30行將子菜單summenu2添加到菜單mymenu中。第31行將菜單mymenu放置在主窗口上。第33行將鼠標(biāo)右鍵單擊事件與方法popme綁定在一起,即當(dāng)單擊鼠標(biāo)右鍵時,執(zhí)行popme方法。8.4.13菜單控件(第三部分)第39行“v=self.mval.get()”獲得被單擊的子菜單的值,第40~50行為一個match多分支結(jié)構(gòu),根據(jù)v的值設(shè)置靜態(tài)文本框的背景色。子菜單submenu1的各個菜單項(xiàng)的單擊事件均為myselect,這里依據(jù)v(即被單擊的子菜單的值)區(qū)分是哪個子菜單項(xiàng)被單擊了。8.4.13菜單控件第51~52行為myabout方法,調(diào)用消息對話框的showinfo方法輸出程序版本信息。第53~56行為myexit方法,詢問是否退出軟件,如果選“是”,則退出軟件。方法popme如第57~59行所示,popme具有一個外部參數(shù)event,用于獲取事件相關(guān)的信息,例如第59行的event.x_root和event.y_root表示以屏幕為坐標(biāo)系平面的鼠標(biāo)右鍵單擊位置的坐標(biāo)(屏幕的左上角為點(diǎn)(0,0))。第59行“self.submenu1.post(event.x_root,event.y_root)”調(diào)用post方法彈出submenu1子菜單。程序運(yùn)行如圖。(第四部分)8.4.13菜單控件在Python語言中,借且于畫布和基于畫布的繪圖方法實(shí)現(xiàn)圖形繪制。畫布是Canvas類義的對象,其具有9個繪圖方法:(1)畫線方法create_line;(2)畫矩陣方法create_rectangle;(3)畫多邊形方法create_polygon;(4)畫圓弧方法create_arc;(5)畫橢圓方法create_oval;(6)畫文本方法create_text;(7)創(chuàng)建窗口方法create_window,可以窗口中放置各種控件;(8)輸出位圖方法create_bitmap;(9)輸出圖像方法create_image。8.5畫布與繪圖技術(shù)Python語言沒有畫點(diǎn)函數(shù),也沒有畫筆的概念。上述的繪圖方法大都具有width參數(shù)和outline參數(shù)(針對封閉型圖形),用于設(shè)置繪圖使用的畫筆大小和輪廓顏色;具有dash參數(shù),用于繪制虛線,例如,dash=(3,4)表示3個像素點(diǎn)的線段和4個像素點(diǎn)的空白間隔構(gòu)成的虛線樣式;具有fill參數(shù),指定填充顏色,為空字符串時為透明色;具有tags參數(shù),為創(chuàng)建的圖形(對象)添加標(biāo)簽。除了具有上述9個繪圖方法外,還具有“coords(圖形對象名,目標(biāo)坐標(biāo)及大小)”、“move(圖形對象名,目標(biāo)坐標(biāo)點(diǎn))”、“moveto”等移動畫布上的圖形對象,可以使用“itemconfig(圖形對象名,屬性配置表)”配置圖形對象的屬性,使用“delete(圖形對象名)”方法刪除圖形對象。8.5畫布與繪圖技術(shù)下面的實(shí)例演示了畫布和其主要繪圖方法的用法。8.5畫布與繪圖技術(shù)(第一部分)第3~71行為自定義類MainForm,繼承了類tk.Tk。第10~42行為界面設(shè)計方法myinitgui。第11~28行定義了菜單“圖形”,其中有7個子菜單項(xiàng),即“直線”、“正方形”、“多邊形”、“圓形”、“橢圓”、“圓弧”和“文本”子菜單項(xiàng)。這些子菜單被單擊時,均調(diào)用myselect方法,根據(jù)子菜單的值執(zhí)行相應(yīng)的繪圖操作。8.5畫布與繪圖技術(shù)(第二部分)第39行定義Canvas類的對象cv。第40行調(diào)用pack方法在窗口中放置cv畫布對象,無參數(shù)(即默認(rèn))情況時緊靠窗口頂部居中擺放。第41行在cv對象中創(chuàng)建一個按鈕對象btn,當(dāng)單擊該按鈕時執(zhí)行方法myexit。第42行調(diào)用create_window方法創(chuàng)建一個窗口對象,在其中顯示btn對象。8.5畫布與繪圖技術(shù)(第三部分)第43~63行為myselect方法。第44行取得子菜單的值,賦給v。第45~63行為一個match多分支結(jié)構(gòu),根據(jù)v的值,執(zhí)行相應(yīng)的分支操作。當(dāng)v為1時,繪制直線,如第47~49行所示。當(dāng)v為2時,繪制矩形,如第51行所示,這里使用藍(lán)色填充,邊界寬度為0。當(dāng)v為3時,繪制多邊形,如第53~54行所示,這里繪制了一個直角三角形,并用紅色填充。當(dāng)v為4時,繪制圓形,并用綠色填充,如第56行所示。當(dāng)v為5時,繪制橢圓,并用淺綠色填充,如第58行所示。當(dāng)v為6時,繪制扇形,并用黃色填充,如第60~61行所示。當(dāng)v為7時,在畫布上輸出文本,如第63行所示。8.5畫布與繪圖技術(shù)(第四部分)第64~65行為myabout方法,調(diào)用消息對話框的showinfo方法輸出程序版本信息。第66~69行為myexit方法,詢問是否退出軟件,如果選“是”,則退出軟件。第70~71行為方法popme,popme具有一個外部參數(shù)event,用于獲取事件相關(guān)的信息。第73~74行調(diào)用mainloop方法,使圖形用戶界面程序進(jìn)行等待事件(或消息)狀態(tài)。程序運(yùn)行結(jié)果如右圖。圖形用戶界面程序設(shè)計中,tkinter類的一些控件,例如命令按鈕,可以通過設(shè)定其command參數(shù)與特定的事件相關(guān)聯(lián)。在定義命令按鈕時,為其command參數(shù)指定一個方法,響應(yīng)命令按鈕的單擊事件。類似于命令按鈕的單擊事件等這類事件稱為tkinter類定義的事件。除了tkinter類定義的事件外,在圖形用戶界面下,可以為鼠標(biāo)的按鍵與移動以及鍵盤的按鍵等定義事件,這類事件稱為自定義事件。自定義事件的語法為“<modifier-type-detail>”,自定義事件必須用“<>”括起來,其中,modifier和detail部分是可選的,modifier表示組合鍵的控制鍵;detail表示具體的按鍵。例如,“<Control-Shift-KeyPress-A>”中,“Control”和“Shift”為modifier部分,表示同時按下Control和Shift鍵;KeyPress為type部分,表示事件類型為按鍵;“A”為detail部分,表示具體按下了A鍵。8.6事件綁定與自定義事件下面詳細(xì)介紹一下modifier部分和type部分:(1)“modifier”用于表示組合鍵的控制鍵,其常用的符號有“Alt”、“Control”、“Shift”、“Double”和“Any”,依次表示同時按下Alt鍵、同時按下Ctrl鍵、同時按下Shift鍵、連續(xù)兩次擊鍵和按下任意鍵。例如,<Double-Button-1>表示雙擊鼠標(biāo)左鍵;<Any-KeyPress>表示按下任意鍵。(2)“type”表示事件類型,常用的type如下表所示。8.6事件綁定與自定義事件自定義事件的響應(yīng)方法需要一個外部參數(shù),該參數(shù)為Event類定義的對象,其屬性見左表,常用特殊按鍵的鍵名和鍵碼值見右表。8.6事件綁定與自定義事件在上一個實(shí)例的基礎(chǔ)上,添加了自定義的按鍵事件。在程序段中,按下“Shift+A”鍵或大寫鎖定的“A”鍵時,執(zhí)行畫線操作;按下大寫鎖定的“B”鍵時,執(zhí)行畫矩陣操作;按下大寫鎖定的“C”鍵時,執(zhí)行畫多邊形操作;按下大寫鎖定的“D”鍵時,執(zhí)行畫圓操作;按下大寫鎖定的“E”鍵時,執(zhí)行畫橢圓操作;按下大寫鎖定的“F”鍵時,執(zhí)行畫圓弧操作;按下大寫鎖定的“G”鍵時,在畫布上輸出文本。8.6事件綁定與自定義事件(修改部分)第44行將自定義事件“KeyPress-A”(按下大寫的字母“A”,或在大寫不鎖定情況下按下Shift+A鍵)與方法mykey綁定,即按下大寫的“A”鍵時將觸發(fā)方法mykey。同理,第45~50行將自定義事件“KeyPress-B”、“KeyPress-C”、“KeyPress-D”、“KeyPress-E”、“KeyPress-F”、“KeyPress-G”均與方法mykey。第51~71行為mykey方法,具有一個外部參數(shù)event。第52行讀取按鍵的鍵碼,對于普通的字母按鍵,其鍵碼為其Unicode碼(與其ASCII碼相同)。第53~71行為一個match多分支結(jié)構(gòu),第53行match的表達(dá)式為“v-ord('A')”,當(dāng)按下大寫的“A”~“G”鍵時,v-ord('A')依次取值為0至6,第54~71行為case語句,根據(jù)v-ord('A')的值執(zhí)行相應(yīng)的case語句,完成指定的繪圖操作。8.6事件綁定與自定義事件圖形用戶界面程序的設(shè)計方法為:(1)裝載tkinter類;(2)設(shè)計自定義類,例如,MainForm(類名可取為任意合法的標(biāo)識符,建議取為見名知義的標(biāo)識符),自定義類必須繼承tk.Tk類;(3)在自定義類MainForm的初始化方法中,設(shè)計圖形用戶界面,或調(diào)用設(shè)計圖形用戶界面的方法,例如,myinitgui方法,這個方法將圖形用戶界面的各個控件都擺放整齊;(4)在自定義類MainForm中,編寫圖形用戶界面上各個控件“綁定”的方法,即各個控件相關(guān)聯(lián)的事件將觸發(fā)的方法;(5)在自定義類MainForm中,編寫自定義事件,并綁定相應(yīng)的方法;(6)創(chuàng)建自定義類MainForm的對象mainform,并調(diào)用其方法mainloop,啟動圖形用戶界面程序,等待各個控件的事件或系統(tǒng)消息觸發(fā)相應(yīng)的方法完成特定的功能。包tkinter中具有大量的可視化控件,限于篇幅,本章重點(diǎn)介紹了命令按鈕、靜態(tài)文本框、消息框、對話框、文本控件、編輯框、單選鈕、復(fù)選鈕、框架和帶標(biāo)簽的框架、列表框、滾動條、進(jìn)度條、菜單和畫布控件等,介紹了grid、pack和place三種布局方式,更多的控件及其使用方法請參考tkinter文檔。8.7本章小節(jié)1.編寫一個計算器程序,使用圖形用戶界面,要求輸入兩個數(shù),實(shí)現(xiàn)這兩個數(shù)的四則運(yùn)算。2.編寫一個溫度轉(zhuǎn)換程序,要求使用圖形用戶界面,輸入一個溫度值,通過兩個單選鈕選擇溫度轉(zhuǎn)換方式。兩個單選鈕分別為“攝氏溫度轉(zhuǎn)華氏溫度”和“華氏溫度轉(zhuǎn)攝氏溫度”,按下“開始轉(zhuǎn)換”命令按鈕后,啟動轉(zhuǎn)換并將轉(zhuǎn)換結(jié)果顯示在只讀文本框中。3.編寫一段繪圖程序,繪制余弦信號cos(x),x從0至2。習(xí)題第九章數(shù)據(jù)分析與可視化本章重點(diǎn)介紹三個程序包numpy、pandas和matpoltlib的用法。這三個程序包均為Python語言的外部擴(kuò)展包,使用它們前需要安裝這些包。在PyCharm中,單擊菜單“文件|設(shè)置|項(xiàng)目:MyPythonPrj|Python解釋器”,這里的“MyPythonPrj”為本書所使用的Python工程名。然后,單擊顯示的頁面的左上方的“+”號安裝這三個程序包的最新版本。當(dāng)前,numpy的版本為1.23.1;pandas的版本為1.4.3;matplotlib的版本為3.5.2。第九章數(shù)據(jù)分析與可視化程序包numpy實(shí)現(xiàn)了一種新的數(shù)據(jù)類型——數(shù)組,與C語言意義上的數(shù)組概念相同,即包含相同類型元素的一組數(shù)據(jù)(事實(shí)上,這種數(shù)據(jù)類型類似于Python語言內(nèi)置的“列表”,可以存儲不同類型的數(shù)據(jù),例如,同時存儲整數(shù)和字符串,但是numpy提供的函數(shù)主要是針對同類型數(shù)據(jù)),同時,numpy基于數(shù)組提供了大量的函數(shù),包括數(shù)學(xué)函數(shù)、統(tǒng)計函數(shù)、偽隨機(jī)數(shù)函數(shù)和字符串函數(shù)等,使得numpy應(yīng)用廣泛。此外,numpy的處理速度快,并且是pandas等外部程序包的基礎(chǔ)。程序包pandas實(shí)現(xiàn)了兩種新的數(shù)據(jù)類型,即Series(序列)和DataFrame(數(shù)據(jù)框架),這兩種數(shù)據(jù)類型的優(yōu)勢在于可以處理數(shù)組中的缺失值。pandas提供了基于Series和DataFrame數(shù)據(jù)對象的大量統(tǒng)計函數(shù)。pandas包主要針對數(shù)據(jù)統(tǒng)計和大數(shù)據(jù)處理等應(yīng)用。程序包matplotlib是一個二維繪圖庫,可以繪制各種數(shù)學(xué)函數(shù)圖形和金融數(shù)據(jù)圖形,是Python語言中數(shù)據(jù)可視化的重要工具,其特點(diǎn)在于繪圖函數(shù)簡單易用,借用了MATLAB軟件中的繪圖函數(shù)的名稱,生成的圖形可以用于科技論文中。第九章數(shù)據(jù)分析與可視化本章將分為三節(jié)內(nèi)容來介紹程序包numpy、pandas和matpoltlib的用法:第九章數(shù)據(jù)分析與可視化9.1程序包numpy9.1.1數(shù)組創(chuàng)建9.1.2數(shù)組元素訪問9.1.3矩陣運(yùn)算9.1.4常用方法9.2程序包pandas9.2.1Series對象定義9.2.2Series對象訪問9.2.3Series對象計算9.2.4DataFrame對象定義9.2.3DataFrame對象訪問9.2.4DataFrame對象數(shù)據(jù)處理9.3程序包matpoltlib9.3.1繪圖基本方法9.3.2散點(diǎn)圖9.3.3柱狀圖程序包numpy的算法基于其自定義的數(shù)據(jù)類型——數(shù)組,一般地,認(rèn)為數(shù)組具有相同類型的元素。元素類型可以為字符串和各種數(shù)據(jù)類型,例如,importnumpyasnp#裝載包numpy,并賦以別名nparr1=np.array([1,2,3],dtype='int_')print(arr1)print(arr1.dtype)將創(chuàng)建一個數(shù)組arr1,其元素為“1,2,3”,“dtype”用于指定數(shù)組元素的類型,這里的“int_”為默認(rèn)的整型,因計算機(jī)而異,可能為32位整型int32,或64位整型int64?!皃rint(arr1)”輸出數(shù)組arr1,得到“[1,2,3]”;“print(arr1.dtype)”輸出數(shù)組(元素)的類型。9.1程序包numpy一般地,使用默認(rèn)的元素數(shù)據(jù)類型創(chuàng)建數(shù)組時不需要指定“dtype”。默認(rèn)的元素數(shù)據(jù)類型有“int_”、“float_”、“complex_”,分別表示32位或64位有符號整型、64位浮點(diǎn)型(IEEE754格式,其中,1個符號位、11個指數(shù)位、52個尾數(shù)位)和128位復(fù)數(shù)型(其中,實(shí)部和虛部各占64位)。其他的常用數(shù)值型數(shù)據(jù)類型包括8位有符號整型(int8)、8位無符號整型(uint8)、16位有符號整型(int16)、16位無符號整型(uint16)、32位有符號整型(int32)、32位無符號整型(uint32)、64位有符號整型(int64)、64位無符號整型(uint64)、單精度浮點(diǎn)數(shù)(float32)、雙精度浮點(diǎn)數(shù)(float64)、復(fù)數(shù)complex128(實(shí)部和虛部分別為64位雙精度浮點(diǎn)數(shù))等。9.1程序包numpy一般地,認(rèn)為程序包numpy的所有方法均基于其自定義數(shù)據(jù)類型——數(shù)組,所以,使用包numpy的方法前,必須定義數(shù)組。創(chuàng)建數(shù)組的方法有以下四種:(1)將列表轉(zhuǎn)化為數(shù)組包numpy的array方法可以將列表轉(zhuǎn)化為數(shù)組。對于一維列表,將被轉(zhuǎn)化一維數(shù)組;對于二維的嵌套列表,要求列表中每個子列表的元素個數(shù)必須相同,這樣的嵌套列表被轉(zhuǎn)化為二維數(shù)組;對于高維的嵌套列表,同樣要求同級別的子列表的元素個數(shù)相同,這樣的高維嵌套列表被轉(zhuǎn)化為高維數(shù)組。(2)使用程序包numpy的內(nèi)置方法生成特殊數(shù)組程序包numpy具有生成特殊數(shù)組的內(nèi)置方法,這些方法包括zeros、zeros_like、ones、ones_like、empty等。其中,zeros方法可以生成元素全為0的數(shù)組,zeros生成二維以上的數(shù)組時,使用元組作為參數(shù),例如:zeros((3,4))生成3行4列的數(shù)組,元素均為0。zeros_like方法的參數(shù)為一個數(shù)組,將生成與該數(shù)組相同結(jié)構(gòu)的數(shù)組,其元素均為0。ones和ones_like方法分別與zeros和zeros_like方法相似,只是生成的數(shù)組元素均為1。empty方法生成一個數(shù)組,主要是為新生成的數(shù)組開辟存儲空間(其元素值不定),為后續(xù)使用該數(shù)組的方法服務(wù)。9.1.1數(shù)組創(chuàng)建(3)使用程序包numpy的內(nèi)置方法生成規(guī)則數(shù)組生成規(guī)則數(shù)組的方法主要有arrange和linspace。其中,arrange方法的語法為:arrange(起始值,終止值(不含),步長)。例如,arrange(1,3,0.5)將得到“[1.01.52.02.5]”。linspace方法的語法為:linspace(起始值,終止值(含),分隔點(diǎn)數(shù))。例如,linspace(1,3,5)得到“[1.01.52.02.53.0]”??梢姡琣rrange和linspace均用于生成等差數(shù)列形式的數(shù)組。(4)使用程序包numpy的內(nèi)置類random生成偽隨機(jī)形式的數(shù)組 程序包numpy的內(nèi)置類具有rand、randn和uniform等方法,可以生成偽隨機(jī)數(shù)組。其中,rand用于生成[0,1)上均勻分布的偽隨機(jī)數(shù)組,例如,rand(3,2)生成一個3行2列的[0,1)上均勻分布的偽隨機(jī)數(shù)組。randn生成均值為0、方差為1的偽隨機(jī)數(shù)組,例如,randn(3,2)生成一個3行2

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論