一、變量類別的基本簡介
有些控件在執行時
會更改內容,例如,文本框(Entry),選項按鈕(Radio button)等,選項按鈕就是選擇按鈕,多選單選啥的
有些控件我們可以更改他們的內容,例如標籤(Label)等,如果想要更改他們的內容,可以使用這些控件的參數,例如,textvariable
、variable
、onvalue
等
不過要將控件的參數以變量方式處理時,需要藉助tkinter模塊
內的變量類別
(Variable Classes)。
這個類別有4個子類別,每一個類別其實就是一個數據類型的構造方法,我們可以通過這4個子類別的數據類型將他們與控件相關的參數結合
- x =
Int
Var():整型
變量,默認是0 - x =
Double
Var():浮點型
變量,默認是0.0 - x =
String
Var():字符串
變量,默認是"" - x =
Boolean
Var():布爾型
變量,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後的變量理解爲一個對象
謝謝觀看,筆者會持續更新,如有錯誤或者建議,請私信我