介紹
Tkinter 是 Python 的標(biāo)準(zhǔn) GUI 庫(kù)。Python 使用 Tkinter 可以快速的創(chuàng)建 GUI 應(yīng)用程序。由于 Tkinter 是內(nèi)置到 Python 的安裝包中,所以只要安裝好 Python 之后就能使用了,無(wú)需另外安裝。Tkinter中的ttk對(duì)一些控件進(jìn)行了美化,說(shuō)是美化其實(shí)還是一樣丑,所以不會(huì)去介紹相同的,只會(huì)介紹一些新增的控件。
控件種類
tkinter 控件種類
- Button 按鈕
- Checkbutton 多選框按鈕
- Entry 輸入框
- Frame 框架
- Label 標(biāo)簽
- LabelFrame 標(biāo)簽框架
- Menu 菜單
- PanedWindow 分欄窗口
- Radiobutton 單選按鈕
- Scale 滑塊
- Scrollbar 滾動(dòng)條
- Spinbox 輸入框(指定數(shù)據(jù)范圍,類型的輸入框)
- Text 文本框
- Listbox 列表框
- Canvas 畫布
tkinter.ttk 控件種類(除了上面那些,還有下面這些新增的控件)
- Combobox 下拉列表
- Notebook 標(biāo)簽頁(yè)
- Progressbar 進(jìn)度條
- Treeview 樹狀瀏覽窗口
- Separator 分割線
- Sizegrip 拉伸窗口大小的按鈕
基本框架
import tkinter as tk
root = tk.Tk() # 主窗口對(duì)象
# 注意,下面的x不是乘號(hào)是小寫字母x
root.geometry('600x300+100+100') # 設(shè)置窗口的大小,以及距離屏幕左上角x軸,y軸的距離。
root.title('test app') # 設(shè)置窗口的標(biāo)題
###### 添加控件,設(shè)置控件屬性,綁定回調(diào)函數(shù)
root.mainloop()
添加控件的基本流程
- 新建控件,通常第一個(gè)是master參數(shù),代表要把這個(gè)控件放在哪個(gè)控件上
- 在新建時(shí)可以往里面添加參數(shù),設(shè)置一些控件屬性,如:背景色,字體顏色,高,寬等,也可以在后期設(shè)置使用config方法修改/設(shè)置屬性。
- 把新建的控件放好,控件的布局用pack, place, grid
實(shí)例
root = tk.Tk() # 主窗口
root.geometry('600x400+200+200')
tk.Label(root, # 第一個(gè)參數(shù)就是master,表明要把這個(gè)控件放在master里面。
textvariable=mystr,
width=20, # 設(shè)置屬性
height=3,
bg='#e33e31').pack() # pack布局該控件在主體中的位置。
root.mainloop()
控件與變量的關(guān)系
通過(guò)一些特定參數(shù),某些組件(如文本輸入組件)的當(dāng)前設(shè)置可直接與應(yīng)用程序的變量關(guān)聯(lián)。這些參數(shù)包括 variable 、 textvariable 、 onvalue 、 offvalue 、 value。這種關(guān)聯(lián)是雙向的:只要這些變量因任何原因發(fā)生變化,其關(guān)聯(lián)的部件就會(huì)更新以反映新的參數(shù)值。
現(xiàn)已經(jīng)定義了很多有用的 Variable 子類: StringVar 、 IntVar 、DoubleVar 和 BooleanVar。
- 調(diào)用 get() 方法可以讀取變量的當(dāng)前值;
- 調(diào)用 set() 方法則可改變變量值。
實(shí)例
簡(jiǎn)單的說(shuō),像textvariable這樣的參數(shù),它和變量mystr是雙向綁定的,所以對(duì)mystr設(shè)置了值,也相當(dāng)于對(duì)textvariable設(shè)置了值,從mystr獲得的值,也相當(dāng)于從textvariable獲得值。
import tkinter as tk
root = tk.Tk()
root.geometry('600x400')
mystr = tk.StringVar()
mystr.set('one')
lbl = tk.Label(root,textvariable=mystr)
lbl.pack()
def change():
v = mystr.get()
if v == 'one':
mystr.set('two')
elif v == 'two':
mystr.set('one')
btn = tk.Button(root,text='Change',command=change)
btn.pack()
root.mainloop()
控件通用參數(shù)取值
控件中有很多參數(shù)功能都是一樣的,為了化繁為簡(jiǎn),把一些通用參數(shù)在這邊列出來(lái),后面就只提每個(gè)控件比較獨(dú)特的參數(shù)。
顏色相關(guān)的
- background/bg 背景顏色
- foreground/fg 前景色,字體顏色
- activebackground 激活狀態(tài)的背景色(比如:點(diǎn)擊時(shí))
- activeforeground 激活狀態(tài)的前景色
- highlightbackground 框架frame沒有獲得焦點(diǎn)時(shí),邊框的顏色
- highlightcolor 框架frame獲得焦點(diǎn)時(shí),邊框的顏色
- highlightthickness 高亮邊框的寬度,默認(rèn)是0,所以當(dāng)你設(shè)置了上面兩項(xiàng),而沒有任何變化,說(shuō)明邊框?qū)挾?,你看不到,設(shè)置一個(gè)整數(shù),比如5,就可以看得到了。(使用tab鍵盤切換控件時(shí),控件外圍提示框的寬度,如下圖黑色邊框)
- disabledforeground 控件state=disabled 時(shí)設(shè)置字體顏色
- disabledbackground 控件state=disabled 時(shí)設(shè)置背景色

