2015-04-01 53 views
1

我敢肯定,这是一个简单的错误,我已经将其定位于在代码中的特定点:如何让Entry Widget传入函数?

class NewProduct(tk.Frame): 

    def __init__(self, parent, controller): 
     tk.Frame.__init__(self, parent)     

     tLabel = ttk.Label(self, text="Title: ", font=NORM_FONT).grid(row=0, padx=5, pady=5) 
     qLabel = ttk.Label(self, text="Quantity: ", font=NORM_FONT).grid(row=1, padx=5, pady=5) 
     pLabel = ttk.Label(self, text="Price: $", font=NORM_FONT).grid(row=2, padx=5, pady=5) 
     te = ttk.Entry(self).grid(row=0, column=1, padx=5, pady=5) # Add validation in the future 
     qe = ttk.Entry(self).grid(row=1, column=1, padx=5, pady=5) 
     pe = ttk.Entry(self).grid(row=2, column=1, padx=5, pady=5) 

     saveButton = ttk.Button(self, text="Save", command=lambda: self.save(self.te.get(), self.qe.get(), self.pe.get())) 
     #WHY IS THIS WRONG!!!!!???!?!?!?!?!? 
     saveButton.grid(row=4, padx=5) 
     cancelButton = ttk.Button(self, text="Cancel", command=lambda: popupmsg("Not functioning yet.")) 
     cancelButton.grid(row=4, column=1, padx=5) 

    def save(self, title, quantity, price): 
     conn = sqlite3.connect("ComicEnv.db") 
     c = conn.cursor() 
     c.execute("INSERT INTO cdata(unix, datestamp, title, quantity, price) VALUES (?,?,?,?,?)", 
        (time.time(), date, title, quantity, price)) 
     conn.commit() 
     conn.close() 

我已经尝试了一些不同的东西,包括: saveButton = ttk.Button(self, text="Save", command=lambda: self.save(te.get(), qe.get(), pe.get()))

我m试图从入口小部件获取用户输入并将其存储在sqlite3数据库中。

这是回溯:

Exception in Tkinter callback 
Traceback (most recent call last): 
    File "C:\Python34\lib\tkinter\__init__.py", line 1533, in __call__ 
    return self.func(*args) 
    File "C:\Users\aedwards\Desktop\deleteme.py", line 106, in <lambda> 
    saveButton = ttk.Button(self, text="Save", command=lambda: self.save(self.te.get(), self.qe.get(), self.pe.get())) 
AttributeError: 'NewProduct' object has no attribute 'te' 

你们可以给我任何帮助将不胜感激。更多信息,请让我知道。

在此先感谢!

+1

1.当分配类的属性,执行'self.te = whatever',不'TE = whatever'。 2.不要在同一行上分配和打包。请参阅http://stackoverflow.com/questions/1101750/python-tkinter-attributeerror-nonetype-object-has-no-attribute-get – Kevin 2015-04-01 16:02:20

+0

难道是这么简单吗?我现在就试一试。 – Silight 2015-04-01 16:11:35

+0

这样做。非常感谢。 我甚至没有想过看网格部分。所有的研究和这是因为我问了错误的问题。 再次感谢! – Silight 2015-04-01 16:21:23

回答

6

错误告诉你问题:NewProduct对象没有名为te的属性。你已经创建了一个名为te的本地变量,但是它必须是一个属性,你必须创建self.te

而且,你必须调用grid在从那里建立小工具另一项声明中,因为grid(...)回报None,所以teself.te也没有了。这不仅解决了这个问题,而且让你的代码更易于理解,因为你可以将所有的呼叫都放到grid的同一块代码中,所以你不必将布局分散到各地。

例如:

def __init__(...): 
    ... 
    self.te = ttk.Entry(...) 
    self.qe = ttk.Entry(...) 
    self.pe = ttk.Entry(...) 
    ... 
    self.te = grid(...) 
    self.qe = grid(...) 
    self.pe = grid(...) 

FWIW,我使用lambda这里推荐。为您的按钮创建一个适当的功能来调用。编写和调试比复杂的lambda更容易。在tkinter中很少需要使用lambda

例如:

def __init__(...): 
    ... 
    saveButton = ttk.Button(..., command=self.on_save) 
    ... 

def on_save(self): 
    title=self.te.get() 
    quantity = self.qe.get() 
    price = self.pe.get() 
    self.save(title, quantity, price): 
+0

这确实简化了一下代码。我会改变这一点。非常感谢。 – Silight 2015-04-01 16:50:14

+0

'on_save ...'语句必须在'ttk.Button'调用之前执行。如果'def'是一个类中的方法并且是同一个类的一个gui方法的调用部分,那么这不是问题。 – 2015-04-01 17:14:50

相关问题