【由於這是我第一個接觸的GUI圖形界面python庫,如今也不用了,因此大多數內容都來自以前花python
錢買的一些快速入門的內容,能夠看成簡單的知識點查詢使用】web
在此聲明:內容來自微信公衆號GitChat,付費內容編程
目錄微信
簡介編程語言
窗口建立與佈局ide
經常使用控件函數
幾何管理工具
Lable控件oop
Button控件佈局
做爲 Python 開發者,圖形用戶界面(GUI)開發是必備技能之一。目前,市面上支持
Python 的「GUI 工具包」不少,各有特色,雖然大多數工具包的基礎相似,但要學習一個
新包並掌握其細節仍是很是耗時的,所以,在選用工具包時應仔細權衡。本文將介紹
Python 自帶的 GUI 工具包 TKinter。
TKinter
Python 的 GUI 庫很是多,之因此選擇 Tkinter,一是最爲簡單,二是自帶庫,不需下載
安裝,隨時使用,跨平臺兼容性很是好,三則是從需求出發的,Python 在實際應用中極
少用於開發複雜的桌面應用,畢竟,Python 的各類 GUI 工具包都「通常得很」,不具有優
勢。
關於 GUI,泛泛而談不免枯燥,鑑於此,本文將基於一系列實例來介紹 Tkinter 控件。
作界面,首先須要建立一個窗口,Python Tkinter 建立窗口很簡單,代碼以下:
from tkinter import * #初始化Tk() myWindow = Tk() #進入消息循環 myWindow.mainloop()
上述程序建立的窗口是很是簡陋的,有待進一步美化,設置標題、窗口大小、窗口是否
可變等,涉及屬性有:title(設置窗口標題)、 geometry(設置窗口大小)、
resizable(設置窗口是否能夠變化長 寬)。請看以下實例:
from tkinter import Tk #初始化Tk() myWindow = Tk() #設置標題 myWindow.title('Python GUI Learning') #設置窗口大小 myWindow.geometry('380x300') #設置窗口是否可變長、寬,True:可變,False:不可變 myWindow.resizable(width=False, height=True) #進入消息循環 myWindow.mainloop()
進一步,將窗口放置於屏幕中央,以下實例:
from tkinter import Tk #初始化Tk() myWindow = Tk() #設置標題 myWindow.title('Python GUI Learning') #設置窗口大小 width = 380 height = 300 #獲取屏幕尺寸以計算佈局參數,使窗口居屏幕中央 screenwidth = myWindow.winfo_screenwidth() screenheight = myWindow.winfo_screenheight() alignstr = '%dx%d+%d+%d' % (width, height, (screenwidth-width)/2, (screenheight-height)/2) myWindow.geometry(alignstr) #設置窗口是否可變長、寬,True:可變,False:不可變 myWindow.resizable(width=False, height=True) #進入消息循環 myWindow.mainloop()
僅有窗口並不能實現交互,還須要控件,Tkinter 提供了各類控件,如按鈕、標籤和文本
框。在一個 GUI 應用程序中使用,這些控件一般被稱爲控件或者部件,目前有15種
Tkinter 部件,以下列表:
Tkinter 控件有特定的幾何狀態管理方法,管理整個控件區域組織,如下是 Tkinter 公開
的幾何管理類:包、網格、位置。
Lable控件標籤控件,基本用法爲: Lable(root, option...) ,即:Label(根對象, [屬性列表]),
其中屬性列表以下:
Lable 控件實例
實例1:標籤展現文本,代碼以下:
from tkinter import* #初始化Tk() myWindow = Tk() #設置標題 myWindow.title('Python GUI Learning') #建立一個標籤,顯示文本 Label(myWindow, text="user-name",bg='red',font=('Arial 12 bold'),width=20,height=5).pack() Label(myWindow, text="password",bg='green',width=20,height=5).pack() #進入消息循環 myWindow.mainloop()
執行結果:
實例2:標籤展現圖標,代碼以下:
from tkinter import* #初始化Tk() myWindow = Tk() #設置標題 myWindow.title('Python GUI Learning') #建立一個標籤,顯示圖標 logo = PhotoImage(file="/Users/guojin/book/temp.gif") Label(myWindow, image=logo).pack(side='left') #進入消息循環 myWindow.mainloop()
運行結果:
實例3:標籤圖文混疊,邊距控制,代碼以下:
from tkinter import* #初始化Tk() myWindow = Tk() #設置標題 myWindow.title('Python GUI Learning') #建立一個標籤,顯示文本 logo = PhotoImage(file="/Users/guojin/book/temp.gif") explanation = """At present, only GIF and PPM/PGM formats are supported, but an interface exists to allow additional image file formats to be added easily.""" Label(myWindow,compound=CENTER,text=explanation,image=logo).pack(side="right") #進入消息循環 myWindow.mainloop()
運行結果:
Button 控件是一個標準的 Tkinter 部件,用於實現各類按鈕。按鈕能夠包含文本或圖
像,還能夠關聯 Python 函數。
Tkinter 的按鈕被按下時,會自動調用該函數。
按鈕文本可跨越一個以上的行。此外,文本字符能夠有下劃線,例如標記的鍵盤快捷
鍵。默認狀況下,使用 Tab 鍵能夠移動到一個按鈕部件,用法以下:
Entry(根對象, [屬性列表]),即Entry(root, option...)
經常使用的屬性列表以下:
Button 實例:
實例1:建立按鈕,代碼以下:
from tkinter import* #初始化Tk() myWindow = Tk() #設置標題 myWindow.title('Python GUI Learning') #建立兩個按鈕 b1=Button(myWindow, text='button1',bg="red", relief='raised', width=8, height=2) b1.grid(row=0, column=0, sticky=W, padx=5,pady=5) b2=Button(myWindow, text='button2', font=('Helvetica 10 bold'),width=8, height=2) b2.grid(row=0, column=1, sticky=W, padx=5, pady=5) #進入消息循環 myWindow.mainloop()
運行結果:
實例2:建立按鈕並綁定響應函數,輸入半徑,計算圓面積並輸出,代碼以下:
from tkinter import* def printInfo(): #清理entry2 entry2.delete(0, END) #根據輸入半徑計算面積 R=int(entry1.get()) S= 3.1415926*R*R entry2.insert(10, S) #清空entry2控件 entry1.delete(0, END) #初始化Tk() myWindow = Tk() #設置標題 myWindow.title('Python GUI Learning') #標籤控件佈局 Label(myWindow, text="input").grid(row=0) Label(myWindow, text="output").grid(row=1) #Entry控件佈局 entry1=Entry(myWindow) entry2=Entry(myWindow) entry1.grid(row=0, column=1) entry2.grid(row=1, column=1) #Quit按鈕退出;Run按鈕打印計算結果 Button(myWindow, text='Quit', command=myWindow.quit).grid(row=2, column=0,sticky=W, padx=5, pady=5) Button(myWindow, text='Run', command=printInfo).grid(row=2, column=1, sticky=W, padx=5, pady=5) #進入消息循環 myWindow.mainloop()
運行結果:
輸入半徑:
點擊‘Run’計算面積:
Checkbutton控件Checkbutton 是複選框,又稱爲多選按鈕,能夠表示兩種狀態。用法爲: Checkbutton
( root, option, ... ), 其中可選屬性 option 有不少,以下表所示:
如下是這個小工具的經常使用方法:
實例1:建立一組複選框,代碼以下:
from tkinter import* #初始化Tk() myWindow = Tk() #設置標題 myWindow.title('Python GUI Learning') # 用來獲取複選框是否被勾選,經過chVarDis.get()來獲取其的狀態,其狀態值爲int類型 勾選爲1 chVarDis = IntVar() # text爲該複選框後面顯示的名稱, variable將該複選框的狀態賦值給一個變量,當state='disa check1 = Checkbutton(myWindow, text="Disabled", variable=chVarDis, state='disabled')
# 該複選框是否勾選,select爲勾選, deselect爲不勾選 check1.select() # sticky=tk.W 當該列中其餘行或該行中的其餘列的某一個功能拉長這列的寬度或高度時, # 設定該值能夠保證本行保持左對齊,N:北/上對齊 S:南/下對齊 W:西/左對齊 E:東/右對齊 check1.grid(column=0, row=0, sticky=W) chvarUn = IntVar() check2 = Checkbutton(myWindow, text="UnChecked", variable=chvarUn) check2.deselect() check2.grid(column=1, row=0, sticky=W) chvarEn = IntVar() check3 = Checkbutton(myWindow, text="Enabled", variable=chvarEn) check3.select() check3.grid(column=2, row=0, sticky=W) #進入消息循環 myWindow.mainloop()
實例2:綁定響應函數,代碼以下:
from tkinter import* def callCheckbutton(): #改變v的值,即改變Checkbutton的顯示值 v.set('check CheckButton') #初始化Tk() myWindow = Tk() #設置標題 myWindow.title('Python GUI Learning') v = StringVar() v.set('check python') #綁定v到Checkbutton的屬性textvariable Checkbutton(myWindow,textvariable = v,command = callCheckbutton).pack() #進入消息循環 myWindow.mainloop()
單選按鈕是一種可在多個預先定義的選項中選擇出一項的 Tkinter 控件 。單選按鈕可顯
示文字或圖片,顯示文字時只能使用預設字體,該控件能夠綁定一個 Python 函數或方
法,當單選按鈕被選擇時,該函數或方法將被調用。
單選按鈕(Radio Button)這個名字來源於收音機(Radio)上的調頻按鈕, 這些按鈕用
來選擇特定波段或預設電臺,若是一個按鈕被按下, 其餘同類的按鈕就會彈起,即同時
只有一個按鈕可被按下。
一組單選按鈕控件和同一個變量關聯。點擊其中一個單選按鈕將把這個變量設爲某個預
定義的值。通常用法爲: Radiobutton(myWindow,options) ,其中 option 與
Checkbutton,Button 大多重合,用法一致。
實例:建立單選按鈕並綁定響應函數,代碼以下:
from tkinter import* #初始化Tk() myWindow=Tk() myWindow.title('Python GUI Learning') v=IntVar() #列表中存儲的是元素是元組 language=[('python',0),('C++',1),('C',2),('Java',3)] #定義單選按鈕的響應函數 def callRB(): for i in range(4): if (v.get()==i): root1 = Tk() Label(root1,text='你的選擇是'+language[i][0]+'!',fg='red',width=20, height=6).pack() Button(root1,text='肯定',width=3,height=1,command=root1.destroy).pack(side='bottom') Label(myWindow,text='選擇一門你喜歡的編程語言').pack(anchor=W) #for循環建立單選框 for lan,num in language: Radiobutton(myWindow, text=lan, value=num, command=callRB, variable=v).pack(anchor=W) #進入消息循環 myWindow.mainloop()
運行結果:
Menu被用來建立一個菜單,建立Menu類的實例,而後使用add方法添加命令或者其餘
菜單內容。使用方法以下:
Menu(root,option,…)
其中 option 列表以下:
特有函數以下:
實例:建立一個菜單組,代碼以下:
from tkinter import * #建立窗口 myWindow=Tk() myWindow.title("菜單") myWindow.geometry("400x300+300+100") # 建立一個菜單項,相似於導航欄,頂層菜單 menubar=Menu(myWindow) # 建立菜單項 fmenu1=Menu(myWindow) for item in ['新建','打開','保存','另存爲']: # 若是該菜單是頂層菜單的一個菜單項,則它添加的是下拉菜單的菜單項。則他添加的是下拉菜單的菜單項。 fmenu1.add_command(label=item) fmenu2=Menu(myWindow) for item in ['複製','粘貼','剪切']: fmenu2.add_command(label=item) fmenu3=Menu(myWindow) for item in ['大綱視圖','web視圖']: fmenu3.add_command(label=item) fmenu4=Menu(myWindow) for item in ["版權信息","其它說明"]: fmenu4.add_command(label=item) # add_cascade 的一個很重要的屬性就是 menu 屬性,它指明瞭要把那個菜單級聯到該菜單項上, # 固然,還必不可少的就是 label 屬性,用於指定該菜單項的名稱 menubar.add_cascade(label="文件",menu=fmenu1) menubar.add_cascade(label="編輯",menu=fmenu2) menubar.add_cascade(label="視圖",menu=fmenu3) menubar.add_cascade(label="關於",menu=fmenu4) # 最後能夠用窗口的 menu 屬性指定咱們使用哪個做爲它的頂層菜單 myWindow.config(menu=menubar) #進入消息循環 myWindow.mainloop()
運行結果:
Message 控件用來展現一些文字短消息。Message 和 Label 控件有些相似, 但在展現文
字方面比 Label 要靈活,好比 Message 控件能夠改變字體,而 Label 控件只能使用一種
字體,它提供了一個換行對象,以使文字能夠斷爲多行。
它能夠支持文字的自動換行及對齊,這裏要澄清一下前面提到的 Message 控件能夠改變
字體的說法: 這是說咱們能夠爲單個控件設置任意字體, 控件內的文字都將顯示爲該字
體,但咱們不能給單個控件內的文字設置多種字體,若是你須要這麼作,能夠考慮使用
Text 控件。
建立一個 Message 控件的語法以下:
w = Message ( root, option, ... )
其中 option 列表以下:
請看下面實例:
from tkinter import * #初始化Tk() myWindow=Tk() #建立一個Message whatever_you_do = "Only those who have the patience to do simple things per msg = Message(myWindow, text = whatever_you_do) msg.config(bg='lightgreen', font=('times', 20, 'italic')) msg.pack( ) #進入消息循環 myWindow.mainloop()