GUI介紹
- Graphical User Interface
- GUI for Python:Tkinter歹叮,wxPython,PyQt
- Tkinter
- 綁定的是TK GUI工具集,用Python包裝的Tcl代碼
- PyGTK
- Tkinter替代品
- wxPython
- 跨平臺(tái)的Python GUI
- PyQt
Tkinter常用組件
- 按鈕
- Button------------------------按鈕組件
- RadioButton----------------單選框組件
- CheckButton----------------選擇按鈕組件
- Listbox------------------------列表框組件
- 文本輸入組件
- Entry---------------------------單行文本框組件
- Text----------------------------多行文本框組件
- 標(biāo)簽組件
- Label--------------------------可以顯示圖片和文字
- Message---------------------可以根據(jù)內(nèi)容將文字換行
- 菜單
- Menu---------------------------菜單組件
- MenuButton------------------菜單按鈕組件
- 滾動(dòng)條
- scale---------------------------滑動(dòng)組件
- Scrollbar----------------------滾動(dòng)條組件
- 其他組件
- Canvas-----------------------畫布組件
- Frame------------------------框架組件枣购,將多個(gè)組件編組
- Toplevel-----------------------創(chuàng)建子窗口容器組件
組件的大致使用步驟
- 創(chuàng)建總面板
- 創(chuàng)建面板上的各種組件
- 指定組件的父組件称簿,即依附關(guān)系
- 利用相應(yīng)的屬性對(duì)組件進(jìn)行設(shè)置
- 給組件安排布局
- 啟動(dòng)總面板的消息循環(huán)
label組件示例
import tkinter
base = tkinter.Tk()
#標(biāo)題
base.wm_title('Label test')
#label組件
lb = tkinter.Label(base,text = 'python label',background = 'blue')
#布局設(shè)置
lb.pack()
#啟動(dòng)消息循環(huán)
base.mainloop()
button組件示例
import tkinter
def showLabel():
#在函數(shù)中定義了一個(gè)label
#label的父組件是baseFrame
lb = tkinter.Label(baseFrame,text = '顯示label')
lb.pack()
baseFrame = tkinter.Tk()
btn = tkinter.Button(baseFrame,text = 'Show label',command = showLabel)
btn.pack()
baseFrame.mainloop()
組建布局
- 控制組件的擺放方式
- 三種布局:
- pack:按照方位布局
- place:按照坐標(biāo)布局
- grid:網(wǎng)格布局
- pack布局
- 最簡(jiǎn)單彻犁,代碼量最少堂污,挨個(gè)擺放妒蛇,默認(rèn)從上到下,系統(tǒng)自動(dòng)設(shè)置
- 通用使用方式:組件對(duì)象.pack(,,,,,,,,,)
- side:兔泵ィ靠方位趣斤,LEFT,TOP黎休,RIGHT浓领,BOTTON
- fill:填充方式,X势腮,Y联贩,BOTH,NONE
- expand:yes/no
- ·················
- grid布局
- 組件對(duì)象.grid(,,,,,,,,)
- 利用row捎拯,column編號(hào)撑蒜,從零開始
- sticky:N,E,S座菠,W,決定組件從哪個(gè)方向開始
- rowspan藤树,cloumnspan表示跨行浴滴,跨列數(shù)量
- place布局
- 明確方位的擺放
- 相對(duì)位置布局,隨意改變窗口大小會(huì)導(dǎo)致混亂
- 使用place函數(shù)岁钓,分為絕對(duì)布局和相對(duì)布局升略,絕對(duì)布局使用x,y參數(shù),相對(duì)布局使用relx屡限,rely品嚣,relhight,relwidth
grid布局示例
import tkinter
baseFrame = tkinter.Tk()
lb1 = tkinter.Label(baseFrame,text = '賬號(hào):').grid(row = 0,sticky = tkinter.W)
tkinter.Entry(baseFrame).grid(row = 0,column = 1,sticky =tkinter.E)
lb2 = tkinter.Label(baseFrame,text = '密碼:').grid(row = 1,sticky = tkinter.W)
tkinter.Entry(baseFrame).grid(row = 1,column = 1,sticky =tkinter.E)
tkinter.Button(baseFrame,text = '登錄').grid(row = 2,column = 1,sticky = tkinter.W)
baseFrame.mainloop()
消息機(jī)制
- 消息的傳遞機(jī)制
- 消息由系統(tǒng)負(fù)責(zé)發(fā)送到隊(duì)列
- 由相關(guān)組件進(jìn)行綁定/設(shè)置
- 消息格式
- <modifier->---type-[-detail]>
- <Button-1>:鼠標(biāo)左鍵
- <KeyPress-A>:鍵盤A鍵位
- <Control-Shift-KeyPress-A>:同時(shí)按下Control钧大,Shift翰撑,A鍵位
消息示例
import tkinter
def baseLabel(event):
lb = tkinter.Label(baseFrame,text = '謝謝點(diǎn)擊')
lb.pack()
#程序總框架
baseFrame = tkinter.Tk()
lb = tkinter.Label(baseFrame,text='模擬按鈕')
#label綁定相應(yīng)的消息和處理函數(shù)
lb.bind('<Button-1>',baseLabel)
lb.pack()
#啟動(dòng)消息循環(huán)
baseFrame.mainloop()
- 綁定
- bing_all:全局范圍的綁定,默認(rèn)的是全局快捷鍵啊央,比如F1是幫助文檔
- bind_class:接受三個(gè)參數(shù)眶诈,第一個(gè)類名,第二個(gè)事件瓜饥,第三個(gè)操作
- w.bind_class('Entry','<Control-V>',my_paste)
- bind:?jiǎn)为?dú)對(duì)某一個(gè)實(shí)例綁定
- unbind:解綁
輸入框
import tkinter
def reg():
name,pwd= e1.get(),e2.get()
t1,t2 =len(name),len(pwd)
if name == "111" and pwd == "222":
lb3['text'] = '登錄成功'
else:
lb3['text'] = '用戶名或密碼錯(cuò)誤'
e1.delete(0,t1)
e2.delete(0,t2)
baseFrame = tkinter.Tk()
lb1 = tkinter.Label(baseFrame,text='用戶名')
lb1.grid(row=0,column=0,stick=tkinter.W)
e1 = tkinter.Entry(baseFrame)
e1.grid(row=0,column=1,stick=tkinter.E)
lb2 = tkinter.Label(baseFrame,text='密碼')
lb2.grid(row=1,column=0,stick=tkinter.W)
e2 = tkinter.Entry(baseFrame)
e2.grid(row=1,column=1,stick=tkinter.E)
e2['show'] = '*'
btn = tkinter.Button(baseFrame,text='登錄',command=reg)
btn.grid(row=2,column=1,stick=tkinter.E)
lb3 = tkinter.Label(baseFrame)
lb3.grid(row=2,column=0,stick=tkinter.W)
baseFrame.mainloop()
菜單
- 第一個(gè)Menu類定義的是parent
- add_command 添加菜單項(xiàng)逝撬,如果菜單是頂層菜單,則從左向右添加
- label:指定菜單項(xiàng)名稱
- command:點(diǎn)擊后相應(yīng)的調(diào)用函數(shù)
- acceletor:快捷鍵
- menu:屬性制定哪一個(gè)作為頂級(jí)菜單
- add_cascade 級(jí)聯(lián)菜單
- label:名稱
- menu:指明把菜單級(jí)聯(lián)到哪一個(gè)菜單上
- add_separator:添加分隔符
- 彈出式菜單
- 監(jiān)聽鼠標(biāo)右鍵乓土,如果右鍵點(diǎn)擊宪潮,則根據(jù)位置判斷彈出,
- 調(diào)用Menu的pop方法
菜單示例1
import tkinter
baseFrame = tkinter.Tk()
menupar = tkinter.Menu(baseFrame)
for item in ['File','Edit','View','About']:
menupar.add_command(label=item)
baseFrame['menu'] = menupar
baseFrame.mainloop()
菜單示例2
import tkinter
baseFrame = tkinter.Tk()
menupar = tkinter.Menu(baseFrame)
menusun = tkinter.Menu(menupar)
for item in ['第一個(gè)','第二個(gè)','第二個(gè)']:
menusun.add_command(label=item)
menupar.add_command(label = 'File')
menupar.add_cascade(label = 'Edit',menu = menusun)
menupar.add_command(label = 'About')
baseFrame['menu'] = menupar
baseFrame.mainloop()
菜單示例3
import tkinter
baseFrame = tkinter.Tk()
menupar = tkinter.Menu(baseFrame)
def makelabel():
tkinter.Label(baseFrame,text='趕緊關(guān)了').pack()
for item in ['第一個(gè)','第二個(gè)','第三個(gè)']:
menupar.add_separator()
menupar.add_command(label=item)
menupar.add_separator()
menupar.add_command(label='點(diǎn)我',command=makelabel)
#事件處理函數(shù)一定要有一個(gè)參數(shù)趣苏,且第一個(gè)參數(shù)表示的是系統(tǒng)事件
def pop(event):
menupar.post(event.x_root,event.y_root)
baseFrame.bind('<Button-3>',pop)
baseFrame.mainloop()
畫布
- canvas狡相,在畫布上繪制對(duì)象,通常用create_×××拦键,例如line谣光、rectangle
- 每次調(diào)用create_×××都會(huì)返回一個(gè)創(chuàng)建的組件的ID,同時(shí)也可以用tag屬性指定其標(biāo)簽
- 調(diào)用canvas.move實(shí)現(xiàn)動(dòng)作
畫布示例1
import tkinter
baseFrame = tkinter.Tk()
cvs = tkinter.Canvas(baseFrame,width = 300,height=200)
cvs.pack()
cvs.create_line(23,23,190,230)
cvs.create_text(50,50,text='hahahahaha')
baseFrame.mainloop()
畫布示例2
import tkinter
baseFrame = tkinter.Tk()
def btnClick(event):
cvs.move(id_ball,12,5)
cvs.move('fall',0,5)
cvs = tkinter.Canvas(baseFrame,width=500,height=500)
cvs.pack()
cvs.bind('<Button-3>',btnClick)
#創(chuàng)建組件后返回id
id_ball = cvs.create_oval(20,20,50,50,fill='blue')
#創(chuàng)建組件使用tag屬性
cvs.create_text(120,60,fill='blue',text='hahahahaha',tag='fall')
#若沒有指定tag可用addtag_withtag添加
#同類函數(shù)還有addtag_all,addtag_above等
id_rectangle = cvs.create_rectangle(60,80,180,100,fill='blue')
cvs.addtag_withtag('fall',id_rectangle)
baseFrame.mainloop()