изменение текста QPushButton при нажатии - PullRequest
0 голосов
/ 24 января 2020

Я пишу простую GUI программу и мне нужно, чтобы мои кнопки меняли текст при нажатии. Я кодировал его, как в примере, но он не работает.

Код из примера:

class MyWidget(QtWidgets.QWidget):

    def __init__(self):
        QtWidgets.QWidget.__init__(self)

        self.hello = ["Hallo Welt", "你好,世界", "Hei maailma",
            "Hola Mundo", "Привет мир"]
        self.button = QtWidgets.QPushButton("Click me!")
        self.text = QtWidgets.QLabel("Hello World")
        self.text.setAlignment(QtCore.Qt.AlignCenter)
        self.layout = QtWidgets.QVBoxLayout()
        self.layout.addWidget(self.text)
        self.layout.addWidget(self.button)
        self.setLayout(self.layout)

        self.button.clicked.connect(self.magic)


    def magic(self):
        self.text.setText(random.choice(self.hello))

Мой код:

class Form(QWidget):
    def __init__(self):
        super(Form, self).__init__()

        # Font
        r_one = QFont("RussoOne-Regular", 40, QFont.Bold) 

        # Buttons
        self.pvz_p_score = QPushButton('0')
        self.pvz_z_score = QPushButton('0')
        self.pvt_p_score = QPushButton('0')
        self.pvt_t_score = QPushButton('0')
        self.pvp_p1_score = QPushButton('0')
        self.pvp_p2_score = QPushButton('0')

        buttons = [self.pvz_p_score, 
                   self.pvz_z_score, 
                   self.pvt_p_score, 
                   self.pvt_t_score, 
                   self.pvp_p1_score,
                   self.pvp_p2_score]

        for b in buttons:
            b.setStyleSheet('QPushButton {background-color: #8ffe09;\
                                          color: black;\
                                          border: none}')
            b.setFlat(True)
            b.setIconSize(QSize(100,100))
            b.setFont(r_one)
            b.setContextMenuPolicy(Qt.CustomContextMenu)
            b.clicked.connect(self.left_click)
            b.customContextMenuRequested.connect(self.right_click)

...

    def left_click(self):
        self.text.setText(int(self.text)+1)

    def right_click(self):
        if int(self.text) > 0: button.text.setText(int(self.text)-1)

Однако в моем случае self соответствует Form, когда, например, он ссылается на button. Есть идеи?

Ответы [ 2 ]

1 голос
/ 24 января 2020
  1. self.text относится к виджету QLabel. Таким образом, он не может быть преобразован в целое число для вашего сравнения.
  2. QLabel's text() и его метод setText() используют строки, а не целые числа. Чтобы установить текст, вы можете либо преобразовать число в строку, либо использовать setNum(), который принимает целочисленные значения и значения с плавающей запятой (но функции num() нет).
    def left_click(self):
        self.text.setText(str(int(self.text.text()) + 1))
        # alternatively:
        # self.text.setNum(int(self.text.text()) + 1)

    def right_click(self):
        if int(self.text.text()) > 0:
            button.text.setText(str(int(self.text.text()) - 1))
            # alternatively:
            # button.text.setNum(int(self.text.text()) - 1)

Примечание что я предполагаю, что текст существует и его можно преобразовать в целое число.

0 голосов
/ 24 января 2020

Хорошо, вопрос был довольно глупым, и я испортил некоторые базовые вещи c python, но теперь он решен. Надеюсь, это кому-нибудь поможет.

Во-первых, self.text не является полем класса Form, потому что такого поля нет, как в примере. Вместо этого для этого мне нужно как-то передать объект кнопки функции и получить к ней доступ, например button.text() и button.setText().

Поскольку все мои кнопки хранятся в списке buttons , с помощью которого я могу легко перебрать, я решил создать 2 функции, которые возвращают функции:

for b in buttons:
    # I skipped style-related code
    b.clicked.connect(self.get_left_click(b))
    b.customContextMenuRequested.connect(self.get_right_click(b))

...

def get_left_click(self, button):
        def left_click(self):
            button.setText(str(int(button.text())+1))
        return left_click

def get_right_click(self, button):
    def right_click(self):
        if int(button.text()) > 0: button.setText(str(int(button.text())-1))
    return right_click

Кроме того, QPushButton.setText() не поддерживает целые числа, поэтому Мне пришлось конвертировать его с str(...)

PS Я был бы признателен за лучшее решение

...