简介
我在尝试学习 PyQt5 时遇到了一个问题。
到目前为止,在我寻找问题的答案和理解的过程中,我大多是空手而归。我发现很多链接和帖子根本不适用于 python 甚至 Qt5,这并不奇怪,因为 SIGABRT 适用于内存分配等多个方面(如果我错了请纠正我)。
我相当确定错误源于诸如和类似于
的行buttonEnv.clicked.connect(lambda: self.btnClicked(buttonEnv))
但一直无法找到或弄清楚它是什么。可能是因为我缺乏对 python 的了解。
系统
-操作系统: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 debugger: process 22588 is connecting
Connected to pydev debugger (build 171.4249.47)
Process finished with exit code 134 (interrupted by signal 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_())
无论如何,感谢阅读,我希望有人可以帮助我解决这个问题。如果需要更多信息,我会很乐意提供,但据我所知这应该足够了。
最佳答案
问题是你在类里面这样做:
class MainWindow(QMainWindow):
screenHome = HomeScreen()
这意味着您正在尝试创建一个 HomeScreen
在一开始,甚至在您的主 block 运行之前。
由于您要分配 self.screenHome
无论如何稍后适当:
def initUI(self):
# [...]
self.screenHome = HomeScreen()
您可以简单地摆脱一级类(class)。
顺便说一句,faulthandler
module在跟踪这样的事情时很有用 - 当放置 import faulthandler; faulthandler.enable()
时在顶部,Python 告诉您在哪一行发生了什么事——在本例中它指向 HomeScreen.__init__
。所以我只需要弄清楚 HomeScreen
在哪里对象创建于 QApplication
之前.
关于linux - Python 3.6; PyQt5;架构Linux;被信号 6 : SIGABRT 中断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43965788/