2017-05-14 42 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