Python 当我尝试打开自定义导入的 PyQt5 时崩溃 window class

Python crashes when I try to open a custom imported PyQt5 window class

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

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

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

Process finished with exit code -1073740791 (0xC0000409) 并且根据我的研究,这意味着我可以做很多事情,从尝试调用不存在的函数到 PyQt5 没有正确抛出异常。我不确定是不是因为我的自定义 window 脚本没有简单调用 window 以在屏幕上显示的函数,但是我的 init 方法应该在 class 被调用时这样做,还是我只是犯了错误而忘记了我首先需要一个构造函数?

我还看到将此错误解释为线程问题,其中尝试 运行 外部脚本可能会导致 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_())

我希望程序打开一个主菜单 window,其中有一个下拉菜单和一个标记为 "test" 的菜单,按钮名称 "test" 运行s打开另一个 window 的导入脚本。

试一试:

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_())