如何用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
相关产品推荐
相关产品推荐

