【Tkinter】终于把StringVar讲明白了

简介

初学者在使用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表达式,用于更改点击后的按钮内容。

效果如下

【Tkinter】终于把StringVar讲明白了

Label使用StringVar

在最初的案例中,点击按钮让Label的颜色发生了变化,之所以选择这样的操作逻辑,正是因为Labeltext并不能直接更改,但是在讲解完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()

效果如下

【Tkinter】终于把StringVar讲明白了

Entry输入

Tkinter中,Label并不是输入框,而只是个展现的标签,一般来说是不需要更改其内容的。而支持输入操作的控件是Entry,其常规的内容变更方式需要通过deleteset来完成

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位置插入。效果如下

【Tkinter】终于把StringVar讲明白了

这个操作也可以用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相当于是一对对偶函数。

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
心中带点小风骚的头像心中带点小风骚普通用户
上一篇 2023年3月29日
下一篇 2023年3月29日

相关推荐