【问题标题】:I'm trying to make a new 'Qradiobutton' when I click on create button当我单击创建按钮时,我正在尝试制作一个新的“Qradiobutton”
【发布时间】:2021-07-24 20:19:31
【问题描述】:

当我单击创建按钮时,我正在尝试制作一个新的“Qradiobutton”......但该按钮只创建了一个 Qradiobutton。有什么建议吗???

我的代码:

import sys
from PyQt5.QtWidgets import (
    QApplication, QMainWindow, QWidget, QPushButton, QRadioButton
)

class main(QMainWindow):
    def __init__(self):
        super().__init__()

        self.newUi()

        self.setGeometry(400, 400, 500, 500)
        self.setWindowTitle('Create')
        self.show()

        self.radio1 = QRadioButton('first', self)
        self.radio1.setGeometry(50, 50, 60, 20)

        self.radio2 = QRadioButton('second', self)
        self.radio2.setGeometry(50, 90, 60, 20)

        self.radio3 = QRadioButton('third', self)
        self.radio3.setGeometry(50, 130, 60, 20)

    def newUi(self):
        self.btn = QPushButton('create', self)

        self.btn.clicked.connect(self.create)


    def create(self):
        n = 1

        if n == 1:
            self.radio1.show()
            n = 2

        elif n == 2:
            self.radio2.show()
            n == 3

        elif n == 3:
            self.radio3.show()

        else:
            print('done')



if __name__ == "__main__":
    app = QApplication(sys.argv)
    e = main()
    app.exec()

【问题讨论】:

    标签: pyqt pyqt5 qpushbutton qradiobutton


    【解决方案1】:

    您不是在创建 QRadioButton,而是使现有的单选按钮可见。在您的情况下,问题是 n 始终为 1,因此它只会使与 n = 1 关联的单选按钮可见,在每次单击时,您必须增加 n 的值。

    注意:在您的情况下,“n”是一个局部变量,将立即销毁,因此每次点击 n 为 1。

    def newUi(self):
        self.btn = QPushButton('create', self)
        self.n = 0
        self.btn.clicked.connect(self.create)
    
    
    def create(self):
        self.n +=  1
        if self.n == 1:
            self.radio1.adjustSize()
            self.radio1.show()
            
    
        elif self.n == 2:
            self.radio2.adjustSize()
            self.radio2.show()
    
        elif self.n == 3:
            self.radio3.adjustSize()
            self.radio3.show()
    
        else:
            print('done')
    

    【讨论】:

    • 你成就了我的一天
    【解决方案2】:

    您的代码中的第一个问题是您在函数开头将n 变量声明为1。此后无论您做什么,每次调用 create 函数时,您总是将 n 设置为 1,因此您的其他 elif/else 语句将永远不会被处理。

    然后,即使假设您没有执行上述操作,您在此处声明的内容也称为 local 变量:它是一个仅存在于 create 函数中的变量,并且获取该函数返回后立即从内存中完全删除。

    解决方案是使该变量持久,确保它不会被删除并“尽可能长时间地”保持活动状态。
    解决这个问题的一个常见尝试是使用 global 变量(函数开头的语句 global n)。这也是一个常见的错误,应该从不用于此类原因。全局变量不适用于这种用法,使用它们通常会导致误解和意外行为,从而产生难以跟踪的“静默错误”。

    正确的解决方案是创建一个instance属性,该属性是一个变量,是实例的成员。

    为了做到这一点,您必须在检查或更改它之前声明该属性,这通常在类的__init__ 中完成。然后,您在 create 函数中检查该值并使用它做任何您需要的事情。

    class main(QMainWindow):
        def __init__(self):
            super().__init__()
            self.n = 1
    
            self.newUi()
            # ...
    
        def create(self):
            if self.n == 1:
                self.radio1.show()
                self.n = 2
    
            elif self.n == 2:
                self.radio2.show()
                self.n = 3
    
            elif self.n == 3:
                self.radio3.show()
                self.n = 4
    
            else:
                print('done')
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-04
      • 1970-01-01
      • 2016-02-20
      • 1970-01-01
      • 2022-12-15
      相关资源
      最近更新 更多