Tkinter中使用.get()获取StringVar值却显示PY_VAR0的问题
解决Tkinter中StringVar显示PY_VAR0且.get()无效的问题
嘿,我看到你在Tkinter的Two_players类里遇到了几个关键问题,导致没法正确获取和显示player1的输入值。咱们一步步拆解并修复这些问题:
核心问题及修复步骤
1. Entry组件绑定StringVar的参数错误
你在创建Entry时用了text=self.player1,但Tkinter里要把输入框和StringVar双向绑定,必须用**textvariable**参数,而不是text。text只是设置静态文本,不会同步输入内容到变量里,所以你的self.player1始终是空的,自然.get()拿不到值。
错误代码:
self.entry_1 = Entry(self.window1,text=self.player1).place(x=170, y=153)
修复后:
self.entry_1 = Entry(self.window1, textvariable=self.player1) self.entry_1.place(x=170, y=153)
另外注意:把布局方法(place/pack/grid)单独调用,因为这些方法返回的是None,如果写在一行,self.entry_1会变成None,后续操作输入框就会出错。
2. 直接显示StringVar对象而非其值
在two_players_words方法里,你直接把self.player1传给Label的text参数,这会显示StringVar对象的默认字符串标识(也就是你看到的PY_VAR0),必须调用.get()方法来获取它存储的实际输入值:
错误代码:
label_21=Label(window1,text=self.player1, font=("arial",12,"bold")).place(x=80,y=150)
修复后:
label_21=Label(window1, text=self.player1.get(), font=("arial",12,"bold")) label_21.place(x=80,y=150)
3. 新窗口应该用Toplevel而非Tk()
在two_players_words里你又创建了一个Tk()实例,这会启动第二个Tkinter主循环,可能导致变量上下文混乱。正确的做法是用Toplevel()创建子窗口,它会依附于已有的主窗口:
错误代码:
window1=Tk()
修复后:
window1=Toplevel(self.window1)
4. 字符串格式化错误及未定义变量
label_22的文本里用了{player2},但没有正确引用self.player2的值,应该用f-string结合.get():label_22=Label(window1, text=f"{self.player2.get()} : ", font=("arial",12,"bold")) label_22.place(x=80,y=180)word1和word2没有定义,需要先创建对应的StringVar实例:
再绑定到Entry的self.word1 = StringVar() self.word2 = StringVar()textvariable参数上。
完整修正后的代码
from tkinter import Tk, Label, Entry, Button, StringVar, Toplevel class Two_players(): def __init__(self): self.player1 = StringVar() self.player2 = StringVar() self.window1 = Tk() self.window1.title("Spieler Eingabe") self.window1.geometry("500x600") # 拆分布局方法,避免变量被赋值为None self.label_01 = Label(self.window1, text="Spieler eingabe", width=25, relief="solid", font=("arial",12,"bold")) self.label_01.pack() self.label_03 = Label(self.window1, text="Spieler 1 : ", font=("arial",12,"bold")) self.label_03.place(x=80,y=150) self.entry_1 = Entry(self.window1, textvariable=self.player1) self.entry_1.place(x=170, y=153) self.label_04 = Label(self.window1, text="Spieler 2 : ", font=("arial",12,"bold")) self.label_04.place(x=80,y=180) self.entry_2 = Entry(self.window1, textvariable=self.player2) self.entry_2.place(x=170, y=183) self.but_01 = Button(self.window1, text="wörter eingeben", width=15, bg="black", fg="green", command=self.two_players_words) self.but_01.place(x=200,y=500) self.window1.mainloop() # 启动GUI主循环 def two_players_words(self): window1 = Toplevel(self.window1) # 使用Toplevel创建子窗口 window1.title("Wörter Eingabe") window1.geometry("500x600") label_20 = Label(window1, text="Wörter eingabe", width=25, relief="solid", font=("arial",12,"bold")) label_20.pack() # 获取player1的实际值显示 label_21 = Label(window1, text=self.player1.get(), font=("arial",12,"bold")) label_21.place(x=80,y=150) # 定义word1和word2变量 self.word1 = StringVar() entry_15 = Entry(window1, textvar=self.word1) entry_15.place(x=170, y=153) # 正确格式化player2的文本 label_22 = Label(window1, text=f"{self.player2.get()} : ", font=("arial",12,"bold")) label_22.place(x=80,y=180) self.word2 = StringVar() entry_16 = Entry(window1, textvar=self.word2) entry_16.place(x=170, y=183) # 实例化类启动程序 if __name__ == "__main__": app = Two_players()
额外说明
- 我补充了完整的Tkinter组件导入语句,避免出现未定义错误。
- 主窗口添加了
mainloop(),这是启动GUI循环的必要步骤,你原来的代码里漏掉了。 - 按钮的
command可以直接用self.two_players_words,不需要lambda(除非需要传参数,这里不需要)。
内容的提问来源于stack exchange,提问作者mct
相关产品推荐
相关产品推荐