bd/borderwidth
邊框的寬度.
height / width
控件的高、寬
takefocus
用戶是否可以使用tab鍵移動(dòng)到這個(gè)部件,True or False
anchor 錨定點(diǎn)
"n"、"ne"、"e"、"se"、"s"、"sw"、"w"、"nw"和"center"
cursor 當(dāng)光標(biāo)進(jìn)入控件時(shí)的樣式
X_cursor
arrow
based_arrow_down
based_arrow_up
boat
bogosity
bottom_left_corner
bottom_right_corner
bottom_side
bottom_tee
box_spiral
center_ptr
circle
clock
coffee_mug
cross
cross_reverse
crosshair
diamond_cross
dot
dotbox
double_arrow
draft_large
draft_small
draped_box
exchange
fleur
gobbler
gumby
hand1
hand2
heart
icon
iron_cross
left_ptr
left_side
left_tee
leftbutton
ll_angle
lr_angle
man
middlebutton
mouse
none
pencil
pirate
plus
question_arrow
right_ptr
right_side
right_tee
rightbutton
rtl_logo
sailboat
sb_down_arrow
sb_h_double_arrow
sb_left_arrow
sb_right_arrow
sb_up_arrow
sb_v_double_arrow
shuttle
sizing
spider
spraycan
star
target
tcross
top_left_arrow
top_left_corner
top_right_corner
top_side
top_tee
trek
ul_angle
umbrella
ur_angle
watch
xterm
bitmap
內(nèi)置已命名的位圖有八個(gè):
'error'、'gray25'、'gray50'、'hourglass'、'info'、'questhead'、'question'、'warning'。若要指定位圖的文件名,請(qǐng)給出完整路徑,前面加一個(gè)@,比如"@/xxx/xxx.bit"。
image
指定要在小部件中顯示的圖像,使用
img = tkinter.PhotoImage(file='xxx.gif'),加載圖片
font
Tk 采用一串名稱的格式表示字體,例如
font=("Microsoft Yahei",20,'italic','bold')。正數(shù)的字體大小以點(diǎn)為單位,負(fù)數(shù)的大小以像素為單位。
justify對(duì)齊方式
"left"、"center"、"right"和"fill"。
distance
屏幕距離可以用像素或絕對(duì)距離來(lái)指定。像素是數(shù)字,絕對(duì)距離是字符串,后面的字符表示單位:
c是厘米,i是英寸,m是毫米,p則表示打印機(jī)的點(diǎn)數(shù)。例如,3.5 英寸可表示為"3.5i"。
relief
決定了組件的邊框樣式。 合法值包括:
"raised"、"sunken"、"flat"、"groove"和"ridge"。
scrollcommand
有
xscrollcommand和yscrollcommand分別是給控件設(shè)置水平滾動(dòng)條和垂直滾動(dòng)條,使用scrollbar.set設(shè)置滾動(dòng)條
wrap
一個(gè)單詞還沒有輸入完就要換行了。如果設(shè)置成
char沒輸入完的部分會(huì)另起一行,如果設(shè)置成word就會(huì)整個(gè)單詞跳到下一行。(只能是以下值之一:"none"、"char"、"word"。)
wraplength
設(shè)置每行都最大長(zhǎng)度
state
控件的狀態(tài):
active,disabled, ornormal
padx,pady
在控件里面設(shè)置代表添加內(nèi)邊距
在pack()、grid()里面設(shè)置代表添加外邊距




