【问题标题】:Python Generator Returns Last ItemPython 生成器返回最后一项
【发布时间】:2013-07-12 15:01:52
【问题描述】:

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

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

我认为我没有正确创建/使用生成器,但我不确定。

我如何遍历 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())

【问题讨论】:

    标签: python python-2.7 pyqt pyqt4 generator


    【解决方案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')
    

    如果您想为您的用户事件字段逐一分配项目,请在每次需要新地址时致电self.emailGenerator 上的next()

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

    而不是循环遍历它。如果您的电子邮件地址用完,上述示例行将该字段设置为 ''

    【讨论】:

    • 感谢您的回复。我的目标是在 to 字段中一次只列出 1 封电子邮件。单击下一步按钮后,它将抓取 CSV 文件电子邮件地址中的下一行,以及其他字段的其他数据。
    • 更新了答案,为您提供更好的选择。
    • 我已经尝试过这样做,但它并没有清除该字段,并且似乎只获取第一行。不过你说的很有道理。
    • 确保你每次点击按钮时都创建一个新的生成器。保持相同的生成器对象,每次都有一个新的生成器从头开始。
    • 我就是这么做的,呵呵!非常感谢你的帮助。我实际上是在上面使用self.toField.insert(self.emailGenerator.next())self.toField.clear()
    猜你喜欢
    • 2017-09-16
    • 1970-01-01
    • 2021-07-06
    • 2021-03-22
    • 2017-04-29
    • 1970-01-01
    相关资源
    最近更新 更多