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

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实例:
    self.word1 = StringVar()
    self.word2 = StringVar()
    
    再绑定到Entry的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:08:39