Python 編程之Tkinter的使用02

Tkinter.png

  • 原文博客地址: Python編程之Tkinter的使用02
  • TkinterPython的標準GUI庫。Python使用 Tkinter能夠快速的建立GUI應用程序。
  • 因爲Tkinter是內置到python的安裝包中、只要安裝好Python以後就能import Tkinter庫、並且IDLE也是用Tkinter編寫而成、對於簡單的圖形界面Tkinter仍是能應付自如
  • 上一篇文章介紹了Tkinter模塊和Button, Label等部分控件
  • 這裏主要介紹Listbox, Scale, Menu, Frame等部分控件的使用
  • GitHub代碼示例目地址

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, 則函數只對參數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文本的多行顯示, 這裏就須要添加滾動條git

效果圖以下github

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
複製代碼

效果圖以下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()
複製代碼

效果圖以下函數

Spinbox控件.png

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)

複製代碼

效果圖以下

Menu頂層菜單.png

tearoff屬性介紹

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

效果圖以下

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就是屏幕上的一塊矩形區域,可能是用來做爲容器(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涉及到的數據類型和佈局方式
  • 以及鼠標的點按事件和一些特殊的事件操做
  • 未完待續.............
相關文章
相關標籤/搜索