Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么可以';你不能用一个生成器函数作为插槽吗?_Python_Generator_Pyside2_Qt Slot - Fatal编程技术网

Python 为什么可以';你不能用一个生成器函数作为插槽吗?

Python 为什么可以';你不能用一个生成器函数作为插槽吗?,python,generator,pyside2,qt-slot,Python,Generator,Pyside2,Qt Slot,我试图在PySide2应用程序中遍历列表。因此,每次按下“下一步”按钮时,下一项将从列表中返回并显示。我可以跟踪列表中最近读取的条目的索引,并在每次插槽调用时手动增加索引,但我认为将插槽转换为生成器函数可能更优雅。但它不起作用 下面是最小(非)工作示例 导入系统 从PySide2.qtwidts导入QApplication,QPushButton 来自PySide2.QtCore导入信号,QObject def func(): stringEntries=[“一”、“二”、“三”] 对于stri

我试图在PySide2应用程序中遍历列表。因此,每次按下“下一步”按钮时,下一项将从列表中返回并显示。我可以跟踪列表中最近读取的条目的索引,并在每次插槽调用时手动增加索引,但我认为将插槽转换为生成器函数可能更优雅。但它不起作用

下面是最小(非)工作示例

导入系统 从PySide2.qtwidts导入QApplication,QPushButton 来自PySide2.QtCore导入信号,QObject def func(): stringEntries=[“一”、“二”、“三”] 对于stringEntries中的项目: #在应用程序中,设置numpy数组的值 #然后发射一个信号,更新matplotlib画布,但是我,不管怎样 打印(“func”,项目“已调用!”) #这类工程没有以下收益声明 产量 app=QApplication(sys.argv) 按钮=QPushButton(“下一步”) 连接(按钮,信号('clicked()'),函数) 按钮。显示() sys.exit(app.exec_()) 我有点期待每次按下“下一步”按钮都会打印出不同的字符串,但它只是坐在那里嘲笑我

有人能指出我根本误解的东西吗?

正如在一篇评论中指出的那样,每次按下按钮就会产生问题,一个可能的解决方案是创建一个类,该类将迭代器作为属性,并使用_call _u方法查看它,为了使它简单和优雅,我创建了一个装饰师:

from PySide2.QtCore import QObject
from PySide2.QtWidgets import QApplication, QPushButton


class decorator:
    def __init__(self, f):
        self._f = f
        self._iterator = None

    def __call__(self, *args, **kwargs):
        if self._iterator is None:
            self._iterator = self._f(*args, **kwargs)
        try:
            return next(self._iterator)
        except StopIteration:
            pass


@decorator
def func():
    stringEntries = ["One", "Two", "Three"]
    for item in stringEntries:
        print("func ", item, " has been called!")
        yield


if __name__ == "__main__":
    import sys

    app = QApplication(sys.argv)
    button = QPushButton("Next")
    button.clicked.connect(func)
    button.show()

    sys.exit(app.exec_())

调用生成器函数只会创建迭代器对象;您必须实际迭代该对象才能实际执行函数中的任何代码。您的按钮每次单击时都会创建一个新的迭代器,没有任何东西会导致返回值的任何迭代。我认为您希望调用生成器,而不是传递生成器函数
QObject.connect(按钮,信号('clicked()'),func())
一行:
button.clicked.connect(lambda*a,f=func():next(f,None))