GUI的Python實現
1 實現
Tkinter是Python的默認GUI庫。它基於Tk工具包,該工具包最初是爲工具命令語言設計的。Tk 普及後,結合 Tk 的 GUI 開發的可移植性與靈活性,可以讓你快速開發和實現很多與商業軟件品質相當的 GUI 應用。
讓 GUI 程序啓動和運行起來需要以下 5 個主要步驟。
1.導入 Tkinter 模塊(或 from Tkinter import *)。
2.創建一個頂層窗口對象,用於容納整個 GUI 應用。
3.在頂層窗口對象之上構建所有的 GUI 組件。
4.通過底層的應用代碼將這些 GUI 組件連接起來。
5.進入主事件循環。
import tkinter
top = tkinter.Tk() #(小寫k)頂窗口
label = tkinter.Label(top,text='Hello GUI') #控件
label.pack() #佈局
top.mainloop() #無限循環
解釋:
Tkinter.Tk()返回的對象通常稱爲根窗口,GUI 程序中可以有多個頂層窗口,但是其中只能有一個是根窗口。
頂層的根窗口對象包含組成 GUI 應用的所有小窗口對象。它們可能是文字標籤、按鈕、列表框等。這些獨立的 GUI 組件稱爲控件。
Tk 有 3 種佈局管理器來幫助控件集進行定位。 Placer:管理器就會將其擺放好;Packer:往行李箱中填充行李的過程;Grid:基於網格座標
2 控件
- 控件可以獨立存在,也可以作爲容器存在。如果一個控件包含其他控件,就可以將其認爲是那些控件的父控件。
Frame容器
import tkinter
top = tkinter.Tk() #(小寫k)頂窗口
frame = tkinter.Frame()
label = tkinter.Label(frame,text='Hello GUI')#控件
label.pack()#佈局
frame.pack()
top.mainloop()#無限循環
其他容器:LabelFrame,Toplevel
- 通常,控件有一些相關的行爲,比如按下按鈕、將文本寫入文本框等。這些用戶行爲稱爲事件,而 GUI 對這類事件的響應稱爲回調。
import tkinter
def buttonAction(event): #事件處理函數(event)
print(event.x, event.y)
top = tkinter.Tk() #(小寫k)頂窗口
frame = tkinter.LabelFrame()
button = tkinter.Button(frame, text='這是一個按鈕')
button.bind('<Button-1>', buttonAction) #綁定事件
button.pack()
frame.pack()
top.mainloop()#無限循環
解釋:
控件.bind('<事件代碼>',event_handler) #適用於大多數控件。此外還有bind_all方法。
控件.protocal('事件代碼', event_handler) #這種情況的控件,必需是頂層窗口或者root容器。
常用事件:
鼠標事件:
Event Description
<Button-1> 鼠標左鍵
<Button-3> 鼠標右鍵
<Button-2> 鼠標中鍵
<Button-4> 鼠標向上滾動
<Button-5> 鼠標向下滾動
<Double-Button-1> 鼠標左鍵雙擊
<Double-Button-3> 鼠標右鍵雙擊
<Double-Button-2> 鼠標中鍵雙擊
<Triple-Button-1> 鼠標左鍵三擊
<Triple-Button-3> 鼠標右鍵三擊
<Triple-Button-2> 鼠標中鍵三擊
<B1-Motion> 左鍵移動
<B3-Motion> 右鍵移動
<B2-Motion> 中鍵移動
<ButtonRelease-1> 釋放鼠標左鍵
<ButtonRelease-3> 釋放鼠標右鍵
<ButtonRelease-2> 釋放鼠標中鍵
<Enter> 鼠標光標進入控件時觸發
<Leave> 鼠標光標離開控件時觸發
鍵盤事件:
Event Description
<Key> 響應所有的按鍵(按下)
<KeyRelease> 響應所有的按鍵(鬆開)
<FocusIn> 控件或控件的子空間獲得鍵盤焦點.
<FocusOut> 控件丟失鍵盤焦點 (焦點移動到另一個控件).
<Return>/<Enter> 只有回車鍵響應
<Escape> esc鍵
<space> 空格鍵
<Tab> Tab鍵
<Up>/<Down>/<Left>/<Right> 上下左右鍵
<Shitf_L>/<Shift_R> 左右Shift鍵(類似有左右兩個鍵的, 添加_L/_R區分)
<BackSpace> 退格
<a>/<b> 指定的小寫字母鍵
<A>/<Z> 指定的大寫字母鍵
<Control-Alt-a> 組合鍵(可識別任意組合鍵)
作者:TitanCoder
鏈接:https://www.jianshu.com/p/6f88eff109e8
enent_handler事件響應的參數:
Tk |
Tkinter Event Field |
Tk |
Tkinter Event Field |
---|---|---|---|
%f |
focus |
%A |
char |
%h |
height |
%E |
send_event |
%k |
keycode |
%K |
keysym |
%s |
state |
%N |
keysym_num |
%t |
time |
%T |
type |
%w |
width |
%W |
widget |
%x |
x |
%X |
x_root |
%y |
y |
%Y |
y_root |
- 具體控件介紹:
1)button控件
Button ( master, option=value, ... )
master: 按鈕的父容器。
options: 可選項,即該按鈕的可設置的屬性。這些選項可以用鍵 = 值的形式設置,並以逗號分隔。
屬性:
activebackground 當鼠標放上去時,按鈕的背景色
activeforeground 當鼠標放上去時,按鈕的前景色
text 按鈕的文本內容
font 文本字體
bd 按鈕邊框的大小,默認爲 2 個像素
bg 按鈕的背景色
fg 按鈕的前景色(按鈕文本的顏色)
padx 按鈕在x軸方向上的內邊距(padding),是指按鈕的內容與按鈕邊緣的距離
pady 按鈕在y軸方向上的內邊距(padding)
height 按鈕的高度
width 按鈕的寬度,如未設置此項,其大小以適應按鈕的內容(文本或圖片的大小)
command 按鈕關聯的函數,當按鈕被點擊時,執行該函數
relief 邊框樣式,設置控件3D效果,可選的有:FLAT、SUNKEN、RAISED、GROOVE、RIDGE。默認爲 FLAT。
state 設置按鈕組件狀態,可選的有NORMAL、ACTIVE、 DISABLED。默認 NORMAL。
anchor 錨選項,控制文本的位置,默認爲中心
image 按鈕上要顯示的圖片
justify 顯示多行文本的時候,設置不同行之間的對齊方式,可選項包括LEFT, RIGHT, CENTER
underline 下劃線。默認按鈕上的文本都不帶下劃線。取值就是帶下劃線的字符串索引,爲 0 時,第一個字符帶下劃線,爲 1 時,前兩個字符帶下劃線,以此類推
wraplength 限制按鈕每行顯示的字符的數量
highlightcolor 要高亮的顏色
import tkinter
import tkMessageBox
def helloCallBack():
tkMessageBox.showinfo( "彈窗", "Hello !")
top = tkinter.Tk()
B = Tkinter.Button(top, text ="點我", command = helloCallBack)
B.pack()
top.mainloop()
2)Entery
屬性:
bg 輸入框背景顏色
bd 邊框的大小,默認爲 2 個像素
fg 文字顏色。值爲顏色或爲顏色代碼,如:'red','#ff0000'
font 文本字體
cursor 光標的形狀設定,如arrow, circle, cross, plus 等
width 文本框寬度
justify 顯示多行文本的時候,設置不同行之間的對齊方式,可選項包括LEFT, RIGHT, CENTER
relief 邊框樣式,設置控件3D效果,可選的有:FLAT、SUNKEN、RAISED、GROOVE、RIDGE。默認爲 FLAT。
show 指定文本框內容顯示爲字符,值隨意,滿足字符即可。如密碼可以將值設爲 show="*"
state 默認爲 state=NORMAL, 文框狀態,分爲只讀和可寫,值爲:normal/disabled
textvariable 文本框的值,是一個StringVar()對象
selectbackground 選中文字的背景顏色
selectborderwidth 選中文字的背景邊框寬度
selectforeground 選中文字的顏色
exportselection 在輸入框中選中文本,默認會複製到粘貼板,如果要忽略這個功能刻工藝設置 exportselection=0。
highlightcolor 文本框高亮邊框顏色,當文本框獲取焦點時顯示
xscrollcommand 設置水平方向滾動條,一般在用戶輸入的文本框內容寬度大於文本框顯示的寬度時使用。
常用方法:
get() 獲取文件框的值
delete ( first, last=None ) 刪除文本框裏直接位置值
index ( index ) 返回指定的索引值
nsert ( index, s ) 向文本框中插入值,index:插入位置,s:插入值
select_clear() 清空文本框
1.3 佈局
top.pack() #自適應的佈局方案
top.grid() #網格佈局方案
top.place() #按座標的佈局方案
1) pack佈局的參數:
ipadx | 水平方向上的內邊距 |
ipady | 垂直方向上的內邊距 |
padx | 水平方向上的外邊距 |
pady | 垂直方向上的外邊距 |
after | 將組件置於其他組件之後 |
before | 將組件置於其他組件之前 |
anchor | 組件的對齊方式,頂對齊’tk.N’,底對齊'tk.S’,左'tk.W',右'tk.E' ,中間'tk.CENTER', |
side | 組件在主窗口的位置,可以爲’top’,’bottom’,’left’,’right’; |
fill | 填充方式 (tk.Y垂直填充,tk.X水平填充,tk.BOTH爲兩邊填充,None爲不填充) |
expand | 1可擴展,0不可擴展 |
2) grid佈局的參數
sticky #決定一個組件從哪個方向開始(tk.N上,tk.W左,tk.S下,tk.E右)
column #組件所在的列起始位置;
columnspan #組件的列寬(佔用的列數);
row #組件所在的行起始位置;
rowspan #組件的行寬(佔用的行數);
3) place佈局的參數
anchor #組件對齊方式,同上;
x #組件左上角的x座標;
y #組件左上角的y座標;
relx #組件相對於窗口的x座標,應爲0-1之間的小數;
rely #組件相對於窗口的y座標,應爲0-1之間的小數;
#可以同時使用相對座標和絕對座標,此時組件爲在相對座標的基礎上作絕對座標的偏移
width #組件的寬度;
height #組件的高度;
relwidth #組件相對於窗口的寬度,0-1之間;
relheight #組件相對於窗口的高度,0-1之間;