当我尝试打开自定义导入的PyQt5窗口类时,Python崩溃

时间:2019-02-03 08:06:03

标签: python exception-handling pyqt5 python-multithreading

在Python方面,我还是个菜鸟,在PyQt5中更是如此。话虽如此,我不确定如何处理我遇到的错误,我希望有人可以在这里给我一些智慧。

我正在尝试将外部测试PyQt5窗口脚本文件连接到我的主GUI结构。我使用一个按钮创建了一个简单的下拉菜单GUI,该按钮应该运行将打开另一个窗口的外部脚本。我正在尝试使用以下命令执行它:test_dropButton.action.triggered.connect(testWindowButton)

我不断收到一个有趣的错误,似乎在我收到此错误时暗示Python正在崩溃:

Process finished with exit code -1073740791 (0xC0000409),根据我的研究,这意味着我可能在做很多事情,从尝试调用不存在的函数到PyQt5没有正确引发异常。我不确定是否是因为我的自定义窗口脚本没有简单地调用该窗口以在屏幕上显示的函数,但是我的 init 方法应该在调用该类时执行该操作,或者我只是愚蠢而忘记了我首先需要构造函数吗?

我也已经将此错误解释为一个线程问题,其中尝试运行外部脚本可能会由于线程问题而导致Python崩溃。也许我需要对外部python脚本进行多线程处理?

无论哪种方式,有人都可以向我解释以上错误,并准确告诉我发生了什么,为什么会崩溃?

这是我的代码:

#This is a snippet of my main GUI structure

import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import QIcon
import TrainHelloWorld as hi

 mainMenu = self.menuBar()
 trainMenu = mainMenu.addMenu('Test')

testWindowButton = hi.Greeting()

    test_dropButton = QAction('test', self)
    test_dropButton.setShortcut('Ctrl+T')
    test_dropButton.setStatusTip('Test the button')
    test_dropButton.action.triggered.connect(testWindowButton.show())
    trainMenu.addAction(test_dropButton)  # add test button to dropdown menu

这是导入的脚本:

from PyQt5.QtWidgets import *
from PyQt5.QtGui import QIcon
import sys


class Greeting(QMainWindow):
    def __init__(self):
        super().__init__()
        self.title = 'Dummy Hello'
        self.left = 10
        self.top = 10
        self.width = 640
        self.height = 400
        self.initUI()

    def initUI(self):
        self.setWindowTitle(self.title)
        self.setGeometry(self.left, self.top, self.width, self.height)

        greetingLabel = QLabel()

        greetingLabel.setText("You called a Python function in a QAction menu, YOU DID IT!")

        self.show()


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

我希望程序打开一个带有下拉菜单的主窗口,该下拉菜单带有一个标记为“ test”的菜单,其按钮名为“ test”,运行一个导入的脚本,该脚本将打开另一个窗口。

1 个答案:

答案 0 :(得分:0)

尝试一下:

main.py

import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import QIcon
import TrainHelloWorld as hi


class MyMainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle('MyMainWindow')

        mainMenu  = self.menuBar()
        trainMenu = mainMenu.addMenu('Test')

        self.testWindowButton = hi.Greeting() 

        test_dropButton = QAction('test', self)
        test_dropButton.setShortcut('Ctrl+T')
        test_dropButton.setStatusTip('Test the button')

        # test_dropButton.action.triggered.connect(testWindowButton.show())
        #                 ------                                        --
        test_dropButton.triggered.connect(self.testWindowButton.show)  # - `.action`, - `()`
        trainMenu.addAction(test_dropButton)  # add test button to dropdown menu   


if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = MyMainWindow()
    ex.show()
    sys.exit(app.exec_())  

TrainHelloWorld.py

import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui     import QIcon

class Greeting(QMainWindow):
    def __init__(self):
        super().__init__()
        self.title = 'Dummy Hello'
        self.left   = 520
        self.top    = 280
        self.width  = 640
        self.height = 400
        self.initUI()

    def initUI(self):
        self.setWindowTitle(self.title)
        self.setGeometry(self.left, self.top, self.width, self.height)

        greetingLabel = QLabel(self)                    # + self
        greetingLabel.setGeometry(170, 200, 300, 50)    # +++
        greetingLabel.setText("You called a Python function in a QAction menu, YOU DID IT!")
# ---   self.show()


if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = Greeting()
    ex.show()
    sys.exit(app.exec_())

enter image description here