当我点击创建按钮时,我正在尝试创建一个新的 'Qradiobutton'
I'm trying to make a new 'Qradiobutton' when I click on create button
当我点击创建按钮时,我试图创建一个新的 '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()
您不是在创建 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')
代码中的第一个问题是您在函数开头将 n
变量声明为 1。无论您在那之后做什么,每次调用 create
函数时,您总是将 n
设置为 1,因此您的其他 elif/else 语句将永远不会被处理。
然后,即使假设您没有执行上述操作,您在那里声明的内容称为 local 变量:它是一个仅存在于 create
函数,并在该函数 returns.
后立即从内存中完全删除
解决方案是使该变量持久,确保它不会被删除并“尽可能长地”保持活动状态。
解决此问题的常见尝试是使用 global 变量(函数最开头的语句 global n
)。这也是一个常见的错误,因此 永远不要 用于此类原因。全局变量不适用于这种用法,使用它们通常会导致误解和意外行为,从而产生很难跟踪的“无声错误”。
正确的解决方案是创建一个实例属性,它是实例成员的变量。
为此,您必须在 检查或更改属性之前 声明该属性,这通常在 class 的 __init__
中完成.然后,您在 create
函数中检查该值并使用它执行任何您需要的操作。
class main(QMainWindow):
def __init__(self):
super().__init__()
<b>self.n = 1</b>
self.newUi()
# ...
def create(self):
if <b>self.n</b> == 1:
self.radio1.show()
self.n = 2
elif self.n == 2:
self.radio2.show()
self.n = 3
elif self.n == 3:
self.radio3.show()
<b>self.n = 4</b>
else:
print('done')
当我点击创建按钮时,我试图创建一个新的 '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()
您不是在创建 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')
代码中的第一个问题是您在函数开头将 n
变量声明为 1。无论您在那之后做什么,每次调用 create
函数时,您总是将 n
设置为 1,因此您的其他 elif/else 语句将永远不会被处理。
然后,即使假设您没有执行上述操作,您在那里声明的内容称为 local 变量:它是一个仅存在于 create
函数,并在该函数 returns.
解决方案是使该变量持久,确保它不会被删除并“尽可能长地”保持活动状态。
解决此问题的常见尝试是使用 global 变量(函数最开头的语句 global n
)。这也是一个常见的错误,因此 永远不要 用于此类原因。全局变量不适用于这种用法,使用它们通常会导致误解和意外行为,从而产生很难跟踪的“无声错误”。
正确的解决方案是创建一个实例属性,它是实例成员的变量。
为此,您必须在 检查或更改属性之前 声明该属性,这通常在 class 的 __init__
中完成.然后,您在 create
函数中检查该值并使用它执行任何您需要的操作。
class main(QMainWindow):
def __init__(self):
super().__init__()
<b>self.n = 1</b>
self.newUi()
# ...
def create(self):
if <b>self.n</b> == 1:
self.radio1.show()
self.n = 2
elif self.n == 2:
self.radio2.show()
self.n = 3
elif self.n == 3:
self.radio3.show()
<b>self.n = 4</b>
else:
print('done')