繁体   English   中英

从可变数量的按钮中获取颜色 PyQt

[英]Get color from variable number of buttons PyQt

我正在尝试获取玩家的姓名和他们为项目的下一步选择的颜色。 获得名称很容易,但 colors 有点痛苦。
我不知道如何获取所选颜色并使用 QColorDialog 将其应用于按钮。 最终目标是获得一个结构,其中玩家名称与他们选择的颜色相关联。
这是我所拥有的:

from PyQt5.QtWidgets import (
    QLineEdit,
    QWidget,
    QApplication,
    QLabel,
    QMainWindow,
    QGridLayout,
    QColorDialog,
    QPushButton,
    QVBoxLayout,
    QHBoxLayout,
)
import sys

class NamesPlayers(QMainWindow):
    """ name screen, ask the names of the players """

    def __init__(self, nb_players):
        super().__init__()

        self.layout_widget = QWidget()

        self.player_names = []
        self.player_colors = []

        main_layout = QVBoxLayout()
        names_layout = QGridLayout()
        button_layout = QHBoxLayout()

        button_list = []

        for i in range(nb_players):
            label = QLabel("Name :")
            player_name = QLineEdit()
            color_button = QPushButton("Color")
            color_button.setStyleSheet("background-color: white")
            names_layout.addWidget(label, i, 0)
            names_layout.addWidget(player_name, i, 1)
            names_layout.addWidget(color_button, i, 2)
            button_list.append(color_button)
            self.player_names.append(player_name)
            self.player_colors.append(color_button.styleSheet())

        self.confirm_button = QPushButton("Confirm")

        button_layout.addWidget(self.confirm_button)

        main_layout.addLayout(names_layout)
        main_layout.addLayout(button_layout)

        for button in button_list:
            button.clicked.connect(self.open_colordialog)

        self.layout_widget.setLayout(main_layout)

        self.setCentralWidget(self.layout_widget)

    def open_colordialog(self):
        color_dialog = QColorDialog()
        color_dialog.exec_()

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = NamesPlayers(4)
    window.show()
    app.exec_()

我想我的主要问题是颜色按钮的数量可能会有所不同,当我点击这些按钮时,QColorDialog 的地址总是相同的,这不是我想要的。

任何帮助表示赞赏

一种可能的解决方案是使用 sender() 方法来按下按钮:

import sys

from PyQt5 import QtCore, QtWidgets


class NamesPlayers(QtWidgets.QMainWindow):
    """ name screen, ask the names of the players """

    def __init__(self, nb_players, parent=None):
        super().__init__(parent)

        names_layout = QtWidgets.QGridLayout()

        for i in range(nb_players):
            label = QtWidgets.QLabel("Name :")
            player_name = QtWidgets.QLineEdit()

            color_button = QtWidgets.QPushButton("Color")
            color_button.setStyleSheet("background-color: white")
            color_button.clicked.connect(self.open_colordialog)

            names_layout.addWidget(label, i, 0)
            names_layout.addWidget(player_name, i, 1)
            names_layout.addWidget(color_button, i, 2)

        self.confirm_button = QtWidgets.QPushButton("Confirm")

        central_widget = QtWidgets.QWidget()
        main_layout = QtWidgets.QVBoxLayout(central_widget)
        button_layout = QtWidgets.QHBoxLayout()
        button_layout.addWidget(self.confirm_button)
        main_layout.addLayout(names_layout)
        main_layout.addLayout(button_layout)
        self.setCentralWidget(central_widget)

    @QtCore.pyqtSlot()
    def open_colordialog(self):
        button = self.sender()
        color_dialog = QtWidgets.QColorDialog()
        if color_dialog.exec_() == QtWidgets.QColorDialog.Accepted:
            button.setStyleSheet(
                "background-color: {}".format(color_dialog.selectedColor().name())
            )
        button.clearFocus()


if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    window = NamesPlayers(4)
    window.show()
    sys.exit(app.exec_())

另一种可能的解决方案是发送按下的按钮(使用此答案中指示的方法):

from functools import partial
# ...
for i in range(nb_players):
    # ...
    color_button = QtWidgets.QPushButton("Color")
    color_button.setStyleSheet("background-color: white")
    color_button.clicked.connect(partial(self.open_colordialog, color_button))
    # or
    # color_button.clicked.connect(lambda *args, btn=color_button: self.open_colordialog(btn))
def open_colordialog(self, button):
    color_dialog = QtWidgets.QColorDialog()
    if color_dialog.exec_() == QtWidgets.QColorDialog.Accepted:
        button.setStyleSheet(
            "background-color: {}".format(color_dialog.selectedColor().name())
        )
    button.clearFocus()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM