《Python語言程序設計》 課件 第10章 圖形用戶界面程序設計_第1頁
《Python語言程序設計》 課件 第10章 圖形用戶界面程序設計_第2頁
《Python語言程序設計》 課件 第10章 圖形用戶界面程序設計_第3頁
《Python語言程序設計》 課件 第10章 圖形用戶界面程序設計_第4頁
《Python語言程序設計》 課件 第10章 圖形用戶界面程序設計_第5頁
已閱讀5頁,還剩26頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第10章圖形用戶界面程序設計10.1GUI編程1.窗口與組件在進行GUI開發(fā)時,首先需要創(chuàng)建一個頂層窗口。該窗口充當容器的角色,可以存放程序所需的各種組件,例如按鈕、下拉框、單選框等。頂層窗口包含了所有的組件,而組件本身也可以作為容器使用,包含其他組件。包含其他組件的組件被稱為父組件,而被包含在其中的組件則被稱為子組件。2.事件驅(qū)動與回調(diào)機制事件:用戶使用GUI程序進行的操作,如移動鼠標、點擊鼠標、按下鍵盤上的按鍵等?;卣{(diào)機制:當某個事件發(fā)生時,程序?qū)⒄{(diào)用對應的事件處理函數(shù)并做出相應的響應。事件對應的處理函數(shù)被稱為回調(diào)函數(shù)。10.2Tkinter的主要組件使用Tkinter庫創(chuàng)建一個GUI程序只需要以下步驟:(1)導入Tkinter模塊。(2)創(chuàng)建GUI應用程序的主窗口(頂層窗口)。(3)添加完成程序功能所需要的組件。(4)編寫回調(diào)函數(shù)。(5)進入主事件循環(huán),對用戶觸發(fā)的事件做出響應。10.2.1標簽標簽(Label)是用來顯示圖片和文本的組件。在top主窗口中創(chuàng)建標簽:label=Label(top,text=屬性值)text屬性:設置顯示的文本例10-1在標簽內(nèi)顯示兩行文字fromtkinterimport*top=Tk()top.title(u"主窗口")label=Label(top,text="HelloWorld,\nfromTkinter")label.pack()top.mainloop()10.2.2框架框架(Frame)是其他組件的一個容器,通常是用來包含一組控件的主體。frame=Frame(top,屬性1=表達式1,屬性2=表達式2….)例10-2fromtkinterimport*top=Tk()top.title(u"主窗口")forrelief_settingin["raised","flat","groove","ridge","solid","sunken"]:frame=Frame(top,borderwidth=2,relief=relief_setting)Label(frame,text=relief_setting,width=10).pack()frame.pack(side=LEFT,padx=5,pady=5)top.mainloop()10.2.3按鈕在主窗口w中創(chuàng)建了一個按鈕控件:btn=Button(w,text="Quit",command=w.quit)Command屬性:指定按鈕的事件處理函數(shù),將按鈕與某個函數(shù)或方法關(guān)聯(lián)起來。例10-3fromtkinterimport*top=Tk()top.title(u"主窗口")bt1=Button(top,text=u"禁用",state=DISABLED)bt2=Button(top,text=u"退出",command=top.quit)bt1.pack(side=LEFT)bt2.pack(side=LEFT)top.mainloop()10.2.4輸入框輸入框(Entry)是用來接收用戶文本輸入的組件。E1=Entry(f1,width=30)例10-4fromtkinterimport*top=Tk()top.title(u"登錄")f1=Frame(top)Label(f1,text=u"用戶名").pack(side=LEFT)E1=Entry(f1,width=30)E1.pack(side=LEFT)f1.pack()f2=Frame(top)Label(f2,text=u"密碼").pack(side=LEFT)E2=Entry(f2,width=30)E2.pack(side=LEFT)f2.pack()f3=Frame(top)Button(f3,text=u"登錄").pack()f3.pack()top.mainloop()10.2.5單選按鈕和復選按鈕單選按鈕(Radiobutton)和復選按鈕(Checkbutton)比較:相同點:都是用于用戶進行選擇輸入。區(qū)別:前者是互斥性選擇,即用戶只能從一組選項中選擇一個選項;而后者支持用戶選擇多個選項。(1)單選按鈕的創(chuàng)建:需要將這些按鈕與一個相同的變量關(guān)聯(lián)起來,以設定或獲取單選按鈕組當前的選中狀態(tài)。

r=Radiobutton(f1,text=txt,value=val,variable=choice)(2)復選框的創(chuàng)建:需要將每個選項與一個不同的變量關(guān)聯(lián)起來,以表示每個選項的選中狀態(tài)。r=Checkbutton(f1,text=txt,variable=ch,command=update_cstr)fromtkinterimport*top=Tk()top.title(u"單選")f1=Frame(top)choice=IntVar(f1)#定義動態(tài)綁定變量fortxt,valin[('1',1),('2',2),('3',3)]:#將所有的選項與變量choice綁定起來r=Radiobutton(f1,text=txt,value=val,variable=choice)r.pack()choice.set(1)#設定默認選項Label(f1,text=u"您選擇了:").pack()Label(f1,textvariable=choice).pack()#將標簽與變量動態(tài)綁定起來f1.pack()top.mainloop()例10-5例10-6fromtkinterimport*top=Tk()top.title(u"多選")f1=Frame(top)choice={}#存放綁定變量的字典cstr=StringVar(f1)cstr.set("")defupdate_cstr():selected=[str(i)foriin[1,2,3]ifchoice[i].get()==1]

cstr.set(",".join(selected))fortxt,valin[('1',1),('2',2),('3',3)]:ch=IntVar(f1)#建立與每個選項綁定的變量choice[val]=ch#將綁定的變量加入字典choicer=Checkbutton(f1,text=txt,variable=ch,command=update_cstr)r.pack()Label(f1,text=u"您選擇了:").pack()Label(f1,textvariable=cstr).pack()f1.pack()top.mainloop()10.2.6列表框與滾動條列表框(Listbox):用列表的形式展示多個選項以供用戶選擇。滾動條(Scrollbar):用來處理組件界面上一次性顯示不全的情況。scrollbar=Scrollbar(top)#創(chuàng)建滾動條mylist=Listbox(top,yscrollcommand=scrollbar.set)fromtkinterimport*top=Tk()top.title(u"列表框")scrollbar=Scrollbar(top)#創(chuàng)建滾動條scrollbar.pack(side=RIGHT,fill=Y)#設置滾動條布局#將列表與滾動條綁定,并加入主窗體mylist=Listbox(top,yscrollcommand=scrollbar.set)forlineinrange(20):mylist.insert(END,str(line))mylist.pack(side=LEFT,fill=BOTH)#設置列表布局scrollbar.config(command=mylist.yview)#將滾動條行為與列表綁定mainloop()例10-710.3對象的布局方式10.3.1pack布局管理器pack布局管理器將所有控件組織為一行或一列,控件的添加順序決定了它們在父控件中的位置。side屬性:改變控件的排列位置,LEFT表示左側(cè)對齊,RIGHT表示右側(cè)對齊。fill屬性:設置填充空間。 X:在水平方向填充, Y:在垂直方向填充, BOTH:在水平和垂直兩個方向上填充, NONE:不填充。ipadx/ipady:用于設置控件內(nèi)部在水平/垂直方向的間距。padx/pady用于設置控件外部在水平/垂直方向的間距。expand屬性:指定如何使用額外的“空白”空間。 =1:隨著父控件的大小變化而變化, =0:子控件大小不能擴展。fromtkinterimport*w=Tk()w.geometry('250x100')#改變w的大小為250x100Lbl1=Label(w,text='北京',bg='yellow3')Lbl1.pack(expand=1,side=LEFT,ipadx=20)Lbl2=Label(w,text='天津',bg='red')Lbl2.pack(fill=BOTH,expand=1,side=LEFT,padx=10)Lbl3=Label(w,text='上海',bg='green')Lbl3.pack(fill=X,expand=0,side=RIGHT,padx=10)w.mainloop()例10-810.3.2grid布局管理器grid布局管理器將窗口或框架視為一個由行和列構(gòu)成的二維表格,并將控件放入行列交叉處的單元格中。row:指定控件所要放置的行編號。column:指定控件所要放置的列編號。Sticky:用來改變對齊方式。如N、S、E、W、CENTER表示上、下、左、右、中心點,還可以取NE、SE、NW、SW,表示右上角、右下角、左上角、左下角。Rowspan:指定在行方向上的跨度。Columnspan:指定在列方向上的跨度。例10-9fromtkinterimport*w=Tk()var1=IntVar()var2=IntVar()Label(w,text="姓名").grid(row=0,column=0,sticky=W)Label(w,text="住址").grid(row=1,column=0,sticky=W)Entry(w).grid(row=0,column=1)Entry(w).grid(row=1,column=1)lframe=LabelFrame(w,text='性別')radiobutton1=Radiobutton(lframe,text='男',variable=var1)radiobutton2=Radiobutton(lframe,text='女',variable=var2)lframe.grid(sticky=W)radiobutton1.grid(sticky=W)radiobutton2.grid(sticky=W)photo=PhotoImage(file="e:\\mypython\\photo.png")label=Label(image=photo)label.image=photolabel.grid(row=2,column=1,sticky=W+E+N+S,padx=5,pady=5)w.mainloop()10.3.3place布局管理器place布局管理器可以直接指定控件在父控件(窗口或框架)中的位置坐標。為使用這種布局,只需先創(chuàng)建控件,再調(diào)用控件的place()方法,并使用該方法的選項x和y設定坐標。父控件的坐標系以左上角為原點(0,0),x軸方向向右,y軸方向向下。>>>Label(w,text="Hello").place(x=0,y=0)>>>Label(w,text="World").place(x=199,y=199,anchor=SE)>>>Label(w,text="Hello").place(relx=0.25,rely=0.5,anchor=SW)10.4對話框10.4.1自定義對話框主要步驟:(1)先創(chuàng)建頂層窗口對象(2)添加所需的按鈕和其他控件。例10-10簡易對話框應用示例。fromtkinterimport*defMsg():top=Toplevel(width=400,height=200)Label(top,text='Python').pack()w=Tk()Button(w,text='OK',command=Msg).pack()w.mainloop()10.4.2標準對話框1.messagebox子模塊

提供一系列用于顯示信息或進行簡單對話的消息框,可通過調(diào)用函數(shù)askyesno()、askquestion()、askyesnocancel()、askokcancel()、askretrycancel()、showerror()、showinfo()和showwarning()來創(chuàng)建。fromtkinter.messageboximport*ask=askyesno(title='消息框演示',message='是否繼續(xù)?')ifask:showinfo(title='信息提示',message='繼續(xù)!')else:showinfo(title='信息提示',message='終止!')例子:2.filedialog子模塊

提供用于文件瀏覽、打開和保存的對話框,可通過調(diào)用函數(shù)askopenfilename()、asksaveasfilename()等函數(shù)來創(chuàng)建。fromtkinter.filedialogimport*askopenfilename(title='文件對話框',\filetypes=[('Python源文件','.py')])例子:打開對話框3.colorchooser子模塊提供用于選擇顏色的對話框,可通過函數(shù)askcolor()來創(chuàng)建。fromtkinter.colorchooserimport*askcolor(title='顏色對話框')10.5事件處理10.5.1事件處理程序1.事件的描述一般形式是:<修飾符>-<類型符>-<細節(jié)符>修飾符:描述鼠標的單擊、雙擊,以及鍵盤組合按鍵等情況。類型符:事件類型,最常用的類型有分別表示鼠標事件和鍵盤事件的Button和Key。細節(jié)符:具體的鼠標鍵或鍵盤按鍵,如鼠標的左、中、右三個鍵分別用1、2、3表示,鍵盤按鍵用相應字符或按鍵名稱表示。例如:<Double-Button-1>(1)常用鼠標事件<ButtonPress-1>:按下鼠標左鍵,可簡寫為<Button-1>或<1>。類似的有<Button-2>(按下鼠標中鍵)和<Button-3>(按下鼠標右鍵)。<B1-Motion>:按下鼠標左鍵并移動鼠標。類似的有<B2-Motion>和<B3-Motion>。<Double-Button-1>:雙擊鼠標左鍵。<Enter>:鼠標指針進入控件。<Leave>:鼠標指針離開控件。(2)常用鍵盤事件<KeyPress-a>:按下a鍵??珊唽憺?lt;Key-a>或a(不用尖括號)。注意:空格鍵對應的事件是<space>,小于號鍵對應的事件是<less>。<Return>:按下回車鍵。不可顯示字符都可像回車鍵這樣用<鍵名>表示對應事件,例如<Tab>、<Shift_L>、<Control_R>、<Up>、<Down>、<F1>等。<Key>:按下任意鍵。<Shift-Up>:同時按下Shift鍵和↑鍵。類似的還有Alt鍵組合、Ctrl鍵組合。2.事件對象每個事件都導致系統(tǒng)創(chuàng)建一個事件對象,并將該對象傳遞給事件處理函數(shù)。常用的屬性x和y:鼠標單擊位置相對于控件左上角的坐標,單位是像素。x_root和y_root:鼠標單擊位置相對于屏幕左上角的坐標,單位是像素。num:單擊的鼠標鍵號,1、2、3分別表示左、中、右鍵。char:如果按下可顯示字符鍵,此屬性是該字符。如果按下不可顯示鍵,此屬性為空串。keysym:如果按下可顯示字符鍵,此屬性是該字符。如果按下不可顯示鍵,此屬性設置為該鍵的名稱。keycode:所按鍵的ASCII碼。注意,此編碼無法得到上擋字符的ASCII碼。keysym_num:這是keysym的數(shù)值表示。對普通單字符鍵來說,就是ASCII碼。3.事件處理函數(shù)(回調(diào)(callback)函數(shù))的一般形式def函數(shù)名(event):

函數(shù)體10.5.2事件綁定1.事件綁定的方式(1)對象綁定和窗口綁定形式如下:控件對象.bind(事件描述符,事件處理程序)fromtkinterimport*

defcallback(event):

print("clickedat",event.x,event.y)

w=Tk()

w.bind("<Button-1>",callback)

w.mainloop()例10-11窗口綁定應用示例。(2)類綁定一般形式如下:控件對象.bind_class(控件類描述符,事件描述符,事件處理程序)例10-12類綁定應用示例。fromtkinterimport*defcal

溫馨提示

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

評論

0/150

提交評論