Tkinter
是Python
的標準GUI
庫。Python
使用 Tkinter
能夠快速的建立GUI
應用程序。Tkinter
是內置到python
的安裝包中、只要安裝好Python
以後就能import Tkinter
庫、並且IDLE
也是用Tkinter
編寫而成、對於簡單的圖形界面Tkinter
仍是能應付自如Tkinter
模塊和Button
, Label
等部分控件Listbox
, Scale
, Menu
, Frame
等部分控件的使用Listbox
列表框一個能夠包含一個或多個文本項的列表框,能夠設置爲單選或多選python
Listbox
lb = Listbox(window, selectmode = EXTENDED)
lb.pack()
複製代碼
selectmode
: 設置列表框的樣式(默認值-BROWSE
), 有四個可選項
SINGLE
: 單選, 不能經過鼠標的移動選中新的item
, 只能點選BROWSE
: 單選, 能夠經過鼠標的移動選中新的位置(item
並不會移動)MULTIPLE
: 多選, 可是隻能經過鼠標點擊進行多選EXTENDED
: 多選, 按住Shift
能夠實現連選, 按住Control
能夠實現多選Listbox
使用insert
來添加一個元素,其中參數一爲添加的索引值, 參數二爲要添加的元素ACTIVE
是向當前選中的item
前插入一個(即便用當前選中的索引做爲插入位置)END
是想最後添加一個元素for item in ["good", "nice", "handsome", "vg", "vn"]:
# 按順序添加
lb.insert(END, item)
# 在開始位置添加
lb.insert(ACTIVE, 'Titan')
# 在最後添加
lb.insert(END, 'jun')
# 在具體的索引出添加元素
lb.insert(2, 'lululu')
# 把列表當成一個元素添加
lb.insert(ACTIVE, [1, 2, 3])
# 添加元組
lb.insert(ACTIVE, ('che', '09'))
複製代碼
def selection_set(self, first, last=None):
複製代碼
#刪除 參數1爲開始的索引,參數2爲結束的索引,若是不指定參數2,只刪除第一個索引處的內容
# lb.delete(1, 2)
# lb.delete(1)
#選中 參數1爲開始的索引,參數2爲結束的索引,若是不指定參數2,只選中第一個索引處的內容
lb.selection_set(2, 5)
lb.selection_set(0)
# 取消
lb.selection_clear(3, 4)
lb.selection_clear(0)
#獲取到列表中的元素的個數
print(lb.size())
#從列表中取值 參數1爲開始的索引,參數2爲結束的索引,若是不指定參數2,只獲取第一個索引處的內容
print(lb.get(1, 3))
print(lb.get(5))
#返回當前的索引項,不是item元素
print(lb.curselection())
# 判斷某選項是否被選中
print(lb.selection_includes(3))
print(lb.selection_includes(5))
複製代碼
Listbox
不支持command
屬性來設置回調函數了,使用bind
來指定回調函數# 綁定變量
lbv = StringVar()
lb = Listbox(window, selectmode = SINGLE, listvariable = lbv)
lb.pack()
for item in ["good", "nice", "handsome", "jun", "titan"]:
lb.insert(END, item)
# 打印當前列表中的選項
print(lbv.get())
print(lb.get(1))
# 設置選項(全部從新賦值)
# lbv.set((1, 2, 3))
# 綁定事件
def listboxAction(event):
print(lb.get(lb.curselection()))
# 第一個參數表示操做樣式, 這裏是雙擊操做, 1表明鼠標左鍵
lb.bind('<Double-Button-1>', listboxAction)
複製代碼
Listbox
的內容超過所容納範圍時, 內容須要滾動顯示, 相似上文中提到的Text
文本的多行顯示, 這裏就須要添加滾動條git
效果圖以下github
# 滾動
lb = Listbox(window, selectmode=EXTENDED)
for item in ["good", "nice", "handsome", "from", "thinter","good1", "nice1", "handsome1", "vg1", "vn1","good3", "nice3", "handsome3", "vg3", "vn3"]:
lb.insert(END, item)
# 滾動條
sc = Scrollbar(window)
sc.pack(side = RIGHT, fill = Y)
lb.configure(yscrollcommand = sc.set)
lb.pack(side = LEFT, fill = BOTH)
# 額外給屬性賦值
sc["command"] = lb.yview
複製代碼
Scale
拽指示器供用戶經過拖拽指示器改變變量的值,能夠水平,也能夠豎直, 下面是相關屬性介紹編程
from_
: 設置最小值to
: 設置最大值resolution
: 步距, 每次移動增長的最小單位orient
: 顯示方向(水平-HORIZONTAL
, 垂直-Variable
)variable
: 綁定變量command
: 綁定回調函數length
: 控件的長度(垂直方向上則是高度)digits
: 控制顯示的數字位數scale = Scale(window, from_ = 0, to = 100, orient = HORIZONTAL, length = 200, label='choice:')
scale.pack()
# 設置初始值
scale.set(34)
# 取值
def showNumber(event):
print(scale.get())
scale["command"] = showNumber
複製代碼
效果圖以下ide
Spinbox
數值範圍控制器Spinbox
和組件Scale
相似, 都是根據需求顯示一個範圍內的內容Spinbox
去能拖拽, 只能點擊增長或減小; Scale
能夠拖拽選擇# 綁定變量
spinStr = StringVar()
# 事件監聽
def updateAction():
# 在最後拼接上'12'
# spin1.insert(END, 12)
print(spinStr.get())
'''屬性介紹: from_: 起始值 to: 最大值 increment: 步長 textvariable: 綁定變量 command: 綁定函數, 事件監聽 values: 設置後, 每次更新值將使用values指定的值 '''
# spin = Spinbox(window, from_ = 0, to = 100, increment = 10, textvariable = spinStr, command = updateAction)
# spin.pack()
spin1 = Spinbox(window, values=[0, 10, 30, 50, 80, -9], increment = 10, textvariable = spinStr, command = updateAction, bg='red')
spin1.pack()
複製代碼
效果圖以下函數
Menu
菜單Menu
是被用來顯示在標題欄/窗口或者其餘頂層窗口上的菜單欄佈局
添加菜單項, 單純的添加以後沒有任何效果post
# 菜單條
menubar = Menu(window)
window.configure(menu=menubar)
複製代碼
下面給菜單添加菜單列表選項, 添加以後只有菜單列表, 可是每個菜單卻沒有下拉列表ui
# 建立一個菜單選項
menu1 = Menu(menubar, tearoff=False)
# 想菜單條上添加菜單選項
menubar.add_cascade(label='語言', menu=menu1)
menu2 = Menu(menubar, tearoff=False)
menubar.add_cascade(label='顏色', menu=menu2)
複製代碼
給每個菜單添加下拉列表和監聽事件spa
def menuAction1():
print('menubar')
# 菜單條
menubar = Menu(window)
window.configure(menu=menubar)
# 建立一個菜單選項
menu1 = Menu(menubar, tearoff=False)
# 菜單選項添加內容
for item in ['Python', 'PHP', 'CPP', 'C', 'Java', 'JavaScript', 'VBScript', 'Exit']:
if item == 'Exit':
# 添加分割線
menu1.add_separator()
menu1.add_command(label=item, command=window.quit)
else:
menu1.add_command(label=item, command=menuAction1)
# 想菜單條上添加菜單選項
menubar.add_cascade(label='語言', menu=menu1)
# 菜單2的事件處理
def menuAction2():
print(menuStr.get())
menuStr = StringVar()
menu2 = Menu(menubar, tearoff=True)
for item in ['red', 'orange', 'blue', 'gray']:
menu2.add_radiobutton(label=item, variable=menuStr, command=menuAction2)
# 添加到菜單列表
menubar.add_cascade(label='顏色', menu=menu2)
複製代碼
效果圖以下
tearoff
屬性介紹
tearoff
是控制菜單可否獨立出來的屬性, 取值有True
和False
tearoff
設置爲True
之後,就是代表這個菜單是能夠獨立出來的,若是是False
的話就不能夠獨立出來Mac
中嘗試了一下, 發現沒有什麼效果; 在Windows
系統中會有一條虛線, 點擊虛線, 會跳出一個懸浮菜單; 有Windows
系統的童鞋能夠試一下# 鼠標右鍵菜單
menubar2 = Menu(window)
menu3 = Menu(menubar2, tearoff=False)
for item in ['Python', 'PHP', 'CPP', 'C', 'Java', 'JavaScript', 'VBScript', 'Exit']:
menu3.add_command(label=item)
menubar2.add_cascade(label='開發語言', menu=menu3)
# 用於顯示菜單
def showMenu(event):
print('window')
# 鼠標點擊處的座標
menubar2.post(event.x_root, event.y_root)
# window綁定鼠標事件
window.bind("<Button-2>", showMenu)
複製代碼
效果圖以下
菜單中每一項的刪除和添加都是根據索引操做的
# 添加/刪除菜單
def menuClick():
print("menu3")
# 添加command項
menu3.insert_command(1, label='command', command=menuClick)
# 添加radiobutton項
menu3.insert_radiobutton(3, label='radiobutton', command=menuClick)
# 添加checkbutton項
menu3.insert_checkbutton(5, label='checkbutton', command=menuClick)
# 添加分割線
menu3.insert_separator(4)
# menu3.insert_separator(0)
# 刪除
# 兩個參數: 參數1爲開始的索引,參數2爲結束的索引,若是不指定參數2,只獲取第一個索引處的內容
menu3.delete(2, 4)
menu3.delete(0)
複製代碼
Combobox
下拉控件# 綁定變量
cv = StringVar()
combo = ttk.Combobox(window, textvariable=cv)
combo.pack()
# 設置下拉菜單數據(元組數據)
combo['value'] = ('杭州', '湖州', '溫州', '嘉興', '舟山')
# 設置默認值
combo.current(0)
# 綁定事件
def comboboxClick(event):
print(cv.get())
print(combo.get())
combo.bind('<<ComboboxSelected>>', comboboxClick)
複製代碼
效果圖以下
Frame
佈局Frame
就是屏幕上的一塊矩形區域,可能是用來做爲容器(container
)來佈局窗體
# 第一層容器
frame = Frame(window)
frame.pack()
# 左邊容器
leftFrame = Frame(frame)
Label(leftFrame, text='左上位置', bg='red', height=5, width=10).pack(side=TOP)
Label(leftFrame, text='左下位置', bg='yellow', height=5, width=10).pack(side=TOP)
leftFrame.pack(side=LEFT)
# 右邊容器
rightFrame = Frame(frame)
Label(rightFrame, text='右上位置', bg='orange', height=5, width=10).pack(side=TOP)
Label(rightFrame, text='右下位置', bg='blue', height=5, width=10).pack(side=TOP)
rightFrame.pack(side=RIGHT)
複製代碼
效果圖以下
Tkinter
的大部分組件已經基本都介紹完了Tkinter
涉及到的數據類型和佈局方式