【问题标题】:Python 3.6; PyQt5; arch linux; interrupted by signal 6: SIGABRT蟒蛇3.6; PyQt5;拱Linux;被信号 6 中断:SIGABRT
【发布时间】:2019-01-08 10:10:05
【问题描述】:

简介

我在尝试学习 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 版本: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 调试器: 进程22588正在连接

连接到 pydev 调试器(内部版本 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_())

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

【问题讨论】:

  • 在发布模式下/从 CLI 运行时是否获得 SIGABRT?
  • 当从命令行运行时,我得到以下“QWidget:必须在 QWidget 中止(核心转储)之前构造一个 QApplication”。更改代码以首先构造 QApplication 会给我带来其他错误,因为类未定义等。这就是我对 python 缺乏经验的遗憾。

标签: linux python-3.x pyqt5


【解决方案1】:

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

class MainWindow(QMainWindow):

    screenHome = HomeScreen()

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

既然您稍后会正确分配self.screenHome

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

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

顺便说一句,faulthandlermodule 在跟踪这样的事情时很有用 - 当把 import faulthandler; faulthandler.enable() 放在顶部时,Python 会告诉你发生了什么事情 - 在这种情况下它指向 @987654328 @ 所以我只需要弄清楚在QApplication 之前创建HomeScreen 对象的位置。

【讨论】:

  • 感谢帮助解决了我的问题!也感谢有关故障处理程序的提示,非常有用!
猜你喜欢
  • 1970-01-01
  • 2022-12-14
  • 2016-01-05
  • 2016-01-11
  • 2014-04-29
  • 2014-12-21
  • 1970-01-01
  • 2018-06-21
  • 2019-10-13
相关资源
最近更新 更多