Python 3.x Python-GUI复选框无法将带有参数的函数分配给变量
当函数使用参数时,我很难理解如何将函数赋值给变量。参数似乎是必需的,但无论我输入什么参数,它都不起作用 场景是,我正在创建我的第一个GUI,它是在QT Designer中设计的。我需要在“接受”按钮允许用户继续之前勾选复选框 目前,这是编码,让我知道如果勾选复选框返回任何东西(这是做),但我不知道如何将结果传递到下一个函数“接受”。我认为最简单的方法是创建一个变量,但是它需要位置参数,这就是我的问题所在 我的代码:Python 3.x Python-GUI复选框无法将带有参数的函数分配给变量,python-3.x,user-interface,pyqt,pyqt5,Python 3.x,User Interface,Pyqt,Pyqt5,当函数使用参数时,我很难理解如何将函数赋值给变量。参数似乎是必需的,但无论我输入什么参数,它都不起作用 场景是,我正在创建我的第一个GUI,它是在QT Designer中设计的。我需要在“接受”按钮允许用户继续之前勾选复选框 目前,这是编码,让我知道如果勾选复选框返回任何东西(这是做),但我不知道如何将结果传递到下一个函数“接受”。我认为最简单的方法是创建一个变量,但是它需要位置参数,这就是我的问题所在 我的代码: class MainWindow(QtWidgets.QMainWindow,
class MainWindow(QtWidgets.QMainWindow, Deleter_Main.Ui_MainWindow):
def __init__(self):
super(MainWindow, self).__init__()
self.setupUi(self)
self.ConfirmBox.stateChanged.connect(self.confirm_box)
self.Acceptbtn.clicked.connect(self.accept_btn)
def confirm_box(self, state):
if self.ConfirmBox.isChecked():
print("checked")
else:
print("not checked")
checked2 = confirm_box(self, state)
def accept_btn(self):
if checked2 == True:
print("clicked")
else:
print("not clicked")
app = QApplication(sys.argv)
form = MainWindow()
form.show()
app.exec_()
代码卡在“checked2”上,出现错误:
NameError: name 'self' is not defined
我认为可能有其他解决方案可以在一个函数中运行这一切,但我似乎找不到一个方法,而下面是必需的
self.ConfirmBox.stateChanged.connect(self.confirm_box)
如果有人能帮我理解为什么我需要函数和变量中的“self”参数,我将不胜感激
提前感谢,如果选中复选框时只需启用按钮,则可以在信号连接中轻松完成:
self.ConfirmBox.toggled.connect(self.Acceptbtn.setEnabled)
QWidget.setEnabled
需要一个bool参数,它是toggled
信号传递的参数类型,因此在这种情况下连接非常简单
除此之外,您在理解Python中的类时还存在一些错误:似乎您是以“过程”的方式思考的,这在一般的PyQt实现和常见的Python用法中不起作用,除非在创建类时确实需要进行一些处理,例如,定义某些类属性或操纵某些方法的行为方式。但是,即使在这种情况下,它们也是类属性,每个新实例都将继承它们 行
checked2=confirm_框(self,state)
显然会给您一个错误,因为您将checked2
定义为类属性。这意味着它的值将在创建类时被处理和赋值:此时,类的实例还不存在,Python只执行不属于方法的代码,直到它到达类定义的末尾(它的主缩进)。当它到达checked2
行时,它将尝试调用confirm_框
方法,但是参数“self”
和“state”
还不存在,因为它们还没有在类属性中定义,因此出现namererror
异常
从概念上讲,您所做的与此类似:
class SomeObject(object):
print(something)
这没有任何意义,因为任何地方都没有定义“某物”
self
是用于类方法的python约定:它是一个常用于引用类实例的关键字,实际上可以使用任何有效的python关键字
任何类方法的第一个参数始终是对类实例的引用,唯一的例外是classmethod
和staticmethod
装饰器,但这是另一回事。调用实例化类的方法时,实例对象将自动绑定到被调用方法的第一个参数:self
是实例本身
例如,您可以创建如下类:
class SomeObject(object):
def __init__(Me):
Me.someValue = 0
def setSomeValue(Myself, value):
Myself.someValue = value
def multiplySomeValue(I, multi):
I.setSomeValue(I.someValue * multi)
return I.someValue
但是这会有点混乱…什么是接受按钮?确认复选框后,是否要启用“接受”按钮?此想法与“条款和条件”页面相同,您必须勾选“我确认”,然后才能按“下一步”按钮。在我的代码中,在复选框被选中之前,它不一定需要变灰或隐藏,因为如果复选框没有被选中,我计划添加一条消息。复选框只是接受按钮的先决条件。非常有教育意义!非常感谢。你已经给了我一个新问题的答案,你解释了这个类中的变量,现在变得更有意义了。非常感谢好先生/女士:)状态更改的
信号不发送布尔值。使用切换的信号。对,我总是忘记这一点。我会更正答案的,谢谢@ekhumoro