PyQt5 - pythonw.exe 在处理单击事件时崩溃

问题描述 投票:0回答:1

我是 PyQt5 的新手,我遇到了一个错误(pythonw.exe 不再工作),代码如下:

import sys
from PyQt5.QtWidgets import QWidget, QPushButton, QApplication
from PyQt5.QtCore import QCoreApplication


class Example(QWidget):

    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):               
        
        qbtn = QPushButton('Quit', self)
        qbtn.clicked.connect(self.q)
        qbtn.resize(qbtn.sizeHint())
        qbtn.move(50, 50)       

        self.setGeometry(300, 300, 250, 150)
        self.setWindowTitle('Quit button')    
        self.show()

    def q():
        print('test')
        sys.exit()


if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = Example()
    app.exec_()

首先它可以工作,但直到我按下“退出”按钮。然后弹出错误消息。 如果我将 q() 函数放在类之外(并将“self.q”更改为“q”),它就可以正常工作。 有什么问题吗?

提前致谢。

  • Windows 7
  • Python 3.4.3 (x86)
  • PyQt 5.5.1 (x86)
python python-3.x pyqt pyqt5
1个回答
1
投票

那是因为当

q()
位于类内部时,它需要一个强制参数作为第一个参数,这通常称为
self
并在您调用该方法时由 python 隐式传递(
q()
不是
q(self)
)。就像您在类中使用
initUI
方法一样,当您将其放在类外部时,它只是一个普通函数,而不再是一个方法(类中的函数),因此可以定义不带
 的函数。 self

import sys
from PyQt5.QtWidgets import QWidget, QPushButton, QApplication
from PyQt5.QtCore import QCoreApplication

class Example(QWidget):

    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):               
        qbtn = QPushButton('Quit', self)
        qbtn.clicked.connect(self.q)
        qbtn.resize(qbtn.sizeHint())
        qbtn.move(50, 50)       

        self.setGeometry(300, 300, 250, 150)
        self.setWindowTitle('Quit button')    
        self.show()

    def q(self):
        print('test')
        sys.exit()

if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = Example()
    app.exec_()
© www.soinside.com 2019 - 2024. All rights reserved.