compound
圖片和文字的排布方式;
none,bottom,top,left,right,center,如果選擇top,圖片就會(huì)在文字上方。
underline
下劃線,underline=0代表在第一個(gè)字符下添加下劃線。
控件的布局方式
place()
在一個(gè)坐標(biāo)位置上放置控件
參數(shù):
x
y
anchor (錨定點(diǎn): n, ne, e, se, s, sw, w, nw, or center)

grid()
用行列的形式來(lái)布局控件
參數(shù)
row 第幾行
rowspan 跨多少行
column 第幾列
columnspan 跨多少列
ipadx - 水平內(nèi)邊距
ipady - 垂直內(nèi)邊距
padx - 水平外邊距
pady - 垂直外邊距
sticky(在單元格里面的位置:'n', 's', 'w', 'e', )

pack()
參數(shù)
anchor (錨定點(diǎn): n, ne, e, se, s, sw, w, nw, or center)
expand=bool - 是否隨著父控件拉伸而拉伸
fill=NONE or X (填充滿水平方向)
or Y (填充滿垂直方向)
or BOTH(填充滿水平和垂直方向)
ipadx - 水平內(nèi)邊距
ipady - 垂直內(nèi)邊距
padx - 水平外邊距
pady - 垂直外邊距
side=TOP or BOTTOM or LEFT or RIGHT - 放置的位置


Toplevel
tkinter中的窗口是一個(gè)隱含的對(duì)象,最低一層實(shí)際上是Toplevel,構(gòu)建窗口就是實(shí)例化一個(gè)Toplevel控件。
Toplevel可設(shè)置的
| 項(xiàng)目 | 說(shuō)明 |
|---|---|
| title(str) | 設(shè)置窗口的標(biāo)題 |
| iconbitmap(ico_path) | 設(shè)置窗口的圖標(biāo),不知道為什么window可以設(shè)置,Mac不行,推薦ico x32的尺寸 |
| geometry(str) | 設(shè)置窗口的大小,以及距離左上角的x軸,y軸距離 |
| maxsize(width=None, height=None) | 設(shè)置窗口的最大尺寸 |
| minsize(width=None, height=None) | 設(shè)置窗口的最小尺寸 |
| resizable(width=None, height=None) | 設(shè)置窗口的可拉伸尺寸,當(dāng)都等于0,表示禁止拉伸 |
| attributes('-alpha',1.0) | 設(shè)置窗口的透明度,取值再0-1之間,還有其他可設(shè)置,但是window和Mac之間不通用,不說(shuō)了。 |
| configure(屬性) | 配置窗口的一些屬性,下面表格中列出 |
| mainloop() | 主循環(huán),執(zhí)行則相當(dāng)于啟動(dòng)窗口,必要 |
configure可設(shè)置的屬性
| 屬性 | 說(shuō)明 |
|---|---|
bd/borderwidth |
邊框?qū)?默認(rèn)是0,當(dāng)你設(shè)置了邊框?qū)?,如果relief是flat,你是看不出變化的 |
menu |
設(shè)置菜單Menu對(duì)象 |
relief |
邊框樣式,可選的FLAT,SUNKEN,RAISED,GROOVE,RIDGE默認(rèn)為FLAT
|
background/bg |
背景色,'#1BA135'這樣的RGB |
colormap |
設(shè)置需要是Colormap的實(shí)例, |
container |
設(shè)置需要是Container的實(shí)例 |
cursor |
鼠標(biāo)光標(biāo)在其中的位置 |
height |
高度 |
width |
寬度 |
highlightbackground |
要高亮的背景色 |
highlightcolor |
要高亮的顏色 |
highlightthickness |
高亮的寬度 |
padx |
水平padding 內(nèi)邊距 |
pady |
垂直padding 內(nèi)邊距 |
takefocus |
指示用戶可以使用tab鍵移動(dòng)到這個(gè)部件 |
relief效果圖






實(shí)例
import tkinter as tk
import sys
import os
ui_dir = os.path.dirname(os.path.realpath(sys.argv[0]))
ico_path = os.path.join(ui_dir,'ico/logox32.ico')
root = tk.Tk()
# 注意,下面的x不是乘號(hào)是小寫字母x
root.geometry('600x300+100+100') # 設(shè)置窗口的大小,以及距離屏幕左上角x軸,y軸的距離。
root.iconbitmap(ico_path)
root.maxsize(width=600,height=300)
root.minsize(width=500,height=200)
root.configure(borderwidth=50,bg='#1BA135',relief='sunken')
root.title('test app') # 設(shè)置窗口的標(biāo)題
root.mainloop()