Python StringVar()/IntVar()不返回值

Python StringVar()/IntVar()不返回值,python,python-3.x,tkinter,radio-button,tkinter-entry,Python,Python 3.x,Tkinter,Radio Button,Tkinter Entry,请注意,我在这个问题上也提到了类似的相关答案 1) 在什么情况下,StringVar()/IntVar()将分别返回空的/0值 2) 下面是我应用于我的应用程序中的一个功能的小部分代码。请告诉我检索预期输出的代码中缺少了什么 from tkinter import * class App(Frame): def __init__(self,master): Frame.__init__(self,master) self.pack() L

请注意,我在这个问题上也提到了类似的相关答案

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()
  • “在什么情况下,
    StringVar()
    /
    IntVar()
    将分别返回空白/0值?”
  • 首先,通过返回,我必须假设您的意思是
    get
    方法对它们的返回,因为如果不是,答案总是和从不(它们总是返回
    None
    ,并且不等于
    0
    )可能会分别不同,因为它们是各自类的理想对象,或者他们没有这样做,在这种情况下,我怀疑他们返回
    None

    两个
    get
    方法返回各自值的情况相同,它们要么从未被设置(
    '
    0
    是它们的默认值),要么被显式设置为默认值

  • 下面是我应用于我的应用程序中的一个功能的小部分代码。请告诉我检索预期输出的代码中缺少了什么
  • 我不清楚您期望的输出是什么,但我可以指出代码中一些看起来很麻烦的方面

    self.delayvar
    按其应有的方式进行实例化,并且工作正常,然而:

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

    以及:

    实际上与上面解释的内容相同,在代码中,OP始终返回
    '
    。这是因为它们是几乎在一瞬间之前首次创建的
    条目
    对象的当前值的返回。条目也没有插入任何内容,因此它们返回
    None
    '

    加:

    在之前的某个地方的内部
    delayfunc

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

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

    我不知道问题出在哪里。此程序的哪个部分发生意外?Entry
    self.delayent
    未返回值,我将其存储在
    self.delayentry
    中,稍后我将使用它显示在文本字段中,它返回的是正确的值。新创建的条目是空的,因此当然
    self.delayent.get()
    返回一个空字符串。你并没有给用户一个输入任何文本的机会,是吗?理解你的观点。但我在许多教程中看到,他们在创建
    条目之前显式创建
    textvariable
    ,这是为什么so@cs2612我不知道他们为什么会这样做,也许看看我问的这个问题:@cs2612他们这样做可能是为了防止在创建输入字段时出错。如果在创建输入字段后定义了一个文本变量,则会出现如下错误:
    NameError:name“variable\u name”未定义
    self.delayentryvar.get()
    
    self.delayent.insert('end', 'TEST')
    
    self.delayentry = self.delayent.get()   #self.delayentryvar.get()