文章目录
- 简介
- Label使用StringVar
- Entry输入
简介
初学者在使用tkinter
时常犯的一个错误就是
def changeText(evt):
evt.text = "new Text"
毕竟在创建控件时,text
是出现频率很高的参数,换言之,我们会默认控件中有text
这个属性,而且这个属性的数据类型是字符串,而且是可以更改的。
然而,这个直觉是错误的,tkinter
并没有把text
这个属性暴露出来。为了应付对控件的文字内容实时更改的需求,tkinter
提供了StringVar
这种字符串变量。
import tkinter as tk
root = tk.Tk()
dyTxt = tk.StringVar()
dyTxt.set("点我")
btn = tk.Button(root, width=40, height=10,
textvariable=dyTxt,
command = lambda: dyTxt.set("啊我被点了"))
btn.pack()
root.mainloop()
其中,dyTxt
为可变化的字符串,dyTxt.set
即设置字符串内容,textvariable
为按钮显示的内容,这个内容是可更改的;command
是点击后调用的函数,由于比较简单,这里用了一个lmabda
表达式,用于更改点击后的按钮内容。
效果如下
Label使用StringVar
在最初的案例中,点击按钮让Label
的颜色发生了变化,之所以选择这样的操作逻辑,正是因为Label
的text
并不能直接更改,但是在讲解完StringVar
之后,一切就顺理成章了
root = tk.Tk()
root.geometry("400x150")
txt = tk.StringVar()
txt.set("Label")
label = tk.Label(root,textvariable=txt)
label.grid(row=0,column=0) #这是一种网格布局方式
def btn_click():
txt.set("我变了")
btn = tk.Button(root,text="Button",command=btn_click)
btn.grid(row=0,column=1)
root.mainloop()
效果如下
Entry输入
在Tkinter
中,Label
并不是输入框,而只是个展现的标签,一般来说是不需要更改其内容的。而支持输入操作的控件是Entry
,其常规的内容变更方式需要通过delete
和set
来完成
root = tk.Tk()
root.geometry("400x150")
entry = tk.Entry(root)
entry.grid(row=0,column=0)
def btn_click():
entry.delete(0, "end")
entry.insert(0, "最开始的模样")
btn = tk.Button(root,text="Button",command=btn_click)
btn.grid(row=0,column=1)
root.mainloop()
其中,delete(0, "end")
表示将内容从0删除到最后;insert(0, xxx)
表示将xxx
从0位置插入。效果如下
这个操作也可以用textvariable
参数来替代,效果和上面相同,代码如下
root = tk.Tk()
root.geometry("400x150")
txt = tk.StringVar()
entry = tk.Entry(root,textvariable=txt)
entry.grid(row=0,column=0) #这是一种网格布局方式
def btn_click():
print(txt.get())
txt.set("最开始的模样")
btn = tk.Button(root,text="Button",command=btn_click)
btn.grid(row=0,column=1)
root.mainloop()
其中txt.get()
可以获取StringVar
当前的内容,与set
相当于是一对对偶函数。