Python--TKinter
GUI介紹

GraphicalUserInterface
GUI for Python: TKinter, wxPython, PyQt
TKinter:
綁定的是TK GUI工具集,用Python包裝的Tcl代碼
PyGIK
TKinter的替代品
wxPython
跨平臺(tái)的Python GUI
PyQt
跨平臺(tái)的
商業(yè)授權(quán)可能有問(wèn)題
推薦資料
辛星GUI,辛星Python(簡(jiǎn)潔、清晰)
Python GUI Programming cookbook
TKinter reference a GUI for Python
# 測(cè)試tkinter包是否好用 import tkinter tkinter._test()
# hello world import tkinter base = tkinter.Tk() # 消息循環(huán) base.mainloop()
TKinter 常用組件
按鈕
Button 按鈕組件 RadioButton 單選框組件 CheckButton 選擇按鈕組件 ListButton 列表框組件
文本輸入組件
Entry 單行文本框組件 Text 多行文本框組件
標(biāo)簽組件
Label 標(biāo)簽組件,可以顯示圖片和文字 Message 標(biāo)簽組件,可以根據(jù)內(nèi)容將文字換行
菜單
Menu 菜單組件 MenuButton 菜單按鈕組件,可以使用Menu代替
滾動(dòng)條
Scale 滑塊組件 Scrollbar 滾動(dòng)條組件
其他組件
Canvas 畫布組件 Frame 框架組件,將多個(gè)組件編組 Toplevel 創(chuàng)建子窗口容器組件
組件的大致使用步驟
創(chuàng)建總面板
創(chuàng)建面板上的各種組件
指定組件的父組件,即附屬關(guān)系
利用相應(yīng)的屬性對(duì)組件進(jìn)行設(shè)置
給組件安排布局
同步驟2相似,創(chuàng)建好多個(gè)組件
最后,啟動(dòng)總面板的消息循環(huán)
# Label案例 import tkinter base = tkinter.Tk() # 負(fù)責(zé)標(biāo)題 base.wm_title("Label Test") lb = tkinter.Label(base, text="Python Label") # 給相應(yīng)組件指定布局 lb.pack() base.mainloop()
# 設(shè)置Label案例 import tkinter base = tkinter.Tk() base.wm_title("Label Test") # 支持屬性和很多background,font,underline等 # 第一個(gè)參數(shù),指定所屬 lb1 = tkinter.Label(base, text="Python AI") lb1.pack() lb2 = tkinter.Label(base, text="綠色背景", background="green") lb2.pack() lb3 = tkinter.Label(base, text="藍(lán)色背景", background="blue") lb3.pack() base.mainloop()
# Button案例 import tkinter def showLable(): global baseFrame # 在函數(shù)中定義了一個(gè)Label # Label的父組件是baseFrame lb = tkinter.Label(baseFrame, text="顯示Label") lb.pack() baseFrame = tkinter.Tk() # 生成一個(gè)按鈕 # command參數(shù)指示,當(dāng)按鈕被按下的時(shí)候,執(zhí)行哪個(gè)函數(shù) btn = tkinter.Button(baseFrame, text="Show Lable", command=showLable) btn.pack() baseFrame.mainloop() ''' Button的屬性: anchor --------------------設(shè)置按鈕中文字的對(duì)齊方式,相對(duì)于按鈕的中心位置 background(bg)-------------設(shè)置按鈕的背景顏色 foreground(fg)-------------設(shè)置按鈕的前景色(文字的顏色) borderwidth(bd)------------設(shè)置按鈕邊框?qū)挾?cursor---------------------設(shè)置鼠標(biāo)在按鈕上的樣式 command--------------------設(shè)置按鈕點(diǎn)擊時(shí)觸發(fā)的函數(shù) bitmap---------------------設(shè)置按鈕上顯示的位圖 font-----------------------設(shè)置按鈕上文字的字體 width----------------------設(shè)置按鈕的寬度(字符個(gè)數(shù)) height---------------------設(shè)置按鈕的高度(字符個(gè)數(shù)) state----------------------設(shè)置按鈕的狀態(tài) text-----------------------設(shè)置按鈕上的文字 image----------------------設(shè)置按鈕上的圖片 '''
'\nButton的屬性:\n\nanchor --------------------設(shè)置按鈕中文字的對(duì)齊方式,相對(duì)于按鈕的中心位置\nbackground(bg)-------------設(shè)置按鈕的背景顏色\nforeground(fg)-------------設(shè)置按鈕的前景色(文字的顏色)\nborderwidth(bd)------------設(shè)置按鈕邊框?qū)挾萛ncursor---------------------設(shè)置鼠標(biāo)在按鈕上的樣式\ncommand--------------------設(shè)置按鈕點(diǎn)擊時(shí)觸發(fā)的函數(shù)\nbitmap---------------------設(shè)置按鈕上顯示的位圖\nfont-----------------------設(shè)置按鈕上文字的字體\nwidth----------------------設(shè)置按鈕的寬度(字符個(gè)數(shù))\nheight---------------------設(shè)置按鈕的高度(字符個(gè)數(shù))\nstate----------------------設(shè)置按鈕的狀態(tài)\ntext-----------------------設(shè)置按鈕上的文字\nimage----------------------設(shè)置按鈕上的圖片\n\n'
組件布局
控制組件的擺放方式
三種布局:
pack:按照方位布局
place:按照坐標(biāo)布局
grid:網(wǎng)格布局
pack布局
最簡(jiǎn)單,代碼量最少,挨個(gè)擺放,默認(rèn)從上到下,系統(tǒng)自動(dòng)設(shè)置
通用使用方式為:組件對(duì)象.pack(設(shè)置…)
side: 停靠方位,可選值為L(zhǎng)EFT,TOP,RIGHT,BOTTOM
fill:填充方式,X,Y,BOTH,NONE
expande(是否填充):YES/NO
anchor(停靠方向):N,E,S,W,CENTER
ipadx:x方向的內(nèi)邊距
ipady:y方向的內(nèi)邊距
padx:x方向外邊界
pady:y方向外邊界
grid布局
通用使用方式:組件對(duì)象.grid(設(shè)置…)
利用row,column編號(hào),都是從0開始
sticky:N,E,S,W表示上下左右,用來(lái)決定組件從哪個(gè)方向開始
支持ipadx,padx等參數(shù),跟pack吉函數(shù)含義一樣
支持rowspan,columnapan,表示跨行,跨行數(shù)量
place布局
明確方位的擺放
相對(duì)位置布局,隨意改變窗口大小會(huì)導(dǎo)致混亂
使用place函數(shù),分為絕對(duì)布局和相對(duì)布局,絕對(duì)布局是使用x,y參數(shù)
相對(duì)布局是使用relx,rely,relheight,relwidth
# pack布局案例 import tkinter baseFrame = tkinter.Tk() # 以下所有代碼都是創(chuàng)建一個(gè),然后布局 btn1 = tkinter.Button(baseFrame, text='A') btn1.pack(side=tkinter.LEFT, expand=tkinter.YES, fill=tkinter.Y) btn2 = tkinter.Button(baseFrame, text='B') btn2.pack(side=tkinter.TOP, expand=tkinter.YES, fill=tkinter.BOTH) btn2 = tkinter.Button(baseFrame, text='C') btn2.pack(side=tkinter.RIGHT, expand=tkinter.YES, fill=tkinter.NONE, anchor=tkinter.NE) btn2 = tkinter.Button(baseFrame, text='D') btn2.pack(side=tkinter.LEFT, expand=tkinter.YES, fill=tkinter.Y) btn2 = tkinter.Button(baseFrame, text='E') btn2.pack(side=tkinter.TOP, expand=tkinter.NO, fill=tkinter.BOTH) btn2 = tkinter.Button(baseFrame, text='F') btn2.pack(side=tkinter.BOTTOM, expand=tkinter.YES) btn2 = tkinter.Button(baseFrame, text='G') btn2.pack(anchor=tkinter.SE) baseFrame.mainloop()
# grid布局案例 import tkinter baseFrame = tkinter.Tk() # 下面注釋掉的一行代碼跟下面兩行代碼等效 # lb1 = tkinter.Label(baseFrame, text="賬號(hào):").grid(row=0, sticky=tkinter.W) lb1 = tkinter.Label(baseFrame, text="賬號(hào):") lb1.grid(row=0, sticky=tkinter.W) en = tkinter.Entry(baseFrame) en.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) btn = tkinter.Button(baseFrame, text="登錄").grid(row=2, column=1, sticky=tkinter.W) baseFrame.mainloop()
消息機(jī)制
消息的傳遞機(jī)制
自動(dòng)發(fā)出事件/消息
消息由系統(tǒng)負(fù)責(zé)發(fā)送到隊(duì)列
由相關(guān)組件進(jìn)行綁定/設(shè)置
后端自動(dòng)選擇感興趣的事件并做出相應(yīng)的反應(yīng)
消息格式:
<[modifier-]—type-[-detail]>
鍵位對(duì)應(yīng)名稱
# 事件的簡(jiǎn)單例子 import tkinter def baseLabel(event): global baseFrame print("被點(diǎn)擊") lb = tkinter.Label(baseFrame, text="謝謝點(diǎn)擊") lb.pack() # 畫出程序的總框架 baseFrame = tkinter.Tk() lb = tkinter.Label(baseFrame, text="模擬按鈕") # Label綁定相應(yīng)的消息和處理函數(shù) # 自動(dòng)獲取左鍵點(diǎn)擊,并啟動(dòng)相應(yīng)的處理函數(shù)baseLabel lb.bind("
被點(diǎn)擊
TKinter的綁定
bind_all:全局范圍的綁定,默認(rèn)的是全局快捷鍵,比如F1是幫助文檔
bind_class:接受三個(gè)參數(shù),第一個(gè)是類名,第二個(gè)是事件,第三個(gè)是操作
w._bind_class(“Entry”, “
bind:?jiǎn)为?dú)對(duì)某一個(gè)實(shí)例綁定
unbind:解綁,需要一個(gè)參數(shù),即你要解綁哪個(gè)事件
Entry
輸入框,功能單一
entry[“show”] = “*”,設(shè)置遮擋字符
# 輸入框案例 import tkinter # 模擬登錄函數(shù) def reg(): # 從相應(yīng)輸入框中,得到用戶的輸入 name = e1.get() pwd = e2.get() t1 = len(name) t2 = len(pwd) if name == "111" and pwd == "222": # 需要理解下面代碼的含義 lb3["text"] = "登錄成功" else: lb3["text"] = "用戶名或密碼錯(cuò)誤" # 輸入框刪除用戶輸入的內(nèi)容 # 注意delete的兩個(gè)參數(shù),表示從第幾個(gè)刪除到第幾個(gè) e1.delete(0,t1) e2.delete(0,t2) # 啟動(dòng)舞臺(tái) 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'] = '*' # Button參數(shù)command的意思是,當(dāng)按鈕被點(diǎn)擊后啟動(dòng)相應(yīng)的處理函數(shù) btn = tkinter.Button(baseFrame, text="登錄", command=reg) btn.grid(row=2, column=1, stick=tkinter.E) lb3 = tkinter.Label(baseFrame, text="") lb3.grid(row=3) # 啟動(dòng)主Frame baseFrame.mainloop()
菜單
第一個(gè)Menu類定義的是parent
add_command 添加菜單項(xiàng),如果菜單是頂層菜單,則從左向右添加,
否則就是下拉菜單
label:指定菜單項(xiàng)名稱
command:點(diǎn)擊后相應(yīng)的調(diào)用函數(shù)
acceletor:快捷鍵
underline:指定是否菜單信息下有橫線
menu:屬性指定哪一個(gè)作為頂級(jí)菜單
# 普通菜單案例 import tkinter baseFrame = tkinter.Tk() menubar = tkinter.Menu(baseFrame) for item in ['File', 'Edit', 'View', 'Aboyt']: menubar.add_command(label=item) baseFrame['menu'] = menubar baseFrame.mainloop()
add_cascade:級(jí)聯(lián)菜單,作用是引出后面的菜單
add_cascade的menu屬性:指定把菜單級(jí)聯(lián)到哪個(gè)菜單上
label:名稱
過(guò)程:
建立menu實(shí)例
add_command
add_cascade
# 級(jí)聯(lián)菜單案例 import tkinter baseFrame = tkinter.Tk() menubar = tkinter.Menu(baseFrame) emenu = tkinter.Menu(menubar) for item in ['Copy', 'Past', 'Cut']: emenu.add_command(label=item) menubar.add_cascade(label='File') menubar.add_cascade(label='Edit', menu=emenu) menubar.add_cascade(label='About') baseFrame['menu'] = menubar baseFrame.mainloop()
彈出菜單也叫上下文菜單
實(shí)現(xiàn)的大致思路
建立菜單并向菜單添加各種功能
監(jiān)聽鼠標(biāo)右鍵
如果右鍵點(diǎn)擊,則根據(jù)位置判斷彈出
調(diào)用Menu的pop方法
add_separator:添加分隔符
# 彈出式菜單案例 import tkinter def makeLabel(): global baseFrame tkinter.Label(baseFrame, text="PHP是最好的編程語(yǔ)言,我用Python").pack() baseFrame = tkinter.Tk() menubar = tkinter.Menu(baseFrame) for x in ['麻辣香菇', '汽鍋雞', '東坡肘子']: menubar.add_separator() menubar.add_command(label=x) menubar.add_command(label="重慶火鍋", command=makeLabel) # 事件處理函數(shù)一定要至少有一個(gè)參數(shù),且第一個(gè)參數(shù)表示的是系統(tǒng)事件 def pop(event): # 注意使用 event.x 和 event.x_root 的區(qū)別 # menubar.post(event.x, event.y) menubar.post(event.x_root, event.y_root) baseFrame.bind("
canvas 畫布
畫布:可以自由的在上面繪制圖形的一個(gè)小舞臺(tái)
在畫布上繪制對(duì)象,通常用create_xxxx,xxxx=對(duì)象類型,例如line,rectangle
畫布的作用的把一定的組件畫到畫布上顯示出來(lái)
畫布所支持的組件:
arc(圓或者弧)
bitmap(一個(gè)位圖)
image(BitmapImage,PhotoImage)(圖片)
line(線)
oval(橢圓形)
polygon(多邊形)
rectangle(四邊形)
text(文字)
window(組件)
每次調(diào)用create_xxx都會(huì)返回一個(gè)創(chuàng)建的組件的ID,同時(shí)也可以用tag屬性指定其標(biāo)簽
通過(guò)調(diào)用canvas.move實(shí)現(xiàn)一個(gè)一次性動(dòng)作
# canvas案例 import tkinter baseFrame = tkinter.Tk() cvs = tkinter.Canvas(baseFrame, width=300, height=200) cvs.pack() # 一條線需要兩個(gè)點(diǎn)指明起始 # 參數(shù)數(shù)字的單位是px cvs.create_line(23,23, 190,234) cvs.create_text(56,67, text="I LOVE PYTHON") baseFrame.mainloop()
# 畫一個(gè)五角星 import tkinter import math as m baseFrame = tkinter.Tk() w = tkinter.Canvas(baseFrame, width=300, height=300, background="gray") w.pack() # 中心點(diǎn) center_x = 150 center_y = 150 r = 150 # 依次存放五個(gè)點(diǎn)的位置 points = [ # 左上點(diǎn) # pi是一個(gè)常量數(shù)字,3.1415926 center_x - int(r * m.sin(2 * m.pi / 5)), center_y - int(r * m.cos(2 * m.pi / 5)), # 右上點(diǎn) center_x + int(r * m.sin(2 * m.pi / 5)), center_y - int(r * m.cos(2 * m.pi / 5)), # 左下點(diǎn) center_x - int(r * m.sin( m.pi / 5)), center_y + int(r * m.cos( m.pi / 5)), # 頂點(diǎn) center_x, center_y - r, # 右下點(diǎn) center_x + int(r * m.sin( m.pi / 5)), center_x + int(r * m.cos( m.pi / 5)), ] # 創(chuàng)建一個(gè)多邊形 w.create_polygon(points, outline="green", fill="yellow") w.create_text(150,150, text="五角星") baseFrame.mainloop()
import tkinter baseFrame = tkinter.Tk() def btnClick(event): global w w.move(id_ball, 12,5) w.move("fall", 0,5) def btnClick_1(event): global w w.move(id_ball, -12,-5) w.move("fall", 0,-5) w = tkinter.Canvas(baseFrame, width=500, height=400) w.pack() w.bind('
GUI Python
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。