【问题标题】:StringVar() / IntVar() not returning the valueStringVar() / IntVar() 不返回值
【发布时间】:2018-08-29 04:21:29
【问题描述】:

请看,我在这个主题上也提到过类似的相关答案

1) 在什么情况下,StringVar() / IntVar() 会分别返回空白 / 0 值?

2) 下面是我应用到我的应用程序中的一项功能的一小部分代码。请告诉我我的代码中缺少什么来检索预期的输出。

from tkinter import *

class App(Frame):
    def __init__(self,master):
        Frame.__init__(self,master)
        self.pack()
        Label(self,text="Choose timer options:").pack()
        self.delayvar = IntVar()
        self.delayradio1 = Radiobutton(self,text="Hours",variable=self.delayvar,value=1,command=self.delayfunc)
        self.delayradio1.pack()
        self.delayradio2 = Radiobutton(self,text="Minutes",variable=self.delayvar,value=2,command=self.delayfunc)
        self.delayradio2.pack()
        self.delayradio3 = Radiobutton(self,text="Seconds",variable=self.delayvar,value=3,command=self.delayfunc)
        self.delayradio3.pack()

    def delayfunc(self):
        self.delayvarvalue = self.delayvar.get()
        self.delayentryvar = StringVar()    # or IntVar()
        self.delayent = Entry(self,textvariable=self.delayentryvar)
        self.delayent.pack()
        if self.delayvarvalue == 1:
            Button(self,text="save delay",command=self.delayfunc1).pack()
        self.delayentry = self.delayent.get()   #self.delayentryvar.get()
        print(self.delayentry)

    def delayfunc1(self):
        self.delval = Text(self,height=1, width=10)
        self.delval.pack()
        self.delval.insert(END,self.delayentry)

if __name__ == '__main__' :
    root = Tk()
    App(root)
    root.title("Delay Timer")
    root.geometry("200x200")
    root.mainloop()

【问题讨论】:

  • 我不知道是什么问题。这个程序的哪一部分做了一些意想不到的事情?
  • Entry self.delayent 没有返回值,我将其存储在 self.delayentry 中,稍后我将使用它出现在文本字段中
  • 它正在返回正确的值。新创建的条目是空的,所以self.delayent.get() 当然会返回一个空字符串。这不像是你给了用户输入任何文本的机会,是吗?

标签: python python-3.x tkinter radio-button tkinter-entry


【解决方案1】:
  1. “在什么情况下,StringVar()/IntVar() 会分别返回空白/0 值?”

首先,通过返回,我必须假设您的意思是对它们返回 get 方法,因为如果不是,答案always 并且 never (它们总是返回 None 并且不等于 0 可能会有所不同,因为它们是各自类的理想对象,或者它们没有这样做,在这种情况下我会怀疑他们返回None

get 方法返回各自值的情况是相同的,它们要么从未设置''0 是它们的默认值)要么它们're 明确设置为默认值

  1. 下面是我应用到我的应用程序中的一项功能的一小部分代码。请告诉我我的代码中缺少什么来检索预期的输出。

对我来说,您的预期输出并不明显,但我可以指出一些看起来很麻烦的代码方面。

self.delayvar 完全按照应有的方式实例化并且工作正常,而:

self.delayentryvar 目前没有任何用处,它完全是多余的。这主要是因为Entry 对象已经有一个get 方法,其工作方式与StringVar 对象的方法完全相同,因此如果这是需要StringVar 的核心,那么它没有用 em>。

self.delayent.get()

和:

self.delayentryvar.get()

实际上与上面解释的相同,并且在 OP 提供的代码中将总是返回''。这是因为它们是 Entry 对象的 current 值的返回值,该对象几乎在不久前首次创建。 Entry 也不是 inserted 任何内容,因此它们返回 None''

添加:

self.delayent.insert('end', 'TEST')

delayfunc 之前的某处:

self.delayentry = self.delayent.get()   #self.delayentryvar.get()

更好地了解正在发生的事情。

【讨论】:

  • 了解您的观点。但是我在很多教程中看到他们在创建Entry之前明确创建了textvariable为什么会这样
  • @cs2612 我不知道他们为什么会这样做,也许看看我问过的这个问题:When to use Variable classes? (BooleanVar, DoubleVar, IntVar, StringVar)
  • @cs2612 他们这样做可能是为了防止在创建条目字段时出错。如果您在创建输入字段后定义了一个文本变量,那么您将收到类似于 NameError: name 'variable_name' is not defined 的错误
猜你喜欢
  • 2014-09-06
  • 2011-05-02
  • 1970-01-01
  • 1970-01-01
  • 2011-06-05
  • 2017-08-26
  • 2023-01-18
  • 2016-08-24
  • 2017-04-02
相关资源
最近更新 更多