草庐IT

【Tkinter】终于把StringVar讲明白了

微小冷 2023-10-25 原文

文章目录


Tkinter系列:

简介

初学者在使用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的颜色发生了变化,之所以选择这样的操作逻辑,正是因为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()

效果如下

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

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

有关【Tkinter】终于把StringVar讲明白了的更多相关文章

  1. 在Windows上安装TkInter:完整教程 - 2

    在Windows上安装TkInter:完整教程如果你正在寻找一种可在Windows上使用的GUI库,那么TkInter是一个非常好的选择。但是,如果你手头的资源中没有TkInter,则你需要使用下面步骤进行安装。以下是在Windows上安装TkInter的完整教程。步骤1:安装Python要在Windows上开始使用TkInter,你需要先安装Python。打开Python官方网站,并下载最新版本的Python3。安装时,请务必选择添加Python3PATH变量选项。步骤2:检查是否已安装Tcl/TkTkInter是Tcl/Tk之上的一个封装,所以在安装TkInter之前,你需要检查你的系统上

  2. javascript - 就在我认为我终于理解了 Javascript 作用域的时候 - 2

    我遇到了一些事情,这说明我显然还不明白。谁能解释一下为什么“this”的值会在下面发生变化?varMyFunc=function(){alert(this);varinnerFunc=function(){alert(this);}innerFunc();};newMyFunc(); 最佳答案 在JavaScript中,this表示函数被调用的上下文对象,而不是它被定义的范围(或它被调用的范围).对于MyFunc,this引用正在创建的新对象;但是对于innerFunc,它引用全局对象,因为调用innerFunc时没有指定上下文。这

  3. 历时两天,我终于在TensorFlow里面调用起来了gpu - 2

    新买的笔记本怎么配置TensorFlow-gpu新买的笔记本怎么配置TensorFlow-gpu为了更好地学习深度学习,我今年斥重金买了一台联想-拯救者-R9000,除了P9000之外,这台电脑的配置应该算是笔记本当中的天花板了。但是买来半个月,一直在修改自己的论文,所以除了新的鼠标灵敏度高,打开word不卡之外,也没有体验到天花板有多香。这几天论文改的差不多了,心中又燃起了对深度学习的浴火(主要是想看看这个天花板的性能有没有外界说的那么神)。结果!结果!家人们,咱就是说,吊起来了,内心雀跃之余,得给广大网友分享这份喜悦。具体的心路历程和配置步骤如下:判断自己的电脑适不适合安装TensorFl

  4. javascript - 青鸟的 promise ——然后终于 - 2

    我在Bluebird/Promises中遇到了一些问题。对于Promise1,无论是调用fullfill还是reject,一切都正常。然而,当我们在finallyblock中返回Promise2时,它仅适用于reject和fullfil,我们在then的回调中得到undefined。functiongetPromise1(){returnnewPromise(function(fulfill,reject){fulfill("OK1");});}functiongetPromise2(){returnnewPromise(function(fulfill,reject){fulfill

  5. go - 为什么我不能使用 flag.StringVar 将指针传递给 fmt.Println? - 2

    我已经开始研究Golang,并按照一个示例来传递命令行参数,我得到了以下代码:packagemainimport("flag""fmt")funcmain(){wordPtr:=flag.String("namestring","stringvalue","Passinastring")numPtr:=flag.Int("number",11,"Passinanint")boolPtr:=flag.Bool("switchflag",false,"Passinabool")varsvarstringflag.StringVar(&svar,"svar","svarstringvalue

  6. python - 如何在 Tkinter/Python2.7.3 中使用 Windows 资源管理器或 Finder 文件对话框? - 2

    除其他外,我目前正在尝试创建一个基本的文本编辑器,它可以打开文本文件,编辑它们,然后保存它们。我用过thisGUI“文件管理器”的Tkinter对话,但我想知道是否有人知道访问Windows上默认的那个的方法?谢谢!技术方面的事情:操作系统:Windows7语言:Python2.7.3编辑1默认文件对话框是指Windows资源管理器对话框:我也用mac。假设我的应用程序是跨平台的,我是否可以通过任何方式让程序检查操作系统是什么,然后打开Finder或WindowsExplorer。我需要程序能够在不同命令中保存和打开项目。我该怎么做? 最佳答案

  7. windows - 显示窗口后如何从 Tkinter 中删除 Canvas - 2

    我想在Tkinter中创建一行,并且在更改高度后我需要删除上一行并使用新高度创建一个新行,这是一个重复的过程。为此,我阅读了python的Tkinter教程,我认为After方法可能会有用。所以,我写了我的想法,但这不是一个好方法,我无法创造它。另外,我在Tkinter中搜索了一个Shown事件,但我没有在窗口的Tkinter中找到Shown事件。这是我建议的代码:fromtkinterimport*fromtkinterimportmessageboximportnumpyasnpimportrandomwindow=Tk()window.geometry("600x400+650+

  8. python - 如何在 Tkinter 中制作非方形边缘? - 2

    为了使我的一个程序更美观,我使用图像来创建边框,但是我想创建一个非方形边框,所以程序看起来有点像这样___________///__________/我该怎么办?这是在Windows7上,顺便说一句。编辑:A尝试使用透明度制作伪边,但结果不是透明的。出于某种原因,它呈现为深灰色。我希望红色成为“边缘”。 最佳答案 您追求的概念称为“形状窗口”。使用您最喜欢的搜索引擎搜索“tk形窗口”。有一个tk扩展声称支持这一点,但我还没有亲自尝试过。我想因为它与tcl/tk一起工作,所以它可以与Tkinter一起工作,因为Tkinter在幕后使用

  9. python - 使用 tkinter 获取命令窗口输出以显示在小部件中 - 2

    快速项目总结:使用Tkinter制作一个python小部件,显示来自多个json和txt文件的数据。需要在Windows中工作。我在哪里:json文件一切顺利。但是我遇到了txt文件的问题。我可以使用以下代码从必要的文件中解析出我需要的信息:fromTkinterimport*importreresults=open("sample_results.txt","r")forlineinresults:ifre.match("(.*)test(.*)",line):printlineifre.match("(.*)number(.*)",line):printlineifre.match

  10. python - 动态 tkinter 输入框 - 2

    我想知道这是否可能...?想象一个带有用于输入PC名称的输入框小部件的tkinter应用程序。一旦用户开始在框中键入内容,该应用程序就会根据您键入的内容显示可能的名称,因此您键入的内容越多,您看到的选项就越少,直到您只剩下一个或足够小的选项来单击从可用选项中选择它。如果这在tkinter中是可能的,如果有人能给我指出一个简单示例的方向,那就太好了!我不能发布任何示例代码,因为这是一个一般性问题而不是特定问题。 最佳答案 您可以将StringVar的实例与条目小部件相关联,然后在该实例上放置跟踪以在值更改时调用回调。然后,您可以在该回

随机推荐