天天看點

tkinter: 變量類别

基本概念

有些Widget控件在執行時會更改内容: 文本框(Entry)、選項按鈕(Radio button)等。

有些控件我們可以更改它們的内容: 标簽(Label)等。

如果想要更改它們的内容可以使用這些控件的參數,例如,textvariable、variable、onvalue等。

不過要将Widget控件的參數以變量方式處理時,需要借助tkinter子產品内的變量類别(Variable Classes)

這個類别有4個子類别,每一個類别其實是一個資料類型的構造方法,可以通過這4個子類别的資料類型将它們與Widget控件的相關參數結合。

  • x = IntVar() 整型,預設0
  • x=DoubleVar(),浮點型,預設0.0
  • x=StringVar(), 字元串型,預設""
  • x=BooleanVar(), 布爾類型,True是1, False是0
get()和set()

可以使用get( )方法取得變量内容,使用set( )方法設定變量内容。

例子: 單擊hit按鈕可以顯示内容,再次單擊隐藏内容

from tkinter import *

def btn_hit():
    if x.get() == "":
        msg_on = True
        x.set("wkk")
    else:
        x.set("")

root = Tk()
root.title("demo")

x = StringVar()
label = Label(root,textvariable=x,width=25,height=2)
label.pack()

btn = Button(root,text="hit",command=btn_hit)
btn.pack()

root.mainloop()      
追蹤trace()

模式w

可以利用變量設定追蹤Widget控件,當其内容更改時,讓程式執行callback函數

例子: 當Entry内容改變時,在視窗輸出"wkk"

from tkinter import *

def callback(*args):
    print("wkk")

root = Tk()
root.title("demo")

xE= StringVar()
entry = Entry(root,textvariable=xE)
entry.pack(pady=5,padx=10)
xE.trace("w",callback)  # 有改變則執行callback      

模式:

  • w 執行寫入時,自動執行回調函數

模式r

當控件内容被讀取時,執行追蹤并執行特定函數

例子: 在Entry中輸入資料時,Label同步顯示,如果單擊了讀取按鈕,系統将發出資料被讀取的警告

from tkinter import *
def callbackW(*args):
    xL.set(xE.get()) # 同步顯示

def callbackR(*args):
    print("Warnning:資料被讀取")

def hit():
    print("讀取資料:",xE.get())

root = Tk()
root.title("demo")

xE= StringVar()
entry = Entry(root,textvariable=xE)
entry.pack(padx = 10,pady = 5)
xE.trace("w",callbackW)
xE.trace("r",callbackR)

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

btn = Button(root,text="hit",command=hit)
btn.pack(pady= 5)
root.mainloop()      

模式:

  • r當執行讀取時,自動執行回調函數

callback方法參數

def callbackW(*args):      

實際上是傳遞三個參數,分别是tk變量名稱、index索引、mode模式。

目前有關tk變量名稱和index索引部分尚未完成實際支援

第三個參數可以列出是r或w模式

由于所設計的程式并不需要傳遞參數,是以可以直接用“*args”當作參數内容

例子: 列出trace() 方法所調用的callback() 方法的參數

from tkinter import *
def callbackW(name,index,mode):
    xL.set(xE.get())
    print("name,index,mode = " + name +","+str(index)+","+ mode )

root = Tk()
root.title("demo")

xE = StringVar()
xL = StringVar()

entry = Entry(root,textvariable=xE)
entry.pack(padx=10,pady=5)

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

xE.trace("w",callbackW)

root.mainloop()      
demo - 簡易電腦
from tkinter import *

def calculate():
    result = eval(equ.get())
    equ.set(equ.get() + "=\n" + str(result))

def show(buttonString):
    content = equ.get()
    if content == "0":
        content = ""
    equ.set(content + buttonString)

def backspace():
    content = equ.get()
    if len(content) == 1:
        content = "0"
    else:
        content = content[:-1]
    equ.set(content)

def clear():
    equ.set("0")

root = Tk()
root.title("calc")

equ = StringVar()
equ.set("0")

#設計控件
label = Label(root,width = 25, height = 2, relief="raised",anchor = SE,textvariable = equ)
label.grid(row=0,column = 0,columnspan = 4,padx = 5,pady = 5)
# 清除按鈕
clearBtn = Button(root,text="cls",fg = "blue",width = 5, command = clear)
clearBtn.grid(row = 1, column = 0)
#其他按鍵
Button(root,text="DEL",width = 5, command=backspace).grid(row=1,column= 1)
Button(root,text="%",width = 5, command=lambda: show("%")).grid(row=1,column= 2)
Button(root,text="/",width = 5, command=lambda: show("/")).grid(row=1,column= 3)

Button(root,text="7",width = 5, command=lambda: show("7")).grid(row=2,column= 0)
Button(root,text="8",width = 5, command=lambda: show("8")).grid(row=2,column= 1)
Button(root,text="9",width = 5, command=lambda: show("9")).grid(row=2,column= 2)
Button(root,text="*",width = 5, command=lambda: show("*")).grid(row=2,column= 3)

Button(root,text="4",width = 5, command=lambda: show("4")).grid(row=3,column= 0)
Button(root,text="5",width = 5, command=lambda: show("5")).grid(row=3,column= 1)
Button(root,text="6",width = 5, command=lambda: show("6")).grid(row=3,column= 2)
Button(root,text="-",width = 5, command=lambda: show("-")).grid(row=3,column= 3)

Button(root,text="1",width = 5, command=lambda: show("1")).grid(row=4,column= 0)
Button(root,text="2",width = 5, command=lambda: show("2")).grid(row=4,column= 1)
Button(root,text="3",width = 5, command=lambda: show("3")).grid(row=4,column= 2)
Button(root,text="+",width = 5, command=lambda: show("+")).grid(row=4,column= 3)

Button(root,text="0",width = 5, command=lambda: show("0")).grid(row=5,column= 0,columnspan = 2)
Button(root,text=".",width = 5, command=lambda: show(".")).grid(row=5,column= 2)
Button(root,text="=",width = 5, command=calculate).grid(row=5,column= 3)

root.mainloop()      

繼續閱讀