【问题标题】:Python Tkinter StringVar only displaying Py_Var(number)Python Tkinter StringVar 仅显示 Py_Var(number)
【发布时间】:2016-08-10 05:34:42
【问题描述】:

我在 python 3.4 中使用 Tkinter 制作基于文本的游戏,但我不知道如何从 Entry 小部件中获取字符串,它只返回 Py_Var#,# 是一个数字。我看过类似问题的答案,但没有一个完全符合我的需要和拥有的。以下是相关代码:

from tkinter import * 

win = Tk() 
win.geometry("787x600")

playername = StringVar()

def SubmitName():
    playername.get
    #messagebox.showinfo("Success", playername)
    print(playername)

frame3 = Frame(win) 
frame3.pack()
label1 = Label(frame3, text="You awaken in a room, with no memories of yourself or your past. ")

label2 = Label(frame3, text="First, how about you give yourself a name:")

label1.config(font=("Courier", 11)) 
label2.config(font=("Courier", 11))

entry1 = Entry(frame3, textvariable=playername) 
entry1.config(font=("Courier", 11))

label1.grid(row=0, column=0, columnspan=3) 
label2.grid(row=1, column=0)

entry1.grid(row=1, column=1)

bnamesub= Button(frame3, text="Submit", command=lambda: SubmitName()) 
bnamesub.grid()

win.mainloop()

另外,第一次使用 stackoverflow,它的阅读方式很奇怪,但是 w/e。

【问题讨论】:

    标签: python tkinter tkinter-entry


    【解决方案1】:

    SubmitName() 有两个错误。

    首先,你需要得到这样的文本:

    txt = playername.get()
    

    那你需要打印那个txt:

    print(txt)
    

    您错误地打印了 StringVar 变量本身。

    【讨论】:

      【解决方案2】:
      from tkinter import *
      import pickle
      
      win = Tk()
      win.geometry("787x600")
      
      def SubmitName():
              playername = entry1.get()
              messagebox.showinfo("Success", playername)
              print(playername)
      
      frame3 = Frame(win)
      frame3.grid()
      label1 = Label(frame3, text="You awaken in a room, with no memories of yourself or your past. ")
      
      label2 = Label(frame3, text="First, how about you give yourself a name:")
      
      label1.config(font=("Courier", 11))
      label2.config(font=("Courier", 11))
      
      #name entered is a StringVar, returns as Py_Var7, but I need it to return the   name typed into entry1.
      entry1 = Entry(frame3)
      entry1.config(font=("Courier", 11))
      
      label1.grid(row=0, column=0, columnspan=3)
      label2.grid(row=1, column=0)
      
      entry1.grid(row=1, column=1)
      
      bnamesub= Button(frame3, text="Submit", command=lambda: SubmitName())
      bnamesub.grid()
      

      我改变了什么:
      -删除playername = StringVar()。我们真的不需要它;
      - 函数内部更改:将playername.get更改为playername = entry1.get()
      -添加frame3.grid()(没有几何管理,小部件无法在屏幕上显示。);
      - 还有一点编辑:在 Python 中,cmets 是用 # 符号创建的。所以我把*改成了#

      【讨论】:

      • 哇哦!谢谢Parviz,明白了。无论我走到哪里,答案都略有不同,彼此不一致,非常感谢。
      【解决方案3】:

      我很高兴在这里找到解决方案,但所有这些“原样”的答案都不适用于我的设置,python3.8,pycharm 2018.2 因此,如果有人可以回答这个问题,似乎 entry1.get() 不能用作字符串。我首先想将它附加到一个列表中,我做了一个更简单的版本来指出问题:

      from tkinter import *
      import pickle
      
      win = Tk()
      win.geometry("300x300")
      #playername = StringVar()
      
      def SubmitName():
          labell = Label(win, text="Little tryup").grid()
          playername = entry1.get()
          # result about line 11: 'NoneType' object has no attribute 'get'
          labelle = Label(win, text=playername).grid()
      #    print(txt)
      
      label1 = Label(win, text="Enter a name:").grid()
      entry1 = Entry(win).grid()
      boutonne = Button(win, text="label-it!", command=lambda: SubmitName())
      boutonne.grid()
      win.mainloop()
      

      【讨论】:

        猜你喜欢
        • 2020-04-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-09
        • 1970-01-01
        相关资源
        最近更新 更多