GUI概述
GUI是圖形用戶界面
tkinter圖形化庫簡介
tkinter是python一個圖形庫,我們先嚐試做一個簡單的案例,打開圖形用戶界面tkinter
例子:打開圖形用戶界面
如果大家連這個包都沒有的話,用pycharm裝好或者cmd裏輸入
pip install tkinter
下面我們繼續做,在test.py裏輸入這三行命令。
# -*- coding:utf-8 -*-
import tkinter # 導入模塊
root = tkinter.Tk() # 生成root主窗口
root.mainloop() # 生成消息循環
- 頭就是一個編碼規範-utf-8,
- 導入模塊
- 生成主窗口
- 讓主窗口消息循環,簡單地說,讓我們看見別閃退
例子:嘗試添加label和button進去
大家學過vb或者安卓編程就更優秀了,它們都是面向對象編程。學會拖控件進去,而python也是同理,只不過python更偏向於命令行,將一個控件顯示出來需要兩步
- 讓類生出一個控件出來
- 讓控件放到主窗口中
就這兩步原理十分簡單:
# -*- coding:utf-8 -*-
import tkinter # 導入模塊
root = tkinter.Tk() # 生成root主窗口
label = tkinter.Label(root, text="Hello,tkinter") # 生成標籤
label.pack() #將標籤添加到root窗口中
button1 = tkinter.Button(root, text="左邊按鈕") # 生成button1
button1.pack(side=tkinter.LEFT) # 將button1添加到root主窗口中
button2 = tkinter.Button(root, text="右邊按鈕") # 生成button2
button2.pack(side=tkinter.RIGHT) # 將button2添加到root主窗口中
root.mainloop() # 生成消息循環
tkinter組件
下面如果要diy出更優秀的圖形效果就需要組件的學習,下面開始!
組件分類
共14個
組件名稱 | 組件功能 |
---|---|
Button | 按鈕 |
Canvas | 繪圖行組件,可以在其中繪製圖形 |
Checkbutton | 複選框 |
Entry | 文本框(單行) |
Frame | 框架,將幾個組件組成一組 |
Label | 標籤,可以顯示文字或者圖片 |
Listbox | 列表框 |
Menu | 菜單 |
Message | 與Label組件類似,但是可以根據自身大小將文本換行 |
Radiobutton | 單選框 |
Scale | 滑塊 |
Scrollbar | 滑動條 |
Text | 文本框(多行) |
Toplevel | 用來創建子窗口容器組件 |
佈局組件
當我們手裏生了很多控件之後,如何DIY擺放這是一個大問題。下面我們一起學習擺放的一些種類。牢記本小節一共三種擺放方式。熟練一種,其餘瞭解
pack方法
就是我們在例子二用的方法。
- after:將組件置於其他組件之後
- anchor:組件的對齊方式,頂對齊"n",底"s"左“w”右“e”(用英文中的方位詞去記憶)
- before:將組件置於其他組件之前
grid方法
- column:組件所在的列起式位置
- columnspam:組件的列寬
- row:組件所在的行起式位置
- rowspam:組件的行寬
place方法
參數名 | 作用 |
---|---|
anchor | 組件對齊方式 |
x | 組件左上角的x座標 |
y | 組件左上角的y座標 |
relx | 組件相對於窗口的x座標,應爲0~1之間的小數 |
rely | 組件相對於窗口的y座標,應爲0~1之間的小數 |
width | 組件的寬度 |
height | 組件的高度 |
relwidth | 組件相對於窗口的寬度,應爲0~1之間的小數 |
relheight | 組件相對於窗口的高度,應爲0~1之間的小數 |
常用tkinter組件
上面的方法講完了,按照正常的情況下,我們已經可以佈局出自己想要的方式了,但是俗話要想讓他們動起來還需要懂得這些知識。知道這些知識可以幹嘛呢?就是你在寫回調函數和設置顏色設置樣式的時候得心應手。畢竟上面的學習只是簡單的把佈局佈置好,而真正的精華卻在下面!一起努力!
按鈕
說到按鈕,大家經常點的東西,在vb中當然可以設置很多樣式,python也可以。下面是他的一些參數表
參數名 | 作用 |
---|---|
anchor | 指定按鈕上文本的位置 |
background(bg) | 指定按鈕的背景色 |
bitmap | 指定按鈕上顯示的位圖 |
borderwidth(bd) | 指定按鈕邊框的寬度 |
command | 指定按鈕的回調函數 |
cursor | 指定鼠標移動到按鈕上的指針樣式 |
font | 指定按鈕上文本的字體 |
foreground(fg) | 指定按鈕的前景色 |
height | 指定按鈕的高度 |
image | 指定按鈕上顯示的圖片 |
state | 指定按鈕的狀態 |
text | 指定按鈕的文字 |
width | 指定按鈕的寬度 |
當大家覺得博主又在難爲人的時候,發現我爲什麼要記這種東西,其實也壓根不用記,只需要你將問題轉換爲你口中的語言,問題已經將要被解決了。比如:
- 問一下,我怎麼設置按鈕字體微軟雅黑
- 怎麼設置按鈕的文字呀
- 怎麼將按鈕的寬度改改呀
- 等等不勝枚舉
將問題描述出來,就很快得到解決。
例子:測試按鈕不同狀態
看完這個例子會發現按鈕原來是這樣子玩的:
實驗效果
實驗代碼
牢記三個步驟開啓圖形GUI
# -*- coding:utf-8 -*-
import tkinter # 導入模塊
root = tkinter.Tk() # 生成root主窗口
botton1 = tkinter.Button(root,anchor=tkinter.E, text='我是按鈕1', width = 40, height = 5)
botton1.pack()
botton2 = tkinter.Button(root,anchor=tkinter.E, text='我是按鈕2', bg='red')
botton2.pack()
botton3 = tkinter.Button(root,anchor=tkinter.E, text='我是按鈕3', width = 14, height = 1)
botton3.pack()
botton4 = tkinter.Button(root,anchor=tkinter.E, text='我是按鈕4', width = 60, height = 5, state=tkinter.DISABLED)
botton4.pack()
root.mainloop() # 生成消息循環
文本框
講完按鈕我們處理一下文本框,文本框我們在首文,沒用到喲!因此他的設置主要分爲兩種,一種是單行,另外一種是多行。
tkinter.Text # 多行設置
tkinter.Entry # 單行設置
參數名 | 作用 |
---|---|
background(bg) | 指定文本框的背景色 |
borderwidth(bd) | 指定文本框邊框的寬度 |
font | 指定文本框中文字的字體 |
forground(fg) | 指定文本框的前景色 |
selectbackground | 指定選定文本的背景色 |
selectforeground | 指定選定文本的前景色 |
show | 指定文本框顯示的字符,若爲“*” ,表示文本框爲密碼框 |
state | 指定文本框的狀態 |
width | 指定文本框的寬度 |
這當然也要附上例子喲
例子:嘗試用表格中的屬性設置文本框
實驗效果
實驗代碼
標籤
標籤相當於vb中的label就是相當於提醒用戶的一個只能看得玩意,有了它界面更加友好。python中除了顯示文本當然可以顯示圖片。在看到上面的兩個參數表格中,再去看這個會發現一些都是重複,可謂是記住一個,拓展記憶就行了。
參數名 | 作用 |
---|---|
anchor | 指定標籤中文本的位置 |
background(bg) | 指定標籤的背景色 |
borderwidth(bd) | 指定標籤的邊框寬度 |
bitmap | 指定標籤的位圖 |
font | 指定標籤中文字的字體 |
forground(fg) | 指定標籤的前景色 |
height | 指定標籤的高度 |
image | 指定標籤中的圖片 |
justify | 指定標籤中多行文本的對齊方式 |
text | 指定標籤中的文本,可以使用“\n” 表示換行 |
width | 指定標籤的寬度 |
例子:嘗試用標籤組件完成實驗效果的圖片
實驗效果
實驗代碼
# -*- coding:utf-8 -*-
import tkinter # 導入模塊
root = tkinter.Tk() # 生成root主窗口
label1 = tkinter.Label(root,anchor=tkinter.E, bg = 'blue',fg = 'red',text='我是標籤1',width=30,height=5)
label1.pack()
label2 = tkinter.Label(root,text='我是標籤2',justify=tkinter.LEFT,width=30,height=5)
label2.pack()
label3 = tkinter.Label(root,text='我是標籤3',justify=tkinter.RIGHT, width=30,height=5)
label3.pack()
label4 = tkinter.Label(root,text='我是標籤4',justify=tkinter.CENTER, width=30,height=5)
label4.pack()
root.mainloop() # 生成消息循環
菜單
我們用pycharm編程的時候,經常調整字體大小、創建項目、創建文件等等。那些都是菜單的功能。大家仔細想象我們用的菜單功能無非是一些最基本的操作。那tkinter其實也有。大家可以看下面的效果
例子:實現添加菜單的主窗口
實驗效果
實驗代碼
爲了便於理解,加上了註釋,其實佈局這種東西,懂得了安卓一丟丟,python gui也並不難
# -*- coding:utf-8 -*-
import tkinter # 導入模塊
root = tkinter.Tk() # 生成root主窗口
menu = tkinter.Menu(root) # 生成菜單
# 製作菜單一
submenu = tkinter.Menu(menu,tearoff = 0)
submenu.add_command(label='Open')
submenu.add_command(label='Save')
submenu.add_command(label='Close')
menu.add_cascade(label='File',menu=submenu)
submenu = tkinter.Menu(menu,tearoff = 0)
# 製作菜單2
submenu.add_command(label='Copy')
submenu.add_command(label='Paste')
submenu.add_separator()
submenu.add_command(label = 'Cut')
menu.add_cascade(label='Edit',menu=submenu)
submenu = tkinter.Menu(menu,tearoff = 0)
submenu.add_command(label='About')
# 製作菜單3--幫助
menu.add_cascade(label='Help',menu=submenu)
root.config(menu=menu)
root.mainloop() # 生成消息循環
單選框和複選框
單選框在安卓中非常重要,在python中用tkinter.Radiobutton和tkinter.Checkbutton.學習html的時候單選框也同意設置成一個name,才能實現互斥。這裏也一樣,通過表格再次深化一下吧!
參數名 | 作用 |
---|---|
anchor | 指定文本的位置 |
background(bg) | 指定背景色 |
borderwidth(bd) | 指定邊框寬度 |
bitmap | 指定組件中的位圖 |
font | 指定文字的字體 |
forground(fg) | 指定前景色 |
height | 指定高度 |
image | 指定圖片 |
justify | 指定多行文本的對齊方式 |
text | 指定標籤中的文本,可以使用“\n” 表示換行 |
value | 指定組件被選中關聯的變量 |
variable | 指定組件所關聯的變量 |
width | 指定寬度 |
大家通過表格要學會發現,value和varible是精華,是單選框和複選框的精華爲了更加便於理解,來一個例子
例子:單選框和複選框樣式簡單學習
實驗效果
實驗代碼
生一個,上牆。可以這麼理解代碼的執行
# -*- coding:utf-8 -*-
import tkinter # 導入模塊
root = tkinter.Tk() # 生成root主窗口
# 單選框佈局
r = tkinter.StringVar()
r.set('1')
radio = tkinter.Radiobutton(root,variable = r,value = '1',text='我是男生')
radio.pack()
radio = tkinter.Radiobutton(root,variable = r,value = '2',text='我是女生')
radio.pack()
radio = tkinter.Radiobutton(root,variable = r,value='3',indicatoron=0,text='另類單選框1')
radio.pack()
radio = tkinter.Radiobutton(root,variable = r,value='4',indicatoron=0,text='另類單選框2')
radio.pack()
# 複選框佈局
c = tkinter.IntVar()
c.set(1)
check = tkinter.Checkbutton(root,text='我是一個複選框',variable = c,onvalue = 1,offvalue = 2)
check.pack()
check = tkinter.Checkbutton(root,text='另類複選框1',variable = c,indicatoron = 0,onvalue = 1,offvalue = 2)
check.pack()
root.mainloop() # 生成消息循環
print(r.get())
print(c.get())
繪製圖形
既然有了海龜繪圖,那就再來個canvas繪圖也無妨。藝術在於創作呀!
參數名 | 作用 |
---|---|
background(bg) | 指定背景色 |
borderwidth(bd) | 指定邊框寬度 |
bitmap | 指定組件中的位圖 |
forground(fg) | 指定前景色 |
height | 指定高度 |
image | 指定圖片 |
width | 指定寬度 |
下面一些方法的學習可以畫出精準的圖形,堪比博主的matlab
方法名 | 功能 |
---|---|
create_arc | 繪製圓弧 |
create_bitmap | 繪製位圖,支持XBM |
create_image | 繪製圖片,支持GIF |
create_line | 繪直線 |
create_oval | 繪製橢圓 |
create_polygon | 繪製多邊形 |
create_rectangle | 繪製矩形 |
create_text | 繪製文字 |
create_window | 繪製窗口 |
delete | 刪除繪製圖形 |
例子:嘗試繪製實驗效果的圖形
看完那麼多的方法,自己也可以試試
實驗圖片
另存爲hm.gif.大家應該能理解
實驗效果
響應操作事件
佈局布的差不多,可以寫回調函數了。太激動了
事件基礎
事件一共分爲三種。鍵盤、鼠標加窗口
事件綁定分三種,綁定單個、綁定所有、綁定類
綁定單個:bind(sequence,func,add)
綁定類: bind_class(className,sequence,func,add)
綁定所有組件:bind_all(sequence,func,add)
各參數如下:
sequence:所綁定的事件,必須以<>包圍的字符串
func:所綁定的事件處理函數
add:可選參數,爲空字符或者'+'
className:所綁定的類
通過綁定的三個原型會發現,最難處理的sequence。因此下面學習一下sequence處理的事件及其意義
鼠標事件及其意義
這裏的鼠標數字可以切換,鼠標的方式可以切換。學會靈活自由搭配
鍵盤事件及其意義
窗口事件及其意義
響應事件
窗口中的事件被綁定到函數後,當該事件被觸發後將調用所綁定的函數進行處理,事件觸發後,系統將向該函數傳遞一個event對象的參數。因此函數格式如下:
def function(event):
<語句>
屬性 | 意義 |
---|---|
char | 按鍵字符,僅對鍵盤事件有效 |
keycode | 按鍵名,僅對鍵盤事件有效 |
keysym | 按鍵編碼,僅對鍵盤事件有效 |
num | 鼠標按鍵,僅對鼠標事件有效 |
type | 所觸發的事件類型 |
widget | 引起事件的組件 |
width,height | 引起事件的組件 |
x,y | 鼠標當前位置,相對於窗口 |
x_root,y_root | 鼠標當前位置,相對於整個屏幕 |