零基础学Python【二十三、图形化界面设计 】(基础一篇全,欢迎认领)
1、圖形化界面設計的基本理解
當前流行的計算機桌面應用程序大多數為圖形化用戶界面(Graphic User Interface,GUI)。
即通過鼠標對菜單、按鈕等圖形化元素觸發指令,并從標簽、對話框等圖型化顯示容器中獲取人機對話信息。
Python自帶了tkinter 模塊,實質上是一種流行的面向對象的GUI工具包 TK 的Python編程接口,提供了快速便利地創建GUI應用程序的方法。
其圖像化編程的基本步驟通常包括:
- 導入 tkinter 模塊
- 創建 GUI 根窗體
- 添加人機交互控件并編寫相應的函數。
- 在主事件循環中等待用戶觸發事件響應。
2、窗體控件布局
根窗體是圖像化應用程序的根控制器,是tkinter的底層控件的實例。
當導入tkinter模塊后,調用 Tk()方法可初始化一個根窗體實例 root ,用 title() 方法可設置其標題文字,用geometry()方法可以設置窗體的大小(以像素為單位)。
將其置于主循環中,除非用戶關閉,否則程序始終處于運行狀態。
執行該程序,一個窗體就呈現出來了。
在這個主循環的根窗體中,可持續呈現中的其他可視化控件實例,監測事件的發生并執行相應的處理程序。
下面是根窗體呈現示例:
import tkinter #聲明窗體 root=tkinter.Tk() #編輯窗體提示文字 root.title("我的第一個程序") #設置窗體大小·注意,不是乘號*而是小寫的x #如果想設置顯示位置的寫法是:root.geometry("800x600+100+50") root.geometry("800x600+100+50") #展示窗體 root.mainloop()3、tkinter 常用控件
| Button | 按鈕 | 單擊觸發事件 |
| Canvas | 畫布 | 繪制圖形或繪制特殊控件 |
| Checkbutton | 復選框 | 多項選擇 |
| Entry | 輸入框 | 接收單行文本輸入 |
| Frame | 框架 | 用于控件分組 |
| Label | 標簽 | 單行文本顯示 |
| Listbox | 列表框 | 顯示文本列表 |
| Menu | 菜單 | 創建菜單命令 |
| Message | 消息 | 多行文本標簽,與Label用法類似 |
| Radiobutton | 單選按鈕 | 從互斥的多個選項中做單項選擇 |
| Scale | 滑塊 | 默認垂直方向,鼠標拖動改變數值形成可視化交互 |
| Scrollbar | 滑動條 | 默認垂直方向,鼠標拖動改變數值,可與Text,Listbox,Canvas等控件配合移動可視化空間 |
| Text | 文本框 | 接收或輸出多行文本 |
| Toplevel | 新建窗體容器 | 在頂層創建新窗體 |
4、控件的共同屬性
在窗體上呈現的可視化控件,通常包括尺寸、顏色、字體、相對位置、浮雕樣式、圖標樣式和懸停光標形狀等共同屬性。
不同的控件由于形狀和功能不同,又有其特征屬性。
在初始化根窗體和根窗體主循環之間,可實例化窗體控件,并設置其屬性。父容器可為根窗體或其他容器控件實例。常見的控件共同屬性如下表:
| anchor | 文本起始位置 | CENTER(默認),E,S,W,N,NE,SE,SW,NW |
| bg | 背景色 | 色值,自行獲取即可 |
| bd | 加粗(默認2像素) | 無 |
| bitmap | 黑白二值圖標 | ? |
| cursor | 鼠標懸停光標 | ? |
| font | 字體 | 無 |
| fg | 字體顏色 | 無 |
| height | 高(文本控件的單位為行) | 無 |
| image | 顯示圖像 | 無 |
| padx | 水平擴展像素 | 無 |
| pady | 垂直擴展像素 | 無 |
| relief | 3D浮雕樣式 | flat(平的)、raised(凸起的)、sunken(凹陷的)、groove(溝槽狀邊緣)、ridge(脊狀邊緣) |
| state | 控件實例狀態是否可用 | NORMAL(默認),DISABLED |
| width | 寬(文本控件的單位為行) | 無 |
簡單樣式使用:
import tkinter #聲明窗體 root=tkinter.Tk() #編輯窗體提示文字 root.title("我的第一個程序") #設置窗體大小·注意,不是乘號*而是小寫的x #如果想設置顯示位置的寫法是:root.geometry("800x600+100+50") root.geometry("800x600+100+50") #設置文本標簽label label = tkinter.Label(root,#添加到root下text="HelloWorld",#文本設置bg="#d3fbfb",#背景`顏色fg="red",#字體顏色font=("宋體",32),#字體大小樣式width=20,#寬度height=2,#高度relief="sunken")#設置浮雕樣式 #設置填充布局 label.pack() #展示窗體 root.mainloop()屬性 relief 為控件呈現出來的3D浮雕樣式,有 flat(平的)、raised(凸起的)、sunken(凹陷的)、groove(溝槽狀邊緣)和 ridge(脊狀邊緣) 5種。
5、控件布局
5.1、place() 使用方法
x:指定組件的 X 坐標。x 為 0 代表位于最左邊。
y:指定組件的 Y 坐標。y 為 0 代表位于最右邊。
relx:指定組件的 X 坐標,以父容器總寬度為單位 1,該值應該在 0.0~1.0 之間,其中 0.0 代表位于窗口最左邊,1.0 代表位于窗口最右邊,0.5 代表位于窗口中間。
rely:指定組件的 Y 坐標,以父容器總高度為單位 1,該值應該在 0.0~1.0? 之間,其中 0.0 代表位于窗口最上邊,1.0 代表位于窗口最下邊,0.5 代表位于窗口中間。
width:指定組件的寬度,以 pixel 為單位。
height:指定組件的高度,以 pixel 為單位。
relwidth:指定組件的寬度,以父容器總寬度為單位 1,該值應該在 0.0~1.0 之間,其中 1.0 代表整個窗口寬度,0.5 代表窗口的一半寬度。
relheight:指定組件的高度,以父容器總高度為單位 1,該值應該在 0.0~1.0 之間,其中 1.0 代表整個窗口高度,0.5 代表窗口的一半高度。
bordermode:該屬性支持“inside”或“outside” 屬性值,用于指定當設置組件的寬度、高度時是否計算該組件的邊框寬度。
當使用 Place 布局管理容器中的組件時,需要設置組件的 x、y 或 relx、rely 選項,Tkinter 容器內的坐標系統的原點 (0,0) 在左上角,其中 X 軸向右延伸,Y 軸向下延伸,如圖所示
如果通過 x、y 指定坐標,單位就是 pixel(像素);如果通過 relx、rely 指定坐標,則以整個父容器的寬度、高度為 1。不管通過哪種方式指定坐標,通過圖 1 不難發現,通過 x 指定的坐標值越大,該組件就越靠右;通過 y 指定的坐標值越大,該組件就越靠下。
5.2、pack() 使用方法
是一種簡單的布局方法,的默認方式將按布局語句的先后,以最小占用空間的方式自上而下地排列控件實例,并且保持控件本身的最小尺寸。
用pack() 方法不加參數排列標簽。為看清楚各控件所占用的空間大小,文本用了不同長度的中英文,并設置relief="groove"的凹陷邊緣屬性。
?
使用pack()方法可設置 fill、side 等屬性參數。其中,參數fill 可取值:fill=X,fill=Y或fill=BOTH,分別表示允許控件向水平方向、垂直方向或二維伸展填充未被占用控件。參數 side 可取值:side=TOP(默認),side=LEFT,side=RIGHT,side=BOTTOM,分別表示本控件實例的布局相對于下一個控件實例的方位。
#coding=utf-8 import tkinter root = tkinter.Tk() root.title("這是標題") root.geometry("400x400+200+200") LabelRed = tkinter.Label(root,text="abcdefghijklmnopqrstuvwxyz",fg="Red",relief = "groove") LabelRed.pack() LabelGreen = tkinter.Label(root,text="一二三四五六七八九十",fg="green",relief = "groove") LabelGreen.pack(fill = "y",side = "right") LabelBlue = tkinter.Label(root,text="1234567890",fg="blue",relief = "groove") LabelBlue.pack(fill = "x",side = "bottom") LabelBlack = tkinter.Label(root,text = "This is BlackLabel",fg = "black",relief = "groove") LabelBlack.pack(fill = "both",side = "left") root.mainloop()5.3、grid() 使用方法
是基于網格的布局。先虛擬一個二維表格,再在該表格中布局控件實例。由于在虛擬表格的單元中所布局的控件實例大小不一,單元格也沒有固定或均一的大小,因此其僅用于布局的定位。pack()方法與grid()方法不能混合使用。
grid()方法常用布局參數如下:
6、tkinter常見控件的特征屬性
6.1、文本輸入和輸出相關控件:
文本的輸入與輸出控件通常包括:標簽(Label)、消息(Message)、輸入框(Entry)、文本框(Text)。他們除了前述共同屬性外,都具有一些特征屬性和功能。
標簽(Label)和 消息(Message):除了單行與多行的不同外,屬性和用法基本一致,用于呈現文本信息。值得注意的是:屬性text通常用于實例在第一次呈現時的固定文本,而如果需要在程序執行后發生變化,則可以使用下列方法之一實現:1、用控件實例的configure()方法來改變屬性text的值,可使顯示的文本發生變化;2、先定義一個tkinter的內部類型變量var=StringVar() 的值也可以使顯示文本發生變化。
看下面的一個例子:制作一個電子時鐘,用root的after()方法每隔1秒time模塊以獲取系統當前時間,并在標簽中顯示出來。
方法一:利用configure()方法或config()來實現文本變化。
import tkinter import timedef gettime():timestr = time.strftime("%H:%M:%S") # 獲取當前的時間并轉化為字符串lb.configure(text=timestr) # 重新設置標簽文本root.after(1000,gettime) # 每隔1s調用函數 gettime 自身獲取時間root = tkinter.Tk() root.title('時鐘')lb = tkinter.Label(root,text='',fg='blue',font=("黑體",80)) lb.pack() gettime() root.mainloop()方法二:利用textvariable變量屬性來實現文本變化。
import tkinter import timedef gettime():var.set(time.strftime("%H:%M:%S")) # 獲取當前時間root.after(1000,gettime) # 每隔1s調用函數 gettime 自身獲取時間root = tkinter.Tk() root.title('時鐘') var=tkinter.StringVar()lb = tkinter.Label(root,textvariable=var,fg='blue',font=("黑體",80)) lb.pack() gettime() root.mainloop()6.2、文本框(Text):
文本框的常用方法如下:
| delete(起始位置,[,終止位置]) | 刪除指定區域文本 |
| get(起始位置,[,終止位置]) | 獲取指定區域文本 |
| insert(位置,[,字符串]...) | 將文本插入到指定位置 |
| see(位置) | 在指定位置是否可見文本,返回布爾值 |
| index(標記) | 返回標記所在的行和列 |
| mark_names() | 返回所有標記名稱 |
| mark_set(標記,位置) | 在指定位置設置標記 |
| mark_unset(標記) | 去除標記 |
上表位置的取值可為整數,浮點數或END(末尾),例如0.0表示第0列第0行
如下一個例子:每隔1秒獲取一次當前日期的時間,并寫入文本框中,如下:本例中調用 datetime.now()獲取當前日期時間,用insert()方法每次從文本框txt的尾部(END)開始追加文本。
6.3、輸入框(Entry):
通常作為功能比較單一的接收單行文本輸入的控件,雖然也有許多對其中文本進行操作的方法,但通常用的只有取值方法get()和用于刪除文本的delete(起始位置,終止位置),例如:清空輸入框為delete(0,END)。
語法格式如下:
w = Entry( master, option, ... )-
master: 按鈕的父容器。
-
options: 可選項,即該按鈕的可設置的屬性。這些選項可以用鍵 = 值的形式設置,并以逗號分隔。
| 1 | bg 輸入框背景顏色 |
| 2 | bd 邊框的大小,默認為 2 個像素 |
| 3 | cursor 光標的形狀設定,如arrow, circle, cross, plus 等 |
| 4 | font 文本字體 |
| 5 | exportselection 默認情況下,你如果在輸入框中選中文本,默認會復制到粘貼板,如果要忽略這個功能刻工藝設置 exportselection=0。 |
| 6 | fg 文字顏色。值為顏色或為顏色代碼,如:'red','#ff0000' |
| 7 | highlightcolor 文本框高亮邊框顏色,當文本框獲取焦點時顯示 |
| 8 | justify 顯示多行文本的時候,設置不同行之間的對齊方式,可選項包括LEFT, RIGHT, CENTER |
| 9 | relief 邊框樣式,設置控件3D效果,可選的有:FLAT、SUNKEN、RAISED、GROOVE、RIDGE。默認為 FLAT。 |
| 10 | selectbackground 選中文字的背景顏色 |
| 11 | selectborderwidth 選中文字的背景邊框寬度 |
| 12 | selectforeground 選中文字的顏色 |
| 13 | show 指定文本框內容顯示為字符,值隨意,滿足字符即可。如密碼可以將值設為 show="*" |
| 14 | state 默認為 state=NORMAL, 文框狀態,分為只讀和可寫,值為:normal/disabled |
| 15 | textvariable 文本框的值,是一個StringVar()對象 |
| 16 | width 文本框寬度 |
| 17 | xscrollcommand 設置水平方向滾動條,一般在用戶輸入的文本框內容寬度大于文本框顯示的寬度時使用。 |
方法
下表為文本框組件常用的方法:
| 1 | delete ( first, last=None ) 刪除文本框里直接位置值 text.delete(10) # 刪除索引值為10的值 text.delete(10, 20) # 刪除索引值從10到20之前的值 text.delete(0, END) # 刪除所有值 |
| 2 | get() 獲取文件框的值 |
| 3 | icursor ( index ) 將光標移動到指定索引位置,只有當文框獲取焦點后成立 |
| 4 | index ( index ) 返回指定的索引值 |
| 5 | insert ( index, s ) 向文本框中插入值,index:插入位置,s:插入值 |
| 6 | select_adjust ( index ) 選中指定索引和光標所在位置之前的值 |
| 7 | select_clear() 清空文本框 |
| 8 | select_from ( index ) 設置光標的位置,通過索引值 index 來設置 |
| 9 | select_present() 如果有選中,返回 true,否則返回 false。 |
| 10 | select_range ( start, end ) 選中指定索引位置的值,start(包含) 為開始位置,end(不包含) 為結束位置start必須比end小 |
| 11 | select_to ( index ) 選中指定索引與光標之間的值 |
| 12 | xview ( index ) 該方法在文本框鏈接到水平滾動條上很有用。 |
| 13 | xview_scroll ( number, what ) 用于水平滾動文本框。 what 參數可以是 UNITS, 按字符寬度滾動,或者可以是 PAGES, 按文本框組件塊滾動。 number 參數,正數為由左到右滾動,負數為由右到左滾動。 |
6.4、按鈕(Button):
主要是為響應鼠標單擊事件觸發運行程序所設的,故其除控件共有屬性外,屬性command是最為重要的屬性。通常,將按鈕要觸發執行的程序以函數形式預先定義,然后可以用一下兩種方法調用函數。Button按鈕的狀態有:'normal','active','disabled'
-
直接調用函數。參數表達式為“command=函數名”,注意函數名后面不要加括號,也不能傳遞參數。如下面的command=run1:
-
利用匿名函數調用函數和傳遞參數。參數的表達式為“command=lambda”:函數名(參數列表)。例如下面的:"command=lambda:run2(inp1.get(),inp2.get())"。
-
看下面的例子:1.從兩個輸入框去的輸入文本后轉為浮點數值進行加法運算,要求每次單擊按鈕產生的算是結果以文本的形式追加到文本框中,將原輸入框清空。2.按鈕方法一不傳參數調用函數run1()實現,按鈕“方法二”用lambda調用函數run2(x,y)同時傳遞參數實現。
6.5、單選按鈕:(Radiobutton)
是為了響應故鄉排斥的若干單選項的單擊事件以觸發運行自定義函數所設的,該控件排除具有共有屬性外,還具有顯示文本(text)、返回變量(variable)、返回值(value)、響應函數名(command)等重要屬性。響應函數名“command=函數名”的用法與Button相同,函數名最后也要加括號。返回變量variable=var通常應預先聲明變量的類型var=IntVar()或var=StringVar(),在所調用的函數中方可用var.get()方法獲取被選中實例的value值。例如下面:
from tkinter import * def Mysel():dic = {0:'甲',1:'乙',2:'丙'}s = "您選了" + dic.get(var.get()) + "項"lb.config(text = s)root = Tk() root.title('單選按鈕') lb = Label(root) lb.pack()var = IntVar() rd1 = Radiobutton(root,text="甲",variable=var,value=0,command=Mysel) rd1.pack()rd2 = Radiobutton(root,text="乙",variable=var,value=1,command=Mysel) rd2.pack()rd3 = Radiobutton(root,text="丙",variable=var,value=2,command=Mysel) rd3.pack()root.mainloop()6.5、復選框:(Checkbutton)
是為了返回多個選項值的交互控件,通常不直接觸發函數的執行。該控件除具有共有屬性外,還具有顯示文本(text)、返回變量(variable)、選中返回值(onvalue)和未選中默認返回值(offvalue)等重要屬性。返回變量variable=var 通常可以預先逐項分別聲明變量的類型var=IntVar() (默認)或 var=StringVar(), 在所調用的函數中方可分別調用 var.get()方法 取得被選中實例的 onvalue或offvalue值。復選框實例通常還可分別利用 select()、deselect()和 toggle() 方法對其進行選中、清除選中和反選操作。
如下的例子: 利用復選框實現,單擊OK,可以將選中的結果顯示在標簽上。效果如下:
from tkinter import * import tkinterdef run():if(CheckVar1.get()==0 and CheckVar2.get()==0 and CheckVar3.get()==0 and CheckVar4.get()==0):s = '您還沒選擇任何愛好項目'else:s1 = "足球" if CheckVar1.get()==1 else ""s2 = "籃球" if CheckVar2.get() == 1 else ""s3 = "游泳" if CheckVar3.get() == 1 else ""s4 = "田徑" if CheckVar4.get() == 1 else ""s = "您選擇了%s %s %s %s" % (s1,s2,s3,s4)lb2.config(text=s)root = tkinter.Tk() root.title('復選框') lb1=Label(root,text='請選擇您的愛好項目') lb1.pack()CheckVar1 = IntVar() CheckVar2 = IntVar() CheckVar3 = IntVar() CheckVar4 = IntVar()ch1 = Checkbutton(root,text='足球',variable = CheckVar1,onvalue=1,offvalue=0) ch2 = Checkbutton(root,text='籃球',variable = CheckVar2,onvalue=1,offvalue=0) ch3 = Checkbutton(root,text='游泳',variable = CheckVar3,onvalue=1,offvalue=0) ch4 = Checkbutton(root,text='田徑',variable = CheckVar4,onvalue=1,offvalue=0)ch1.pack() ch2.pack() ch3.pack() ch4.pack()btn = Button(root,text="OK",command=run) btn.pack()lb2 = Label(root,text='') lb2.pack() root.mainloop()6.6、列表框 與 組合框:
列表框:(Listbox) 可供用戶單選或多選所列條目以形成人機交互。列表框控件的主要方法見下面的表:
| curselection() | 返回光標選中項目編號的元組,注意并不是單個的整數 |
| delete(起始位置,終止位置) | 刪除項目,終止位置可省略,全部清空為delete(0,END) |
| get(起始位置,終止位) | 返回范圍所含項目文本的元組,終止位置可忽略 |
| insert(位置,項目元素) | 插入項目元素(若有多項,可用列表或元組類型賦值),若位置為END,則將項目元素添加在最后 |
| size() | 返回列表框行數 |
執行自定義函數時,通常使用“實例名.surselection()” 或 “selected” 來獲取選中項的位置索引。由于列表框實質上就是將Python 的列表類型數據可視化呈現,在程序實現時,也可直接對相關列表數據進行操作,然后再通過列表框展示出來,而不必拘泥于可視化控件的方法。看下面的一個例子:實現列表框的初始化、添加、插入、修改、刪除和清空操作,如下:
from tkinter import * def ini():Lstbox1.delete(0,END)list_items = ["數學","物理","化學","語文","外語"]for item in list_items:Lstbox1.insert(END,item)def clear():Lstbox1.delete(0,END)def ins():if entry.get() != '':if Lstbox1.curselection() == ():Lstbox1.insert(Lstbox1.size(),entry.get())else:Lstbox1.insert(Lstbox1.curselection(),entry.get())def updt():if entry.get() != '' and Lstbox1.curselection() != ():selected=Lstbox1.curselection()[0]Lstbox1.delete(selected)Lstbox1.insert(selected,entry.get())def delt():if Lstbox1.curselection() != ():Lstbox1.delete(Lstbox1.curselection())root = Tk() root.title('列表框實驗') root.geometry('320x240')frame1 = Frame(root,relief=RAISED) frame1.place(relx=0.0)frame2 = Frame(root,relief=GROOVE) frame2.place(relx=0.5)Lstbox1 = Listbox(frame1) Lstbox1.pack()entry = Entry(frame2) entry.pack()btn1 = Button(frame2,text='初始化',command=ini) btn1.pack(fill=X)btn2 = Button(frame2,text='添加',command=ins) btn2.pack(fill=X)btn3 = Button(frame2,text='插入',command=ins) # 添加和插入功能實質上是一樣的 btn3.pack(fill=X)btn4 = Button(frame2,text='修改',command=updt) btn4.pack(fill=X)btn5 = Button(frame2,text='刪除',command=delt) btn5.pack(fill=X)btn6 = Button(frame2,text='清空',command=clear) btn6.pack(fill=X)root.mainloop()組合框:(Combobox) 實質上是帶文本框的上拉列表框,其功能也將是Python 的列表類型數據可視化呈現,并提供用戶單選或多選所列條目以形成人機交互。在圖形化界面設計時,由于其具有靈活的界面,因此往往比列表框更受喜愛。但該控件并不包含在 tkinter 模塊中,而是與 TreeView、Progressbar、Separator等控件一同包含在tkinter 的子模塊ttk中。如果使用該控件,應先與from tkinter import ttk 語句引用ttk子模塊,然后創建組合框實例: 實例名=Combobox(根對象,[屬性列表])
指定變量var=StringVar(),并設置實例屬性 textvariable = var,values=[列表...]。組合框控件常用方法有:獲得所選中的選項值get()和獲得所選中的選項索引current()。
看下面的一個例子:實現四則運算計算器,將兩個操作數分別填入兩個文本框后,通過選擇組合框中的算法觸發運算,如下:
6.7、滑塊(Scale):
是一種 直觀地進行數值輸入的交互控件,其主要屬性見下表:
| from_ | 起始值(最小可取值) |
| lable | 標簽文字,默認為無 |
| length | 滑塊控件實例寬(水平方向)或 高(垂直方向),默認為100像素 |
| orient | 滑塊控件實例呈現方向,VERTCAL或HORIZONTAL(默認) |
| repeatdelay | 鼠標響應延時,默認為 300ms |
| resolution | 分辨精度,即最小值間隔 |
| sliderlength | 滑塊寬度,默認為30 像素 |
| state | 狀態,若設置 state=DISABLED,則滑塊控件實例不可用 |
| tickinterval | 標尺間隔,默認為0,若設置過小,則會重疊 |
| to | 終止值(最大可取值) |
| variable | 返回數值類型,可為IntVar(整數)、DoubleVar(浮點數)、或 StringVar(字符串) |
| width | 控件實例本身的寬度,默認為15像素 |
滑塊控件實例的主要方法比較簡單,有 get()和set(值),分別為取值和將滑塊設在某特定值上。滑塊實例也可綁定鼠標左鍵釋放事件<ButtoonRelease-1>,并在執行函數中添加參數event來實現事件響應。
例如:在一個窗體上設計一個200像素寬的水平滑塊,取值范圍為1.0~5.0,分辨精度為0.05,刻度間隔為 1,用鼠標拖動滑塊后釋放鼠標可讀取滑塊值并顯示在標簽上。效果如下:
6.8、菜單:(Menu)
用于可視化地為一系列的命令分組,從而方便用戶找到和觸發執行這些命令。這里Menu所實例化別的主要是菜單,其通式為:
菜單實例名=Menu(根窗體) 菜單分組1=Menu(菜單實例名) 菜單實例名.add_cascade(<label=菜單分組1 顯示文本>,<menu=菜單分組1>) 菜單分組1.add_command(<label=命令1文本>,<command=命令1函數名>)其中較為常見的方法有:add_cascade()、add_command()和add_separator(),分別用于添加一個菜單分組、添加一條菜單命令和添加一條分割線。
利用Menu控件也可以創建快捷菜單(又稱為上下文菜單)。通常需要右擊彈出的控件實例綁定鼠標右擊響應事件<Button-3>,并指向一個捕獲event參數的自定義函數,在該自定義函數中,將鼠標的觸發位置event.x_root 和 event.y_root以post()方法傳給菜單。
例子:仿照window自帶的“記事本”中的文件和編輯 菜單,實現在主菜單個快捷菜單上觸發菜單命令,并相應改變窗體上的標簽的文本內容。效果如下:
6.9、子窗體:
用Toplevel可新建一個顯示在最前面的子窗體,其通式為: 字體實例名=Toplevel(根窗體),子窗體與根窗體類似,也可設置title、geomerty等屬性,并在畫布上布局其他控件。如下的例子:在根窗體上創建菜單,觸發創建一個新的窗體
from tkinter import *def newwind():winNew = Toplevel(root)winNew.geometry('320x240')winNew.title('新窗體')lb2 = Label(winNew,text='我在新窗體上')lb2.place(relx=0.2,rely=0.2)btClose=Button(winNew,text='關閉',command=winNew.destroy)btClose.place(relx=0.7,rely=0.5)root = Tk() root.title('新建窗體實驗') root.geometry('320x240')lb1 = Label(root,text='主窗體',font=('黑體',32,'bold')) lb1.place(relx=0.2,rely=0.2)mainmenu = Menu(root) menuFile = Menu(mainmenu) mainmenu.add_cascade(label='菜單',menu=menuFile) menuFile.add_command(label='新窗體',command=newwind) menuFile.add_separator() menuFile.add_command(label='退出',command=root.destroy)root.config(menu=mainmenu) root.mainloop()關閉窗體程序運行的方法通常用 destory(),而不建議用 quit()。用Toplevel 所創建的子窗體是非模式(Modeless)的窗體,雖然初建時子窗體在最前面,但根窗體上的控件實例也是可以被操作的。
6.10、模式對話框(Modal):
是相對于前面介紹的非模式窗體而言的,所彈出的對話框必須應答,在關閉之前無法操作其后面的其他窗體。常見的模式對話框有消息對話框、輸入對話框、文件選擇對話框、顏色選擇對話框等。
消息對話框: 引用 tkinter.messagebox 包,可使用消息對話框函數。執行這些函數,可彈出模式消息對話框,并根據用戶的響應但會一個布爾值。其通式為:
消息對話框函數(<title=標題文本>,<message=消息文本>,[其他參數])看下面的例子:單擊按鈕,彈出確認取消對話框,并將用戶回答顯示在標簽中。效果如下:
from tkinter import * import tkinter.messageboxdef xz():answer=tkinter.messagebox.askokcancel('請選擇','請選擇確定或取消')if answer:lb.config(text='已確認')else:lb.config(text='已取消')root = Tk()lb = Label(root,text='') lb.pack() btn=Button(root,text='彈出對話框',command=xz) btn.pack() root.mainloop()?
輸入對話框:
引用tkinter.simpledialog包,可彈出輸入對話框,用以接收用戶的簡單輸入。輸入對話框常用 askstring()、askfloat()和askfloat() 三種函數,分別用于接收字符串、整數和浮點數類型的輸入。
如下面的例子:單擊按鈕,彈出輸入對話框,接收文本輸入顯示在窗體的標簽上。如下:
文件選擇對話框:
引用tkinter.filedialog包,可彈出文件選擇對話框,讓用戶直觀地選擇一個或一組文件,以供進一步的文件操作。常用的文件選擇對話框函數有 askopenfilename()、askopenfilenames()和asksaveasfilename(),分別用于進一步打開一個文件、一組文件和保存文件。其中,askopenfilename()和asksaveasfilenamme()函數的返回值類型為包含文件路徑的文件名字符串,而askopenfilenames()函數的返回值類型為元組。
例如:單擊按鈕,彈出文件選擇對話框(“打開”對話框),并將用戶所選擇的文件路徑和文件名顯示在窗體的標簽上。如下:
?打開選擇窗口:
選中文件:
6.11、顏色選擇對話框:
引用tkinter.colorchooser包,可使用 askcolor()函數彈出模式顏色選擇對話框,讓用戶可以個性化地設置顏色屬性。該函數的返回形式為包含RGB十進制浮點元組和RGB十六進制字符串的元組類型,例如:“((135.527343.52734375,167.65234375,186.7265625)),'#87a7ba'”。通常,可將其轉換為字符串類型后,再截取以十六進制數表示的RGB顏色字符串用于為屬性賦值。
舉例:單擊按鈕,彈出顏色選擇對話框,并將用戶所選擇的顏色設置為窗體上標簽的背景顏色,如下:
7、事件響應
用tkinter 可將用戶事件與自定義函數綁定,用鍵盤或鼠標的動作事件來響應觸發自定義函數的執行。其通式為:
控件實例.bind(<事件代碼>,<函數名>)其中,事件代碼通常以半角小于號“<”和大于號“>” 界定,包括事件和按鍵等 2~3個部分,它們之間用減號分隔,常見事件代碼見下表:
| 單擊鼠標左鍵 | <ButtonPress-1> | 可簡寫為<Button-1> 或 <1> |
| 單擊鼠標中鍵 | <ButtonPress-2> | 可簡寫為<Button-2> 或 <2> |
| 單擊鼠標右鍵 | <ButtonPress-3> | 可簡寫為<Button-3> 或 <3> |
| 釋放鼠標左鍵 | <ButtonRelease-1> | --- |
| 釋放鼠標中鍵 | <ButtonRelease-2> | --- |
| 釋放鼠標右鍵 | <ButtonRelease-3> | --- |
| 按住鼠標左鍵移動 | <B1-Motion> | --- |
| 按住鼠標中鍵移動 | <B2-Motion> | --- |
| 按住鼠標右鍵移動 | <B3-Motion> | --- |
| 轉動鼠標滾輪 | <MouseWheel> | --- |
| 雙擊鼠標左鍵 | <Double-Button-1> | --- |
| 鼠標進入控件實例 | <Enter> | 注意與回車事件的區別 |
| 鼠標離開控件實例 | <Leave> | --- |
| 鍵盤任意鍵 | <Key> | --- |
| 字母和數字 | < Key-字母>,例如<key-a>、<Key-A> | 簡寫不帶小于和大于號,例如:a,A和1等 |
| 回車 | <Return> | <Tab>,<Shift>,<Control>(注意不能用<Ctrl>),<Alt>等類同 |
| 空格 | <Space> | --- |
| 方向鍵 | <Up> ,<Down>,<Left>,<Right> | --- |
| 功能鍵 | <Fn>例如:<F1>等 | --- |
| 組合鍵 | 鍵名之間以減號鏈接,例如<Control-k>,<Shift-6>,<Alt-Up>等 | 注意大小寫 |
例如,將框架控件實例frame 綁定鼠標右鍵單擊事件,調用自定義函數 myfunc()可表示為"frame.bind('<Button-3>',myfunc)",注意: myfunc后面沒有括號。將控件實例綁定到鍵盤事件和部分光標不落在具體控件實例上的鼠標事件時,還需要設置該實例執行focus_set() 方法獲得焦點,才能對事件持續響應。例如: frame.focus_set()。所調用的自定義函數若需要利用鼠標或鍵盤的響應值,可將event作為參數,通過event的屬性獲取。event的屬性見下表:
| x或y(注意是小寫) | 相對于事件綁定控件實例左上角的坐標值(像素) |
| root_x或root_y(注意是小寫) | 相對于顯示屏幕左上角的坐標值(像素) |
| char | 可顯示的字符,若按鍵不可顯示,則返回為空字符串 |
| keysysm | 字符或字符型按鍵名,如:“a”或“Escape” |
| keysysm_num | 按鍵的十進制 ASCII 碼值 |
例如:將標簽綁定鍵盤任意鍵觸發事件并獲取焦點,并將按鍵字符顯示在標簽上
from tkinter import *def show(event):s=event.keysymlb.config(text=s)root=Tk() root.title('按鍵實驗') root.geometry('200x200') lb=Label(root,text='請按鍵',font=('黑體',48)) lb.bind('<Key>',show) lb.focus_set() lb.pack() root.mainloop()希望能給大家帶來幫助,所有案例都經過多次測試,放心食用。
總結
以上是生活随笔為你收集整理的零基础学Python【二十三、图形化界面设计 】(基础一篇全,欢迎认领)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 错误代码大全【100(临时响应)】【20
- 下一篇: 程序员数学基础【七、等比数列 棋盘麦粒】