Python Generator返回最后一项

时间:2013-07-12 15:01:52

标签: python python-2.7 pyqt pyqt4 generator

我正在尝试遍历CSV文件并从每行获取一个项目并将其插入GUI中的QLineEdit

当我点击按钮self.nextAppointment时,它会填充该字段,但始终使用CSV文件中最后一行的电子邮件地址。随后点击该按钮似乎没有做任何事情。

我在想我没有正确地创建/使用发生器,但我不确定。

如何循环CSV文件并获取我想要返回的字段,以便我可以一次将其放入GUI的每一行。

以下是相关代码:

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 个答案:

答案 0 :(得分: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, ''))

而不是循环它。如果您的电子邮件地址不足,上面的示例行会将字段设置为''