Python 編程之Tkinter的使用02

Tkinter.png
  • 原文博客地址: Python編程之Tkinter的使用02
  • TkinterPython的標準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文本的多行顯示, 這里就需要添加滾動條

效果圖如下

Listbox.gif
# 滾動
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()

效果圖如下

Spinbox控件.png

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)

效果圖如下

Menu頂層菜單.png

tearoff屬性介紹

  • tearoff是控制菜單能否獨立出來的屬性, 取值有TrueFalse
  • 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)

效果圖如下

Menu右鍵菜單.png

添加刪除菜單

菜單中每一項的刪除和添加都是根據索引操作的

# 添加/刪除菜單
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)

效果圖如下

Combobox.png

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)

效果圖如下

Python-Frame.png
  • 至此, Tkinter的大部分組件已經基本都介紹完了
  • 接下來將會介紹一些Tkinter涉及到的數據類型和布局方式
  • 以及鼠標的點按事件和一些特殊的事件操作
  • 未完待續(xù).............
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市贩据,隨后出現的幾起案子栋操,更是在濱河造成了極大的恐慌,老刑警劉巖饱亮,帶你破解...
    沈念sama閱讀 211,348評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件矾芙,死亡現場離奇詭異,居然都是意外死亡近上,警方通過查閱死者的電腦和手機剔宪,發(fā)現死者居然都...
    沈念sama閱讀 90,122評論 2 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來壹无,“玉大人葱绒,你說我怎么就攤上這事《范В” “怎么了地淀?”我有些...
    開封第一講書人閱讀 156,936評論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長岖是。 經常有香客問我帮毁,道長,這世上最難降的妖魔是什么豺撑? 我笑而不...
    開封第一講書人閱讀 56,427評論 1 283
  • 正文 為了忘掉前任烈疚,我火速辦了婚禮,結果婚禮上聪轿,老公的妹妹穿的比我還像新娘爷肝。我一直安慰自己,他們只是感情好屹电,可當我...
    茶點故事閱讀 65,467評論 6 385
  • 文/花漫 我一把揭開白布阶剑。 她就那樣靜靜地躺著,像睡著了一般危号。 火紅的嫁衣襯著肌膚如雪牧愁。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,785評論 1 290
  • 那天外莲,我揣著相機與錄音猪半,去河邊找鬼兔朦。 笑死,一個胖子當著我的面吹牛磨确,可吹牛的內容都是我干的沽甥。 我是一名探鬼主播,決...
    沈念sama閱讀 38,931評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼乏奥,長吁一口氣:“原來是場噩夢啊……” “哼摆舟!你這毒婦竟也來了?” 一聲冷哼從身側響起邓了,我...
    開封第一講書人閱讀 37,696評論 0 266
  • 序言:老撾萬榮一對情侶失蹤恨诱,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后骗炉,有當地人在樹林里發(fā)現了一具尸體照宝,經...
    沈念sama閱讀 44,141評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,483評論 2 327
  • 正文 我和宋清朗相戀三年句葵,在試婚紗的時候發(fā)現自己被綠了厕鹃。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,625評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡乍丈,死狀恐怖剂碴,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情诗赌,我是刑警寧澤汗茄,帶...
    沈念sama閱讀 34,291評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站铭若,受9級特大地震影響洪碳,放射性物質發(fā)生泄漏。R本人自食惡果不足惜叼屠,卻給世界環(huán)境...
    茶點故事閱讀 39,892評論 3 312
  • 文/蒙蒙 一瞳腌、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧镜雨,春花似錦嫂侍、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至颓影,卻和暖如春各淀,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背诡挂。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工碎浇, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留临谱,地道東北人。 一個月前我還...
    沈念sama閱讀 46,324評論 2 360
  • 正文 我出身青樓奴璃,卻偏偏與公主長得像悉默,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子苟穆,可洞房花燭夜當晚...
    茶點故事閱讀 43,492評論 2 348

推薦閱讀更多精彩內容