2015-11-20 159 views
0

我正在开发一个GUI的一个项目,一旦我把所有这一切都为一类,它返回说全局变量“的getInfo”未定义

Exception in Tkinter callback 
Traceback (most recent call last): 
    File "C:\Python33\lib\tkinter\__init__.py", line 1475, in __call__ 
    return self.func(*args) 
    File "c:\users\ryan\documents\visual studio 2015\Projects\Group_3_Project\Group_3_Project\Group_3_Project.py", line 30, in <lambda> 
    b1 = Button(root, text = 'Submit', command = (lambda e = ents: getInfo(e))) 
NameError: global name 'getInfo' is not defined 

这里是我到目前为止的代码:

from tkinter import* 


class GUI: 
    fields = 'Last Name', 'First Name', 'Field', 'Phone Number', 'Office number' 

    def getInfo(entries): 
     for entry in entries: 
      field = entry[0] 
      text = entry[1].get() 
      print('%s: "%s"' % (field, text)) 

    def makeForm(root, fields): 
     entries = [] 
     for field in fields: 
      row = Frame(root) 
      lab = Label(row, width = 15, text = field, anchor = 'w') 
      ent = Entry(row) 
      row.pack(side = TOP, fill = X, padx = 5, pady = 5) 
      lab.pack(side = LEFT) 
      ent.pack(side = RIGHT, expand = YES, fill = X) 
      entries.append((field, ent)) 
     return entries 

    if __name__ == '__main__': 
     root = Tk() 
     root.wm_title("HoursWizard") 
     ents = makeForm(root, fields) 
     root.bind('<Return>', (lambda event, e = ents: getInfo(e))) 
     b1 = Button(root, text = 'Submit', command = (lambda e = ents: getInfo(e))) 
     b2 = Button(root, text = 'Quit', command = root.quit) 
     b1.pack(side = LEFT, padx = 5, pady = 5) 
     b2.pack(side = LEFT, padx = 5, pady = 5) 
     root.mainloop() 

我不知道发生了什么,为什么它不能正常工作。我相信这是一个简单的解决方案,我只是错过了一些东西。任何帮助表示赞赏。谢谢!

+1

你为什么要将这一切都包装在'class GUI'中? – user2357112

+0

我有更多的代码,我将要投入。这只是获取用户基本信息的GUI。 –

回答

1

您应该检查official Python tutorial并查看关于课程的部分。基本上,您的范围和命名空间不是您认为的那样。每个类方法(除非它被指定为静态)首先传递实例本身,通常用self表示。然后您会参考self.myattribute的实例属性。例如,在getInfo中,您所称的entries根本不是条目,而是已创建的GUI类的实例。

我强烈建议你查阅一些关于如何制作OO Tkinter应用程序的教程。它通常是这样的:

class App: 
    def __init__(self, parent): 
     self.parent = parent 
     self.parent.after(5000, self.other_method) # just a demo 
     # create buttons, lay out geometry, etc. 
    def other_method(self): 
     self.do_print() 
    def do_print(self): 
     print('hello world') 

root = Tk() 
app = App(root) 
root.mainloop()