- 原文博客地址: Python編程之Tkinter的使用02
-
Tkinter
是Python
的標準GUI
庫北发。Python
使用Tkinter
可以快速的創(chuàng)建GUI
應用程序。 - 由于
Tkinter
是內置到python
的安裝包中、只要安裝好Python
之后就能import Tkinter
庫、而且IDLE
也是用Tkinter
編寫而成娱据、對于簡單的圖形界面Tkinter
還是能應付自如 -
上一篇文章介紹了
Tkinter
模塊和Button
,Label
等部分控件 - 這里主要介紹
Listbox
,Scale
,Menu
,Frame
等部分控件的使用 - GitHub代碼示例目地址
Listbox
列表框
一個可以包含一個或多個文本項的列表框医吊,可以設置為單選或多選
創(chuàng)建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, 則函數只對參數1的索引值進行操作
- 刪除/取消選中/取值等函數類似
#刪除 參數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
文本的多行顯示, 這里就需要添加滾動條
效果圖如下
# 滾動
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
效果圖如下
Spinbox
數值范圍控制器
- 組件
Spinbox
和組件Scale
類似, 都是根據需求顯示一個范圍內的內容 - 區(qū)別:
Spinbox
去能拖拽, 只能點擊增加或減少;Scale
可以拖拽選擇
# 綁定變量
spinStr = StringVar()
# 事件監(jiān)聽
def updateAction():
# 在最后拼接上'12'
# spin1.insert(END, 12)
print(spinStr.get())
'''屬性介紹:
from_: 起始值
to: 最大值
increment: 步長
textvariable: 綁定變量
command: 綁定函數, 事件監(jiān)聽
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
是被用來顯示在標題欄/窗口或者其他頂層窗口上的菜單欄
頂層菜單
添加菜單項, 單純的添加之后沒有任何效果
# 菜單條
menubar = Menu(window)
window.configure(menu=menubar)
下面給菜單添加菜單列表選項, 添加之后只有菜單列表, 但是每一個菜單卻沒有下拉列表
# 創(chuàng)建一個菜單選項
menu1 = Menu(menubar, tearoff=False)
# 想菜單條上添加菜單選項
menubar.add_cascade(label='語言', menu=menu1)
menu2 = Menu(menubar, tearoff=False)
menubar.add_cascade(label='顏色', menu=menu2)
給每一個菜單添加下拉列表和監(jiān)聽事件
def menuAction1():
print('menubar')
# 菜單條
menubar = Menu(window)
window.configure(menu=menubar)
# 創(chuàng)建一個菜單選項
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
中嘗試了一下, 發(fā)現沒有什么效果; 在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='開發(fā)語言', 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
就是屏幕上的一塊矩形區(qū)域脯颜,多是用來作為容器(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
涉及到的數據類型和布局方式 - 以及鼠標的點按事件和一些特殊的事件操作
- 未完待續(xù).............