【问题标题】:How to change the text in QPushbutton within a QButtongroup element after some user input?一些用户输入后,如何在 QButtongroup 元素中更改 QPushbutton 中的文本?
【发布时间】:2019-06-14 18:17:13
【问题描述】:

我目前正在从在我的 Python 脚本中使用 Tk 切换到 PyQt 以运行一些简单的 GUI。它们旨在提供稍后将保存在文件中的功能以及将在启动不同脚本后收集的一些数据(我暂时省略的单独的 PushButton)。现在,我无法理解如何根据用户的输入更改某些按钮的文本。更准确地说,我想显示相同的按钮,但是使用 BTNS = ["1", "2", ... "8"] 或 BTNS = ["9", "10", ... "16 "],取决于不同按钮的输入(“右”与“左”)。我尝试了不同的方法(从组内的 findChildren 获取信息、使用 deleteLater、使用 clicked 参数等),但没有给出我想要的结果。

这是我的问题的 MWE。

# -*- coding: utf-8 -*-

import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import QFont

class App(QMainWindow):

    def __init__(self):
        super().__init__()
        self.setGeometry(50, 50, 600, 500)
        self.initUI()

    def initUI(self):

        self.MainLayout = QVBoxLayout(self)

        self.lbl1 = QLabel(self)
        self.lbl1.setText('Test1:')
        self.lbl1.move(50, 80)
        self.MainLayout.addWidget(self.lbl1)

        self.MainLayout.addWidget(self.addSideButtons())

        self.btnGroup2 = QButtonGroup(self)
        self.MainLayout.addWidget(self.StimButtons("left"))

        self.show()

    def addSideButtons(self):

        self.btnGroup1 = QButtonGroup()
        self.button1 = QPushButton(self)
        self.button2 = QPushButton(self)

        self.button1.setGeometry(90, 20, 100, 30)
        self.button1.setText("Left")
        self.button1.setCheckable(True)
        #self.button1.clicked.connect(lambda:self.StimButtons("left"))
        self.button1.setChecked(True)
        self.btnGroup1.addButton(self.button1)

        self.button2.setGeometry(200, 20, 100, 30)
        self.button2.setText("Right")
        self.button2.setCheckable(True)
        #self.button2.clicked.connect(lambda:self.StimButtons("right"))
        self.btnGroup1.addButton(self.button2)
        self.btnGroup1.setExclusive(True)

    def StimButtons(self, btn):

        if btn == "left":
            BTNS = ["1", "2", "3", "4", "5", "6", "7", "8"]
        else:
            BTNS = ["9", "10", "11", "12", "13", "14", "15", "16"]

        coords = [(150, 350), (80, 300), (150, 300), (220, 300),
                    (80, 250), (150, 250), (220, 250), (150, 200)]

        for idx, contact_bts in enumerate(BTNS):
            self.btn = QPushButton(contact_bts, self)
            self.btn.setGeometry(coords[idx][0], coords[idx][1], 60, 45)
            self.btn.setCheckable(True)
            self.btnGroup2.addButton(self.btn)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = App()
    sys.exit(app.exec_())

【问题讨论】:

    标签: python pyqt pyqt5


    【解决方案1】:

    您必须重复使用按钮,而不是删除它们并创建它们,因此您首先在一个只会被调用一次的方法中创建按钮。在另一种方法中,您必须根据按下的按钮更改按钮的文本,为此您必须发送一个识别按钮的功能,在这种情况下,按下的按钮将使用 QButtonGroup 的 buttonClicked 信号发送。另一方面,我已将您的代码重组为使用布局。

    # -*- coding: utf-8 -*-
    
    from PyQt5 import QtCore, QtGui, QtWidgets
    
    
    class App(QtWidgets.QMainWindow):
        def __init__(self, parent=None):
            super().__init__(parent)
            self.setGeometry(50, 50, 600, 500)
            self.initUI()
    
        def initUI(self):
            self.m_buttons = []
    
            group = QtWidgets.QButtonGroup(self)
            left_button = QtWidgets.QPushButton("Left", checkable=True)
            right_button = QtWidgets.QPushButton("Right", checkable=True)
            group.addButton(left_button)
            group.addButton(right_button)
            group.buttonClicked[QtWidgets.QAbstractButton].connect(self.update_text)
    
            label = QtWidgets.QLabel("Test1:")
    
            self.m_widget = QtWidgets.QWidget()
            self.create_buttons()
    
            left_button.click()
    
            central_widget = QtWidgets.QWidget()
            self.setCentralWidget(central_widget)
            lay = QtWidgets.QVBoxLayout(central_widget)
            hlay = QtWidgets.QHBoxLayout()
            hlay.addStretch()
            hlay.addWidget(left_button)
            hlay.addWidget(right_button)
            hlay.addStretch()
            lay.addLayout(hlay)
            lay.addWidget(label)
            lay.addWidget(self.m_widget, alignment=QtCore.Qt.AlignCenter)
            lay.addStretch()
    
        def create_buttons(self):
            coords = [
                (4, 1),
                (3, 0),
                (3, 1),
                (3, 2),
                (2, 0),
                (2, 1),
                (2, 2),
                (0, 1),
            ]
            group = QtWidgets.QButtonGroup(exclusive=True)
            grid = QtWidgets.QGridLayout(self.m_widget)
            for coord in coords:
                btn = QtWidgets.QPushButton(checkable=True)
                btn.setFixedSize(60, 45)
                grid.addWidget(btn, *coord)
                group.addButton(btn)
                self.m_buttons.append(btn)
            self.m_widget.setFixedSize(self.m_widget.sizeHint())
    
        @QtCore.pyqtSlot(QtWidgets.QAbstractButton)
        def update_text(self, btn):
            text = btn.text()
            texts = {
                "Left": ["1", "2", "3", "4", "5", "6", "7", "8"],
                "Right": ["9", "10", "11", "12", "13", "14", "15", "16"],
            }
            if text in texts:
                for btn, txt in zip(self.m_buttons, texts[text]):
                    btn.setText(txt)
    
    
    if __name__ == "__main__":
        import sys
    
        app = QtWidgets.QApplication(sys.argv)
    
        w = App()
        w.show()
    
        sys.exit(app.exec_())
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-08-06
      • 1970-01-01
      • 1970-01-01
      • 2014-05-25
      • 1970-01-01
      • 2012-06-17
      • 2020-05-22
      相关资源
      最近更新 更多