python-GUI-Tkinter

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)建子窗口容器組件

組件的大致使用步驟

  1. 創(chuàng)建總面板
  2. 創(chuàng)建面板上的各種組件
    1. 指定組件的父組件称簿,即依附關(guān)系
    2. 利用相應(yīng)的屬性對(duì)組件進(jìn)行設(shè)置
    3. 給組件安排布局
  3. 啟動(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()
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末芬为,一起剝皮案震驚了整個(gè)濱河市萄金,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌媚朦,老刑警劉巖氧敢,帶你破解...
    沈念sama閱讀 221,430評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異询张,居然都是意外死亡孙乖,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,406評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來唯袄,“玉大人弯屈,你說我怎么就攤上這事×悼剑” “怎么了资厉?”我有些...
    開封第一講書人閱讀 167,834評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)蔬顾。 經(jīng)常有香客問我宴偿,道長(zhǎng),這世上最難降的妖魔是什么诀豁? 我笑而不...
    開封第一講書人閱讀 59,543評(píng)論 1 296
  • 正文 為了忘掉前任窄刘,我火速辦了婚禮,結(jié)果婚禮上舷胜,老公的妹妹穿的比我還像新娘娩践。我一直安慰自己,他們只是感情好逞带,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,547評(píng)論 6 397
  • 文/花漫 我一把揭開白布欺矫。 她就那樣靜靜地躺著,像睡著了一般展氓。 火紅的嫁衣襯著肌膚如雪穆趴。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,196評(píng)論 1 308
  • 那天遇汞,我揣著相機(jī)與錄音未妹,去河邊找鬼。 笑死空入,一個(gè)胖子當(dāng)著我的面吹牛络它,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播歪赢,決...
    沈念sama閱讀 40,776評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼化戳,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了埋凯?” 一聲冷哼從身側(cè)響起点楼,我...
    開封第一講書人閱讀 39,671評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎白对,沒想到半個(gè)月后掠廓,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,221評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡甩恼,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,303評(píng)論 3 340
  • 正文 我和宋清朗相戀三年蟀瞧,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了沉颂。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,444評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡悦污,死狀恐怖铸屉,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情塞关,我是刑警寧澤抬探,帶...
    沈念sama閱讀 36,134評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站帆赢,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏线梗。R本人自食惡果不足惜椰于,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,810評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望仪搔。 院中可真熱鬧瘾婿,春花似錦、人聲如沸烤咧。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,285評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽煮嫌。三九已至笛谦,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間昌阿,已是汗流浹背饥脑。 一陣腳步聲響...
    開封第一講書人閱讀 33,399評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留懦冰,地道東北人灶轰。 一個(gè)月前我還...
    沈念sama閱讀 48,837評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像刷钢,于是被迫代替她去往敵國(guó)和親笋颤。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,455評(píng)論 2 359