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