linux - Python 3.6; PyQt5;架构Linux;被信号 6 : SIGABRT 中断

标签 linux python-3.x pyqt5

简介

我在尝试学习 PyQt5 时遇到了一个问题。

到目前为止,在我寻找问题的答案和理解的过程中,我大多是空手而归。我发现很多链接和帖子根本不适用于 python 甚至 Qt5,这并不奇怪,因为 SIGABRT 适用于内存分配等多个方面(如果我错了请纠正我)。

我相当确定错误源于诸如和类似于

的行

buttonEnv.clicked.connect(lambda: self.btnClicked(buttonEnv))

但一直无法找到或弄清楚它是什么。可能是因为我缺乏对 python 的了解。

系统

-操作系统:Arch Linux (Manjaro) 4.9.27-1-MANJARO

-IDE:Pycharm 2017.1

-Python版本:3.6

-使用:PyQt5

我收到错误

/usr/bin/python3.6 /opt/pycharm-community/helpers/pydev/pydevd.py --multiproc --qt-support --client 127.0.0.1 --port 42749 --file /home/alpeace/Documents/git_reps/project-tardis/main.py pydev debugger: process 22588 is connecting

Connected to pydev debugger (build 171.4249.47)

Process finished with exit code 134 (interrupted by signal 6: SIGABRT)

我的代码

#!/usr/bin/python3
# -*- coding: utf-8 -*-


import sys
from PyQt5.QtWidgets import QMainWindow, QAction, qApp, QApplication, QGridLayout,\
                            QBoxLayout, QPushButton, QWidget, QSizePolicy
from PyQt5.QtGui import QIcon


class HomeScreen(QWidget):

    clickedBtn = ''

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

        self.initUI()

    def initUI(self):

        self.clickedBtn = ''
        homeBtnLayout = QGridLayout()
        self.setLayout(homeBtnLayout)

        buttonEnv = QPushButton('Environment')
        buttonEnv.clicked.connect(lambda: self.btnClicked(buttonEnv))
        buttonEnv.setSizePolicy(QSizePolicy.MinimumExpanding, QSizePolicy.Preferred)

        buttonMedia = QPushButton('Media')
        buttonMedia.clicked.connect(lambda: self.btnClicked(buttonMedia))
        buttonMedia.setSizePolicy(QSizePolicy.MinimumExpanding, QSizePolicy.Preferred)

        buttonInv = QPushButton('Inventory')
        buttonInv.clicked.connect(lambda: self.btnClicked(buttonInv))
        buttonInv.setSizePolicy(QSizePolicy.MinimumExpanding, QSizePolicy.Preferred)

        buttonSched = QPushButton('Schedual')
        buttonSched.clicked.connect(lambda: self.btnClicked(buttonSched))
        buttonSched.setSizePolicy(QSizePolicy.MinimumExpanding, QSizePolicy.Preferred)

        homeBtnLayout.addWidget(buttonEnv, 0, 0)
        homeBtnLayout.addWidget(buttonMedia, 0, 1)
        homeBtnLayout.addWidget(buttonInv, 1, 0)
        homeBtnLayout.addWidget(buttonSched, 1, 1)

        self.move(300, 150)
        self.show()

    def btnClicked(self, btnName):
        self.clickedBtn = btnName.text()
        btnName.disconnect()

    def getClickedBtn(self):
        return self.clickedBtn


class MainWindow(QMainWindow):

    screenHome = HomeScreen()
    def __init__(self):
        super().__init__()

        self.initUI()

    def initUI(self):

        self.setGeometry(300, 300, 300, 250)
        self.setWindowTitle('Home')

        self.screenHome = HomeScreen()
        self.setCentralWidget(self.screenHome)
        self.show()

    def changeWindow(self):

        newWindow = self.screenHome.getClickedBtn()
        if newWindow == 'Environment':
            print(newWindow)
        elif newWindow == 'Media':
            print(newWindow)
        elif newWindow == 'Inventory':
            print(newWindow)
        elif newWindow == 'Schedual':
            print(newWindow)

if __name__ == '__main__':

    app = QApplication(sys.argv)
    ex = MainWindow()
    sys.exit(app.exec_())

无论如何,感谢阅读,我希望有人可以帮助我解决这个问题。如果需要更多信息,我会很乐意提供,但据我所知这应该足够了。

最佳答案

问题是你在类里面这样做:

class MainWindow(QMainWindow):

    screenHome = HomeScreen()

这意味着您正在尝试创建一个 HomeScreen在一开始,甚至在您的主 block 运行之前。

由于您要分配 self.screenHome无论如何稍后适当:

def initUI(self):
    # [...]
    self.screenHome = HomeScreen()

您可以简单地摆脱一级类(class)。

顺便说一句,faulthandler module在跟踪这样的事情时很有用 - 当放置 import faulthandler; faulthandler.enable() 时在顶部,Python 告诉您在哪一行发生了什么事——在本例中它指向 HomeScreen.__init__。所以我只需要弄清楚 HomeScreen 在哪里对象创建于 QApplication 之前.

关于linux - Python 3.6; PyQt5;架构Linux;被信号 6 : SIGABRT 中断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43965788/

相关文章:

django - python - Django内置登录 View 不重定向到下一个

python - 如何在 PyQt/PySide 中将 QComboBox 设置为项目文本中的项目

Linux ubuntu awk。找到包含 2 个相同单词的句子放在它们附近

linux - 在 csv 文件中的字段上有条件附加字符串

Python re.findall 仅返回第一个字符

python - PyQt。如何在 QTableView 中插入小部件

python - 在 PyQt5 的方法中添加进度条

linux - Git 弄乱了 Linux 容器上的非 ASCII 字符

java - Linux Java Swing 应用程序的 Kiosk 模式

python - Pandas 分组