【问题标题】:How to iterate over elements of a list one at a time using a pushButton如何使用按钮一次迭代一个列表的元素
【发布时间】:2020-12-05 04:18:14
【问题描述】:

我有一个字符串列表,我想通过每次按下按钮来打印它的下一个元素。

另外,我如何通过按下另一个按钮来打印列表的上一项?

这是一个示例代码:

from PyQt5 import QtCore, QtWidgets
import sys

class Main(QtWidgets.QMainWindow):

    def __init__(self):
      self.pushbutton = QtWidgets.QPushButton(self)
      self.pushbutton.move(20,20)
      self.list = ["first","second","third"]
      self.setGeometry(300,300,250,180)
      self.pushbutton.clicked.connect(self.showElements)
      self.show()
     
     def showElements(self):
      pass
      
app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

【问题讨论】:

  • 请提供一些代码示例与您的问题,没有任何,我们很难帮助您。据我了解,您可以使用变量来跟踪列表索引,但如果没有更多详细信息,我们将无法为您编写任何代码。

标签: python loops pyqt generator


【解决方案1】:

试试看:

import sys
from PyQt5 import QtCore, QtWidgets


class Example(QtWidgets.QMainWindow):
    def __init__(self):
        super().__init__()
        
        self.centralWidget = QtWidgets.QWidget()
        self.setCentralWidget(self.centralWidget)

        self.list = ["first", "second", "third"]
        self.len_list = len(self.list) - 1
        self.index = 0

        self.label = QtWidgets.QLabel(self.list[self.index])
        
        button1 = QtWidgets.QPushButton('next')
        button1.clicked.connect(self.search_next)
        button2 = QtWidgets.QPushButton('previous')
        button2.clicked.connect(self.search_previous)
        
        layout = QtWidgets.QGridLayout(self.centralWidget)
        layout.addWidget(self.label, 0, 0, 1, 2, alignment=QtCore.Qt.AlignHCenter)
        layout.addWidget(button2, 1, 0)
        layout.addWidget(button1, 1, 1)        
     
    def search_next(self):
        if self.index >= self.len_list:
            self.index = 0
        else:
            self.index += 1
        self.label.setText(self.list[self.index])
        
    def search_previous(self):
        if self.index <= 0:
            self.index = self.len_list
        else:
            self.index -= 1
        self.label.setText(self.list[self.index])        
      
      
if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    ex = Example()
    ex.show()
    sys.exit(app.exec_())

【讨论】:

    【解决方案2】:

    您可以使用generators 来获得您要求的功能

    例如:

    a = [1,2,3]
    
    def myFunction():
        for item in a:
           yield item
    
    # Get iterator
    iterator = myFunction()
    
    # Call this on every button push
    nextItem = next(iterator)
    print(nextItem)
    

    这是一个有效的 repl.it 项目:

    https://repl.it/@HarunYlmaz/generators-iterators

    【讨论】:

    • 谢谢,但我怎样才能在列表中向后迭代?我希望能够跟踪列表中的元素。
    • 倒车不会像这个那么简单。 This thread 可能会有所帮助
    • 如何做类似newlist = iter(a) 的事情,然后在newlist 上调用下一步?这样就不需要定义生成器函数
    • 当然,你是对的。您可以使用iter(a)为列表创建生成器。
    • 另外,您可以按照this answer 中的说明创建自己的迭代器,以拥有prev 功能。
    猜你喜欢
    • 2014-03-12
    • 2011-08-15
    • 1970-01-01
    • 1970-01-01
    • 2017-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-02
    相关资源
    最近更新 更多