动态创建按钮并分配点击动作
Dynamically creating buttons and assigning click actions
我正在尝试通过制作图鉴来练习。我正在尝试根据 API 调用的响应在 OVBoxLayout 内动态创建按钮列表。按钮列表已正确生成,但是,none 个按钮有效,代码如下:
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;
}
""")
button.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_this 方法中的导入和发件人除外)但它有效。我认为你的代码某处有问题。
我正在尝试通过制作图鉴来练习。我正在尝试根据 API 调用的响应在 OVBoxLayout 内动态创建按钮列表。按钮列表已正确生成,但是,none 个按钮有效,代码如下:
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;
}
""")
button.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_()
结果如下: