Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x Python-GUI复选框无法将带有参数的函数分配给变量_Python 3.x_User Interface_Pyqt_Pyqt5 - Fatal编程技术网

Python 3.x Python-GUI复选框无法将带有参数的函数分配给变量

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,

当函数使用参数时,我很难理解如何将函数赋值给变量。参数似乎是必需的,但无论我输入什么参数,它都不起作用

场景是,我正在创建我的第一个GUI,它是在QT Designer中设计的。我需要在“接受”按钮允许用户继续之前勾选复选框

目前,这是编码,让我知道如果勾选复选框返回任何东西(这是做),但我不知道如何将结果传递到下一个函数“接受”。我认为最简单的方法是创建一个变量,但是它需要位置参数,这就是我的问题所在

我的代码:

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