Python之tkinter 變量類別

一、變量類別的基本簡介

有些控件在執行時會更改內容,例如,文本框(Entry),選項按鈕(Radio button)等,選項按鈕就是選擇按鈕,多選單選啥的

有些控件我們可以更改他們的內容,例如標籤(Label)等,如果想要更改他們的內容,可以使用這些控件的參數,例如,textvariablevariableonvalue

不過要將控件的參數以變量方式處理時,需要藉助tkinter模塊內的變量類別(Variable Classes)。

這個類別有4個子類別,每一個類別其實就是一個數據類型的構造方法,我們可以通過這4個子類別的數據類型將他們與控件相關的參數結合

  • x = IntVar():整型變量,默認是0
  • x = DoubleVar():浮點型變量,默認是0.0
  • x = StringVar():字符串變量,默認是""
  • x = BooleanVar():布爾型變量,True是1,False是0

二、set() 方法

使用set()方法設置變量內容

import tkinter

# 控制顯示的開關
msg = False
def click():
    # 改變變量
    global msg
    if msg ==False:
        msg = True
        # 設置文字
        x.set("Python!!!")
    else:
        msg = False
        # 設置空
        x.set("")

root = tkinter.Tk()
x = tkinter.StringVar()
# textvariable 是可變的,會跟隨字符串變而自動變內容
label = tkinter.Label(root, textvariable=x, bg="lightyellow", fg="red", font="Verdana 18 bold", width=25, height=2)
label.pack()

button = tkinter.Button(root, text="請點擊", command=click)
button.pack()

root.mainloop()

運行結果:
在這裏插入圖片描述

三、get() 方法

使用get()方法取得變量內容

我們可以用get()方法改良這個小程序

import tkinter

def click():
    if x.get() == "":
        x.set("Python!!!")
    else:
        x.set("")

root = tkinter.Tk()
x = tkinter.StringVar()
# textvariable 是可變的,會跟隨字符串變而自動變內容
label = tkinter.Label(root, textvariable=x, bg="lightyellow", fg="red", font="Verdana 18 bold", width=15, height=2)
label.pack()

button = tkinter.Button(root, text="請點擊", command=click)
button.pack()

root.mainloop()

運行結果:
在這裏插入圖片描述

四、追蹤trace() 使用模式 w

我們可以利用變量設置追蹤Widget控件,當其內容發生改變時,讓程序自動執行函數

例子

import tkinter

# 這裏必須要加入*args,具體下面細說
def show(*args):
    print("數據:", string.get())

root = tkinter.Tk()
string = tkinter.StringVar()
entry = tkinter.Entry(root, textvariable=string)
entry.pack(padx=5, pady=10)
string.trace("w", show)

root.mainloop()

運行結果:
在這裏插入圖片描述
string.trace("w", show)

  • 第一個參數是模式,w代表當有執行寫入時,就自動去執行show函數
  • 也可以自行取函數名稱,這個動作稱爲變動追蹤

我們可以運用set和get方法使我們在窗口內實現同步顯示

例子

import tkinter

def show(*args):
    stringLabel.set(stringEntry.get())
    print("數據:", stringEntry.get())

root = tkinter.Tk()
stringEntry = tkinter.StringVar()
entry = tkinter.Entry(root, textvariable=stringEntry)
entry.pack(padx=5, pady=10)
stringEntry.trace("w", show)

stringLabel = tkinter.StringVar()
label = tkinter.Label(root, textvariable=stringLabel)
stringLabel.set("同步顯示")
label.pack(padx=5, pady=10)


root.mainloop()

運行結果:
在這裏插入圖片描述

五、追蹤trace() 使用模式 r

我們也可以設計當控件內容被讀取時,執行追蹤並執行特定函數

例子

import tkinter

def show(*args):
    Tr.set(Tw.get())

def getting(*args):
    print("警告!!正在被讀取數據")

def hit():
    print("數據爲:", Tw.get())

root = tkinter.Tk()
Tw = tkinter.StringVar()
entry = tkinter.Entry(root, textvariable=Tw)
entry.pack(padx=5, pady=10)
Tw.trace("w", show)
Tw.trace("r", getting)

Tr = tkinter.StringVar()
label = tkinter.Label(root, textvariable=Tr)
Tr.set("同步顯示")
label.pack(padx=5, pady=10)

button = tkinter.Button(root, text="點擊讀取", command=hit)
button.pack(padx=5, pady=10)

root.mainloop()

運行結果:
在這裏插入圖片描述

Tw.trace("r", getting)

  • 第一個參數是模式,r代表當有執行讀取時,就自動去執行getting函數
  • 也可以自行取函數名稱,這個動作稱爲讀取追蹤

六、trace() 方法調用的方法參數

def show(*args):

*args其實是傳遞三個參數,分別是tk變量名稱index索引mode模式

不過目前有關於tk變量名稱index索引部分尚未完成實際支持,第三個參數則可以列出是r還是w模式

由於我們所設計的程序並不需要傳遞參數,所以可以直接用*args當做參數內容

例子

import tkinter

def show(name, index, mode):
    stringLabel.set(stringEntry.get())
    print("name = %r, index = %r, mode = %r" % (name, index, mode))

root = tkinter.Tk()
stringEntry = tkinter.StringVar()
entry = tkinter.Entry(root, textvariable=stringEntry)
entry.pack(padx=5, pady=10)
stringEntry.trace("w", show)

stringLabel = tkinter.StringVar()
label = tkinter.Label(root, textvariable=stringLabel)
stringLabel.set("同步顯示")
label.pack(padx=5, pady=10)


root.mainloop()

運行結果:
在這裏插入圖片描述
這裏解釋一下

%r

%s是將變量傳到str()函數中,結果是將變量轉化適合人閱讀的格式

%r是將變量穿到repr()函數中,結果是將變量轉化成適合機器閱讀的格式,可以將%r後的變量理解爲一個對象

謝謝觀看,筆者會持續更新,如有錯誤或者建議,請私信我

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章