Python 3.6; PyQt5; arch linux;被信号6中断:SIGABRT

时间:2017-05-14 15:37:08

标签: linux python-3.x pyqt5

简介

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

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

我非常肯定这个错误来自与

类似的行
  

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

但是无法找到或弄清楚它是什么。可能是因为我缺乏知识来到python。

系统

-OS:Arch linux(Manjaro)4.9.27-1-MANJARO

-IDE:Pycharm 2017.1

-Python version: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:   进程22588正在连接

     

连接到pydev调试器(build 171.4249.47)

     

使用退出代码134完成处理(由信号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_())

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

1 个答案:

答案 0 :(得分:1)

问题是你在课堂上这样做:

class MainWindow(QMainWindow):

    screenHome = HomeScreen()

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

由于您以后正确分配self.screenHome

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

你可以简单地摆脱第一级课程。

顺便说一句,faulthandler module对于跟踪此类内容非常有用 - 将import faulthandler; faulthandler.enable()置于顶部时,Python会告诉您发生了什么事情 - 在此它指向HomeScreen.__init__,所以我只需要弄清楚在HomeScreen之前创建QApplication对象的位置。