【发布时间】: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