【问题标题】:clicked.connect() Errorclicked.connect() 错误
【发布时间】:2018-01-29 08:13:54
【问题描述】:

我正在开发 Window 10,PyCharm-Python 3.5.2

我想做什么:如果点击了 PB1(按钮 1),打开一个新窗口。

问题:我收到一个错误

 self.PB1.clicked.connect(self.Soft_Memory())
TypeError: argument 1 has unexpected type 'NoneType' 

由于我定义了 Soft_Memory(),我不明白为什么 Soft_Memory() 是 NoneType。 虽然在编辑器上'.connect' 被突出显示并说在'function'中找不到引用'connect'

代码如下。我已经删除了部分代码,以便更好地查看。如果有人需要完整代码,请发表评论。

SM.py

class SM_Window(QMainWindow, QWidget):
    def __init__(self, parent=None):
        super().__init__()
        self.initU()

    def initU(self):
        self.setWindowTitle("SM_Window")
        self.setGeometry(10, 30, 850, 850)

UI.py

import SM

class MainWindow(QMainWindow, QWidget):

    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        self.initUI()

    def Soft_Memory(self):
        self.SF = SM.SM_Window()
        self.SF.show()

    def Buttons(self):
        #Button for SF
        self.PB1 = QPushButton("POP", self)
        self.PB1.setToolTip("POPOPOPOPOPOP")
        self.PB1.move(100, 100)

    def Signal_to_Slot(self):
        self.PB1.clicked.connect(self.Soft_Memory())

    def initUI(self):
        self.setWindowTitle("UI")
        self.setGeometry(850, 850, 850, 850)
        self.Buttons()
        self.Signal_to_Slot()
        self.showMaximized()

if __name__ == "__main__":
    app = QApplication(sys.argv)
    ex = MainWindow()
    sys.exit(app.exec())

【问题讨论】:

    标签: python pyqt pyqt5


    【解决方案1】:

    connect() 方法需要一个可调用的参数。当您编写self.Soft_Memory() 时,您正在调用该方法,并且该调用的结果(None,因为您没有明确返回任何内容)是传递给connect() 的内容。

    您想传递对方法本身的引用。

    self.PB1.clicked.connect(self.Soft_Memory)
    

    【讨论】:

    • 如果function()有'return something'然后我使用self.functiun()有可能吗?
    • 仅当 'something' 是可调用的。一般来说,您应该直接指定插槽以明确您要连接的内容
    【解决方案2】:

    @DaveyH-cks 和@user3419537 的答案是正确的,您应该使用该方法的引用,而不是调用它:

    self.PB1.clicked.connect(self.Soft_Memory)
    

    但是,您可能经常需要在这些函数上传递参数(我当然会这样做)。在这些情况下,如果您需要使用 args,可以使用 lambda 解决方法。

    self.PB1.clicked.connect(lambda: myfunction(self, arg1, True, "example", arg4))
    

    【讨论】:

      【解决方案3】:

      当您编写self.Soft_Memory() 时,您正在使用括号调用该方法。你想要的是引用方法:

      self.PB1.clicked.connect(self.Soft_Memory)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-04-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多