2013-06-26 3 views
0

Я пытаюсь создать небольшой инструмент с помощью wxPython. В принципе, я хочу, чтобы мой код импортировал данные из файла csv и печатал имя и занятие человека. В любом случае, я получаю сообщение об ошибке при использовании функции find_names внутри определения search_ppl. Ошибка говорит NameError: глобальное имя «find_names» не определено. Я не понимаю, как это исправить. Если я создаю функцию find_names global, код тоже не работает. Я уже написал рабочий код для этого в python, где результаты записываются в окно терминала. Но wxPython для меня все еще новичок, и я еще не совсем это понимаю ... Спасибо за вашу помощь!определение моей функции в wxPython

#!/usr/bin/env python 
import wx 
import wx.lib.mixins.listctrl as listmix 
import csv 
from wxPython.wx import * 

info = csv.reader(open('data.csv', 'rb'),delimiter=',') 

class MyFrame(wx.Frame): 
    def __init__(self): 
     wx.Frame.__init__(self, None, wx.ID_ANY, 
      "Search", pos=(920,730), size=(350,250)) 

     panel = wx.Panel(self, wx.ID_ANY) 

     self.control = wxTextCtrl(panel, 1, style=wxTE_PROCESS_ENTER 
         , pos=(130,180), size=(200,28)) 

     self.list_ctrl = wx.ListCtrl(panel 
         , style=wx.LC_REPORT|wx.BORDER_SUNKEN 
         , size=(350,170)) 

     self.list_ctrl.InsertColumn(0, "Name", width = 120) 
     self.list_ctrl.InsertColumn(1, "Occupation", width = 220) 

     index = 0 
     for row in info: 
      self.list_ctrl.InsertStringItem(index, row[1]) 
      self.list_ctrl.SetStringItem(index, 1, row[4]) 

      if index % 2: 
       self.list_ctrl.SetItemBackgroundColour(index, "white") 
      else: 
       self.list_ctrl.SetItemBackgroundColour(index, "yellow") 
      index += 1 

     sizer = wx.BoxSizer(wx.VERTICAL) 
     sizer.Add(self.list_ctrl, 0, wx.ALL|wx.CENTER, 5) 
     panel.SetSizer(sizer) 


     btn = wx.Button(panel, label="Search", pos=(20,180)) 
     btn.Bind(wx.EVT_BUTTON, self.search_ppl) 

     key_index = 4 
     results = [] 

    def search_ppl(self, event): 
       employee_name = self.control.GetValue() 
     find_names(key_index, results, info, employee_name) 
     print results 

    def find_names(key_index, results, info, employee_name): 
     for row in info: #search each row in data.csv    
        if employee_name in row[key_index]: #name is in file     results.append(row[1]) #add element to the list 
     return results, info 




if __name__ == '__main__': 
    app = wx.App(False) 
    frame = MyFrame() 
    frame.Show() 
    app.MainLoop() 

ответ

0

Изменение линии

find_names(key_index, results, info, employee_name) 

в

results, info = self.find_names(key_index, results, info, employee_name) 

Поскольку вы вызываете метод класса вы должны использовать себя. перед именем метода

Вы также должны установить значения для key_index, результаты & информацию перед вызовом find_names

+0

Благодаря Yoriz, это сделал какой-то прогресс. Тем не менее, я все еще получаю сообщение об ошибке. Что означает ваша последняя строка? Мне нужно сделать key_index, результаты и информацию глобальными? Моя информация уже является глобальной. Когда я делаю key_index и результаты глобальные, я получаю сообщение об ошибке «UnboundLocalError: результаты локальной переменной», на которые ссылаются перед назначением ». Я этого не понимаю. Если я объявляю переменную глобальным, не должен ли код видеть эти значения? Или мне нужно каким-то образом передать их классу MyFrame? – 1vko

+0

Ничего, я понял это. Спасибо! – 1vko