Python 动态创建按钮并指定单击操作

Python 动态创建按钮并指定单击操作,python,pyside2,qpushbutton,Python,Pyside2,Qpushbutton,我正试着做一个Pokedex来练习。我正试图根据API调用的响应,在OVBoxLayout中动态创建按钮列表。按钮列表已正确生成,但所有按钮均无效,代码如下: from PySide2.QtWidgets import * from PySide2.QtCore import * from PySide2.QtGui import * from app.pokeapi_client import PokeApiClient class MainWindow(QWidget): def

我正试着做一个Pokedex来练习。我正试图根据API调用的响应,在OVBoxLayout中动态创建按钮列表。按钮列表已正确生成,但所有按钮均无效,代码如下:

from PySide2.QtWidgets import *
from PySide2.QtCore import *
from PySide2.QtGui import *
from app.pokeapi_client import PokeApiClient


class MainWindow(QWidget):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)

        self.setup_styles()

        self.pokemon_list_data = PokeApiClient().get_pokemon_list(limit=9)
        self.setWindowTitle("Pokemon")
        self.resize(1000, 800)

       # create main layout
       main_layout = QHBoxLayout()

       # build list layout and populate with labels
       self.pokemon_list_layout = QVBoxLayout()
       self.populate_pokemon_list_layout()

       # add list layout to main layout
       main_layout.addLayout(self.pokemon_list_layout, 1)

       self.setLayout(main_layout)

    def populate_pokemon_list_layout(self):
        for pokemon in self.pokemon_list_data['results']:
            button = QPushButton(pokemon['name'])
            button.clicked.connect(self.print_this)
            self.pokemon_list_layout.addWidget(button)

    def print_this(self):
        print("hello world!")

    def setup_styles(self):
        self.setStyleSheet("""
            QWidget {
                background: red;
            }
            QPushButton {
                color: white;
                background: blue;
                border: 1px solid white;
            }
        """)

按钮.clicked.connect()似乎没有将函数分配给每个按钮,有人知道为什么会发生这种情况吗?

下面是一个MRE,其中包含您的代码:

from PySide2 import QtWidgets
from PySide2 import QtCore
from PySide2 import QtGui

DATA = {'results':[{'name':'pikka'}, {'name': 'dracofeu'}, {'name': 'mewtwo'}]}

class MainWindow(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)

        self.pokemon_list_data = DATA #Emulation data
        self.setWindowTitle("Pokemon")
        # self.resize(1000, 800)

        # create main layout
        main_layout = QtWidgets.QHBoxLayout()

        # build list layout and populate with labels
        self.pokemon_list_layout = QtWidgets.QVBoxLayout()
        self.populate_pokemon_list_layout()

        # add list layout to main layout
        main_layout.addLayout(self.pokemon_list_layout, 1)
        self.setLayout(main_layout)


    def populate_pokemon_list_layout(self):
        for pokemon in self.pokemon_list_data['results']:
            button = QtWidgets.QPushButton(pokemon['name'])
            button.clicked.connect(self.print_this)
            self.pokemon_list_layout.addWidget(button)


    def print_this(self):
        sender = self.sender()
        print(sender.text())


app = QtWidgets.QApplication([])
test = MainWindow()
test.show()
app.exec_()
结果如下:
正如你所看到的,我没有改变任何东西(除了导入和这个方法中的print_中的发送者),但它是有效的。我认为您的代码中有一个问题。

为什么要指向按钮。单击的.connect()似乎没有将函数分配给每个按钮?还有什么软件包提供app.pokeapi_客户端?对不起,我不明白你的评论是什么意思?我希望每个动态创建的按钮在单击时执行print_this()。PokeAppicClient与问题完全无关,它只提供了一些数据。1)好的,现在我明白你的意思了,2)如果不相关,那么用虚拟列表替换它以避免混淆,3)提供MRE,例如删除对“app.pokeAppi_client”的依赖并添加你使用MainWindow的地方。你能推荐一些学习PySide AlexLaur的好资源吗?嘿@decprog!我可以推荐stackoverflow,因为社区真的很酷。当你有问题的时候,很多时候,在你之前的人都有同样的问题。你可以在这里阅读pyside的所有文档:(它在一开始帮助了我很多)。youtube上也有一些教程。我希望它能帮助你学习PySide。也许还有其他资源,但我不知道。