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

Posted

技术标签:

【中文标题】Python - GUI复选框无法将带有参数的函数分配给变量【英文标题】:Python - GUI checkbox cannot assign the function with arguments to variable 【发布时间】:2017-12-25 02:40:15 【问题描述】:

当函数使用参数时,我很难将函数分配给变量。这些参数似乎是必需的,但无论我输入什么参数,它都不起作用。

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

目前,这是为了让我知道勾选复选框是否返回任何内容(确实如此)但是我不知道如何将该结果传递给下一个函数“accept_btn”。我认为最简单的方法是创建一个变量,但是它需要位置参数,这就是我卡住的地方。

我的代码:

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”参数,我将不胜感激。

提前致谢,

【问题讨论】:

什么是接受按钮?确认复选框后是否启用接受按钮? 这个想法与条款和条件页面相同,您必须先勾选“我确认”,然后才能按下一步按钮。在我的代码中,在选中复选框之前不一定需要灰显或隐藏,因为我计划在未选中复选框的情况下添加一条消息。复选框只是接受按钮的先决条件。 【参考方案1】:

如果你只需要在勾选复选框时启用一个按钮,在信号连接内就可以轻松完成:

    self.ConfirmBox.toggled.connect(self.Acceptbtn.setEnabled)

QWidget.setEnabled需要一个bool参数,也就是toggled信号传递的参数类型,所以这种情况下的连接很简单。


除此之外,您对 Python 中的类的理解存在一些错误:您似乎在以“程序化”的方式思考,这不适用于一般的 PyQt 实现和常见的 Python 用法,除非您确实需要一些处理在创建类时完成,例如定义某些类属性或操作某些方法的行为方式。但是,即使在这种情况下,它们也将是 class 属性,将被 每个 新实例继承。

checked2 = confirm_box(self, state) 行显然会给您一个错误,因为您将checked2 定义为一个类属性。这意味着它的值将在类被创建时被处理和赋值:此时,类的实例还不存在,Python 只是执行不属于方法的代码直到它到达类定义的末尾(它的主要缩进)。当它到达checked2 行时,它将尝试调用confirm_box 方法,但参数"self""state" 尚不存在,因为它们尚未在类属性中定义,因此@987654330 @异常。

从概念上讲,您所做的与此类似:

    class SomeObject(object):
        print(something)

这没有任何意义,因为在任何地方都没有定义“某物”。

self 是用于类方法的 Python 约定:它是通常用于引用类实例的关键字,实际上您可以使用任何有效的 Python 关键字。

任何类方法的第一个参数始终是对类实例的引用,唯一的例外是 classmethodstaticmethod 装饰器,但那是另一回事了。当您调用实例化类的方法时,实例对象会自动绑定到被调用方法的第一个参数: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

但这会有点混乱......

【讨论】:

很有教育意义!谢谢你。您实际上已经通过您对课堂内变量的解释给了我正在解决的新问题的答案,现在更有意义了。非常感谢好先生/女士:) stateChanged 信号不发送布尔值。使用toggled 信号。 对,我总是忘记这一点。我会纠正答案,谢谢@ekhumoro

以上是关于Python - GUI复选框无法将带有参数的函数分配给变量的主要内容,如果未能解决你的问题,请参考以下文章

带有指针参数的 C++ 函数

Python:GUI之tkinter学习笔记3事件绑定

声明一个带有数组参数的python函数并将一个数组参数传递给函数调用?

python pandas-将带有两个参数的函数应用于列

python pandas:将带有参数的函数应用于系列

Tkinter中可变大小的复选框列表?