单击更改 QPushButton 文本

changing QPushButton text on click

我正在编写一个简单的 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。有什么想法吗?

  1. self.text 指的是 QLabel 小部件。因此,它无法转换为整数供您比较。
  2. QLabel 的 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)

请注意,我假设文本存在并且可以转换为整数。

好吧,这个问题有点愚蠢,我搞砸了一些基本的 python 东西,但现在已经解决了。希望对大家有所帮助。

首先,self.text 不是 class Form 的字段,因为 没有这样的字段 ,如示例所示。相反,对于我想做的,我需要以某种方式将按钮对象传递给函数并像 button.text()button.setText().

一样访问它

由于我所有的按钮都存储在列表 buttons 中,我可以通过它轻松地进行迭代,因此我决定创建 2 个 return 函数:

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(...)

P.S。我将不胜感激更好的解决方案