You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Entry组件设置变量?tkinter打印PY_VAR而非输入值问题

解决Tkinter中Entry绑定StringVar后打印显示PY_VAR而非输入值的问题

嘿,我看你碰到了一个Tkinter里挺常见的小问题——点击按钮想打印用户输入的姓名,结果控制台输出的是PY_VARx这类标识,不是实际输入的内容。别担心,这事儿很好解决,咱们来一步步捋清楚:

问题根源

你现在传给save方法的是StringVar这个对象本身,而不是它存储的实际字符串。Tkinter的StringVar是个特殊的变量容器,直接打印它的话,只会输出它的内部标识(比如PY_VAR0),而不是里面存的用户输入内容。

两种修复方案

方案1:传递变量值而非变量对象

修改按钮的command参数,调用var1name.get()获取实际输入的字符串再传给save方法:

tk.Button(self, text="Set", command=lambda: master.save(var1name.get())).grid(row=9, column=1, sticky="E")

这样你的save方法收到的就是用户输入的姓名字符串,直接打印就能得到预期结果。

方案2:在save方法中获取变量值

如果想保持传递StringVar对象的方式,就在save方法里调用get()来取值:

def save(self,var1name):
    print(var1name.get())

这种方式适合后续还要对这个变量做其他操作的场景。

修复后的完整代码(以方案1为例)

import tkinter as tk
class TestApp(tk.Tk):
    def __init__(self):
        tk.Tk.__init__(self)
        self._frame = None
        self.geometry('400x500')
        self.switch_frame(StartPage)
    def switch_frame(self, frame_class):
        """Destroys current frame and replaces it with a new one."""
        new_frame = frame_class(self)
        if self._frame is not None:
            self._frame.destroy()
        self._frame = new_frame
        self._frame.grid()
    def save(self,var1name):
        print(var1name)
class StartPage(tk.Frame):
    def __init__(self, master):
        tk.Frame.__init__(self, master)
        var1name = tk.StringVar()
        #Entry of basic information
        tk.Label(self, text="Please enter setup").grid(row=0, column=1, sticky="W")
        tk.LabelFrame(self, text="labelframe").grid()
        tk.Label(self, text="Name: ").grid(row=1, column=0, sticky="W")
        tk.Entry(self,textvar=var1name).grid(row=1, column=2, sticky="W")
        # 修改为传递变量的实际值
        tk.Button(self, text="Set", command=lambda: master.save(var1name.get())).grid(row=9, column=1, sticky="E")
        #tk.Button(self, text="Next",
        #command=lambda: master.switch_frame(PageOne)).grid(row=9, column=2, sticky="E")
if __name__ == "__main__":
    app = TestApp()
    app.mainloop()

小提示

Tkinter的变量类(比如StringVar、IntVar)都需要通过get()获取内部值,用set()设置值,这是和普通Python变量不一样的地方,记住这个小细节就能避开不少类似的坑~

内容的提问来源于stack exchange,提问作者SpijkerBjorn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 07:59:07