2017-05-14 14 views
1

イントロPython 3.6; PyQt5;アーチlinux;信号6によって中断:SIGABRT

こんにちは、私は長い時間のリードオンリーメンバーが、初めてのポスターです。 PyQt5の学習中に問題が発生しました。

これまでのところ、私が答えを探して問題を理解しているうちに、私はほとんど手を出していませんでした。私が見つけたたくさんのリンクや投稿は、PythonやQt5にはまったく当てはまりません.SIGABRTはメモリ割り当てなどのいくつかの面に当てはまるので奇妙ではありません。

私は、エラーがなどとbuttonEnv.clicked.connect(ラムダ:self.btnClicked(buttonEnv))

のような行に由来することをかなり確信している

しかし、持っていますそれが何であるかを特定することができなかった。おそらく、Pythonに私の知識が不足しているからです。

システム

-OS:アーチのLinux(Manjaro)4.9.27-1-MANJARO

-IDE:Pycharm 2017.1

-Pythonバージョン:3.6

-Using :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は、終了コード134で終了

処理(中断(171.4249.47ビルド)PyDevはデバッガに接続

を接続しています信号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を割り当てているので:あなたは、単にクラスレベル1を取り除くことができます

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

。ところで

faulthandlermoduleはこのようなものを追跡するのに便利です - 上部にimport faulthandler; faulthandler.enable()を入れたときに、Pythonは何が起こったかのライン何かにわかります - この場合はHomeScreen.__init__指さので、私が唯一持っていましたQApplicationの前にHomeScreenオブジェクトが作成されている場所を特定します。

+0

これは私の問題を解決したお手伝いをありがとう!また、faulthandlerについてのヒントについては、本当に便利です! – Alpeace

関連する問題