【问题标题】:'NoneType' Issues with tkinter [duplicate]tkinter 的“NoneType”问题[重复]
【发布时间】:2016-02-07 01:50:20
【问题描述】:

所以我正在尝试编写一些代码,它接受两个用户输入的值,比较它们,然后告诉用户他/她是否输入了正确的值。 (USL 应该大于 LSL,非常简单的标准)在这里你可以看到我是如何从用户那里获取条目的

    # get USL and LSL
    Label(self, text = "USL").grid(row = 5, column = 0, sticky = W, padx=5, pady=5)        
    self.e6 = Entry(self).grid(row = 5, column = 1)    
    Label(self, text = "LSL").grid(row = 6, column = 0, sticky = W, padx=5, pady=5)       
    self.e7 = Entry(self).grid(row = 6, column = 1)

下一段代码是我检查代码的地方

    # button to check USL is higher than LSL
    self.button = Button(self)
    self.button["text"] = "Check USL and LSL"
    self.button["command"] = self.check_limits
    self.button.grid(row = 6, column = 2, sticky = W, padx=5, pady=5)

最后这里是我定义 check_limits 函数的地方

    def check_limits(self):

    e6 = int(self.e6)
    e7 = int(self.e7)

    if e6 > e7:
        message = "Limits are good"
    else:
        message = "USL can't be less than LSL, please re-enter USL and LSL"

    self.text.delete(0.0, END)
    self.text.insert(0.0, message)

目前我将变量 e6 和 e7 强制为整数,但是当我这样做时,我收到一条错误消息,指出 int() 参数必须是字符串或数字,而不是“NoneType”。在这种情况下,为什么将它们定义为 null 而不是整数?

或者,如果我不强制它们为整数,那么我总是得到“USL 不能小于...”,无论 e6 是大​​于还是小于 e7。为什么会这样,我该如何解决?

如果这个问题的上下文需要任何其他代码,这是我的整个代码

from Tkinter import *
class Application(Frame):
""" A SPC program that takes user input and saves the file """

def __init__(self,master):
    """ initializes the frame """
    Frame.__init__(self,master)
    self.grid()
    self.create_widgets()        


def create_widgets(self):
    """create widgets for user inputted data"""

    # get name
    Label(self, text = "First Name").grid(row = 0, column = 0, sticky = W, padx=5, pady=5)
    self.e1 = Entry(self).grid(row = 0, column = 1)

    Label(self, text = "Last Name").grid(row = 1, column = 0, sticky = W, padx=5, pady=5)
    self.e2 = Entry(self).grid(row = 1, column = 1)

    # get work order
    Label(self, text = "Work Order Number").grid(row = 2, column = 0, sticky = W, padx=5, pady=5)
    self.e3 = Entry(self).grid(row = 2, column = 1)

    # get todays date
    Label(self, text = "Todays Date").grid(row = 3, column = 0, sticky = W, padx=5, pady=5)
    self.e4 = Entry(self).grid(row = 3, column = 1)

    # get bubble number
    Label(self, text = "Bubble Number").grid(row = 4, column = 0, sticky = W, padx=5, pady=5)
    self.e5 = Entry(self).grid(row = 4, column = 1)

    # get USL and LSL
    Label(self, text = "USL").grid(row = 5, column = 0, sticky = W, padx=5, pady=5)        
    self.e6 = Entry(self).grid(row = 5, column = 1)    
    Label(self, text = "LSL").grid(row = 6, column = 0, sticky = W, padx=5, pady=5)       
    self.e7 = Entry(self).grid(row = 6, column = 1)


    # button to check USL is higher than LSL
    self.button = Button(self)
    self.button["text"] = "Check USL and LSL"
    self.button["command"] = self.check_limits
    self.button.grid(row = 6, column = 2, sticky = W, padx=5, pady=5)

    # creates a spot to dictate whether USL and LSL are correct
    self.text = Text(self, width = 35, height = 2, wrap = WORD)
    self.text.grid(row = 6, column = 3, sticky = W)

def check_limits(self):

    e6 = int(self.e6)
    e7 = int(self.e7)

    if e6 > e7:
        message = "Limits are good"
    else:
        message = "USL can't be less than LSL, please re-enter USL and LSL"

    self.text.delete(0.0, END)
    self.text.insert(0.0, message)








root = Tk()
root.title("SPC Input Program")
root.geometry("700x500")

app = Application(root)

root.mainloop()

【问题讨论】:

  • @Bryan Oakley 我不认为另一个问题解决了 OP 问题的根源(除非我遗漏了一些东西。)他或她正试图使用​​这些变量从条目而不是使用 IntVar。当你阻止我给出答案时,我刚刚完成了对此的解释。
  • @saulspatz:根本问题是一样的——self.e6 = Entry(...).grid(...) 返回None,这就是OP 收到NoneType 错误的原因。是否使用IntVar 完全不相关。您可以在不使用IntVar 的情况下使用这些值。如果用户搜索“NoneType object has no attribute”,他们可能会找到数十个(如果不是数百个)类似的问题和答案。
  • 如何在不使用文本变量的情况下获取值? (我意识到它不一定是 IntVar,但这并不重要。)
  • @saulspatz:代码中存在多个问题,是的,但问题不是“如何修复我的代码”。问题是“为什么我会收到 NoneType 错误”。以下是问题的直接引述:“在这种情况下,为什么将它们定义为 null 而不是整数?” 这个问题已经被问过并回答了几十次。再问一个同样的问题对任何人都没有帮助。
  • @saulspatz:“如何在不使用文本变量的情况下获取值?”:您调用了小部件的 get 方法。在这种情况下,它将是 self.e6.get(),假设 self.e6 定义正确。

标签: python class user-interface tkinter


【解决方案1】:

你的问题是这样的

self.e6 = Entry(self).grid(row = 5, column = 1)

当您想使用分配的小部件时,您不能对其进行打包、放置或网格化。你需要把它改成这个

self.e6 = Entry(self)
self.e6.grid(row = 5, column = 1)

由于与网格的分配,您得到NoneType。这样做对于您不打算访问的静态小部件(如标签和按钮)来说很好。但是当你想要获取或分配一个值给小部件时,它需要是小部件本身而不是widget.grid()

【讨论】:

    猜你喜欢
    • 2015-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-24
    相关资源
    最近更新 更多