某些用户输入后,如何更改 QButtongroup 元素内 QPushbutton 中的文本? [英] How to change the text in QPushbutton within a QButtongroup element after some user input?

查看:37
本文介绍了某些用户输入后,如何更改 QButtongroup 元素内 QPushbutton 中的文本?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I'm currently switching from using Tk in my Python scripts to PyQt to run some simple GUIs. They are intended to provide features that will be saved later in a file together with some data which will be collected after a different script is started (separate PushButton which I left out for the time being). Right now, I cannot get my head around how to change the text of some Pushbottons depending on the user's input. To be more precise I would like to display the same buttons but either with BTNS = ["1", "2", ... "8"] or BTNS = ["9", "10", ... "16"], depending upon the input of a different Pushbutton ("Right" vs. "Left"). I have tried different approaches (fetching information from findChildren within the group, using deleteLater, using the clicked argument and so on) but nothing gives the result I am looking for.

这是我的问题的 MWE.

Here is a MWE of my problem.

# -*- 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_())

推荐答案

您必须重用按钮,而不是删除它们然后再创建它们,因此您首先在只调用一次的方法中创建按钮.在另一种方法中,您必须根据按下的按钮更改按钮的文本,为此您必须发送一个标识按钮的功能,在这种情况下,按下的按钮将使用 QButtonGroup 的 buttonClicked 信号发送.另一方面,作为一个优点,我已经重组了您的代码以使用布局.

You must reuse the buttons instead of deleting them and creating them so you first create the buttons in a method that will only be called once. In another method you must change the text of the buttons depending on the button pressed, and for this you must send a feature that identifies the button, in this case the button pressed will be sent using the buttonClicked signal of the QButtonGroup. On the other hand as a plus I have restructured your code to use layout.

# -*- 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_())

这篇关于某些用户输入后,如何更改 QButtongroup 元素内 QPushbutton 中的文本?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