2013-07-12 6 views
0

Я пытаюсь пропустить CSV-файл и получить элемент из каждой строки и вставить его в QLineEdit в графическом интерфейсе.Python Generator Возвращает последний элемент

Когда я нажимаю кнопку self.nextAppointment, он заполняет поле, но всегда с адресом электронной почты последней строки в файле CSV. Последующие щелчки кнопки не показывают ничего.

Я думаю, что я не создаю/использую генератор правильно, но я не уверен.

Как прокрутить файл CSV и получить поля, которые я хочу вернуть, чтобы я мог поместить их в графический интерфейс одновременно для каждой строки CSV.

Вот соответствующий код:

self.nextAppointment.clicked.connect(self.nextFunction) 

def nextFunction(self): 
    self.emailGenerator = self.nextEmail() 
    for email in self.emailGenerator: 
     self.toField.setText(email) 


def nextEmail(self): 
    with open('assigned_appt_leads.csv', 'rb') as infile: 
     rdr = csv.DictReader(infile, dialect='excel') 
     for line in rdr: 
      yield line['Email Address'] 

Я проверил, используя следующий, и он получает первый адрес электронной почты, но нажатие рядом не меняю его на адрес электронной почты следующей строки.

def nextFunction(self): 
    self.emailGenerator = self.nextEmail() 
    self.toField.setText(self.emailGenerator.next()) 

ответ

1

Вы правильно зацикливаетесь и уступаете.

Что вы не делать правильно использовать результаты:

for email in self.emailGenerator: 
    self.toField.setText(email) 

заменит все предыдущие текстовое значение каждой итерации цикла. Вот почему вы видите только последнее значение; все предыдущие вызовы на self.toField.setText() преуспели, но затем снова перезаписаны следующей итерацией.

Необходимо, чтобы добавить к существующему тексту в виде виджета QLineEdit. Я предлагаю вам использовать .insert() метод:

for email in self.emailGenerator: 
    self.toField.insert(email + '\n') 

Если вы хотите назначить пункты один за другим в своей области на пользовательские события, вызовите next() на self.emailGenerator каждый раз, когда вам нужен новый адрес:

self.toField.insert(next(self.emailGenerator, '')) 

вместо того, чтобы зацикливаться на нем. Вышеприведенная строка образца устанавливает поле '', если у вас закончились адреса электронной почты.

+0

Спасибо за ответ. Моя цель состоит в том, чтобы только один адрес электронной почты был указан за раз в поле. После нажатия следующей кнопки он возьмет следующую строку в адресе электронной почты файла CSV и другие данные для других полей. – novafluxx

+0

Обновлен ответ, чтобы предоставить вам лучший вариант сделать именно это. –

+0

Я пробовал это сделать, и он не очищает поле и, кажется, только извлекает первую строку. То, что вы говорите, имеет смысл. – novafluxx

Смежные вопросы