简介
我在尝试学习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 version: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: 进程22588正在连接
连接到pydev调试器(build 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_())
无论如何,感谢阅读,我希望有人能够帮助我。如果需要更多信息,我很乐意提供,但据我所知,这应该足够了。
答案 0 :(得分:1)
问题是你在课堂上这样做:
class MainWindow(QMainWindow):
screenHome = HomeScreen()
这意味着您在一开始就尝试创建HomeScreen
,甚至在您的主要块运行之前。
由于您以后正确分配self.screenHome
:
def initUI(self):
# [...]
self.screenHome = HomeScreen()
你可以简单地摆脱第一级课程。
顺便说一句,faulthandler
module对于跟踪此类内容非常有用 - 将import faulthandler; faulthandler.enable()
置于顶部时,Python会告诉您发生了什么事情 - 在此它指向HomeScreen.__init__
,所以我只需要弄清楚在HomeScreen
之前创建QApplication
对象的位置。