2017-05-14 15 views
1

介绍Python 3.6; PyQt5; arch linux;通过信号中断6:SIGABRT

您好,我是一个长期的潜伏者,但第一次的海报。 我在尝试学习PyQt5时遇到了一个问题。

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

我相当肯定的是,错误从线,如茎和类似

buttonEnv.clicked.connect(拉姆达: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支持--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_()) 

不管怎么说,感谢您的阅读,我希望有人也许能够帮助我。如果需要更多信息,我会很乐意提供,但据我所知,这应该足够了。

问候Alpeace

+0

当您以发行模式/从CLI运行时,您是否获得了SIGABRT? – Paul92

+0

当从命令行运行时,我得到“QWidget:必须在QWidget中止之前构建QApplication(核心转储)”。改变代码来构造QApplication首先会给我带来其他错误,因为类未定义等。这是我对python的缺乏经验可悲的地方。 – Alpeace

回答

0

问题是你在类级别这样做:

class MainWindow(QMainWindow): 

    screenHome = HomeScreen() 

这意味着你想在一开始就建立一个HomeScreen,甚至是你的主块之前在跑。

既然你分配self.screenHome以后正确反正:

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

你可以简单地摆脱一流水平之一。

顺便说一句,在faulthandlermodule在这样下来跟踪有用的东西 - 在顶部把一个import faulthandler; faulthandler.enable()时,巨蟒告诉你在哪一行发生了一件事 - 在此情况下,它指出HomeScreen.__init__所以我只有找出在QApplication之前HomeScreen对象的创建位置。

+0

感谢您的帮助,解决了我的问题!还要感谢关于错误处理程序的提示,非常有用! – Alpeace