gpt4 book ai didi

python - PyQt 应用程序因错误而关闭

转载 作者:太空宇宙 更新时间:2023-11-03 13:49:19 27 4
gpt4 key购买 nike

我在使用 PyQt 创建窗口应用程序时遇到了一些问题。例如:我们有以下 GUI 类:

class SampleMainWindow(QtGui.QMainWindow):   
def __init__(self, parent=None):
...

def hideEvent(self, event):
...

def showEvent(self, event):
...

def activate(self):
...

def closeEvent(self, event):
...

如果我们只想将它用于显示结果和接受用户输入,并且对于所有控制逻辑,我们有另一个类,它使用 SampleMainWindow 的实例作为字段怎么办:

class Programm:
def __init__(self):
self.window = SampleMainWindow()
....

app = QtGui.QApplication(sys.argv)
prog = Programm()
prog.window.show()
app.exec_()

因此,如果我们创建Programm 的实例,应用程序将运行良好,但在关闭时我们会得到一个错误,即python.exe 进程无法正常完成。但是如果 SampleMainWindow 的实例不是类的字段:

class Programm:
def __init__(self):
win = SampleMainWindow()
....

应用程序关闭良好。这是什么原因?

这里是完整版的 Gui 类:

class SampleMainWindow(QtGui.QMainWindow):

def initTray(self):
self.icon = QtGui.QSystemTrayIcon()
self.icon.setIcon(QtGui.QIcon('Tray.png'))
self.icon.show()
self.icon.activated.connect(self.activate)

def __init__(self, parent=None):
QtGui.QMainWindow.__init__(self)
moduleglobalconstants.APP_RUNNING = True
self.initTray()
self.newSession = True

self.setGeometry(300, 300, 600, 400)
self.setWindowTitle('Eye: Recently Added Lines')
self.statusBar().showMessage('Ready')
exitAction = QtGui.QAction(QtGui.QIcon('Exit.png')
,'Exit'
,self)

exitAction.setShortcut('Ctrl+Q')
exitAction.setStatusTip('Exit application')
self.connect(exitAction
,QtCore.SIGNAL('triggered()')
,QtCore.SLOT('close()'))

menubar = self.menuBar()
fileMenu = menubar.addMenu('&File')
fileMenu.addAction(exitAction)

self.toolbar = self.addToolBar('Exit')
self.toolbar.addAction(exitAction)

self.textEdit = QtGui.QTextEdit()
self.scrollPosition = self.textEdit.textCursor()
self.textEdit.setReadOnly(True)
self.setCentralWidget(self.textEdit)

def hideEvent(self, event):
self.hidden = True
self.setWindowFlags(QtCore.Qt.ToolTip)
self.setVisible(False)

def showEvent(self, event):
self.hidden = False
self.setVisible(True)

def activate(self):

self.setWindowFlags(QtCore.Qt.Window)
self.show()
self.setWindowState(self.windowState() & ~QtCore.Qt.WindowMinimized | QtCore.Qt.WindowActive)
self.activateWindow()

def questionDialog(self, caption = 'Message',text = "Are you sure?"):
self.activate()
msgBox = QtGui.QMessageBox(self)
msgBox.setWindowTitle("Eye")
msgBox.setText(caption);
msgBox.setInformativeText(text);
msgBox.setStandardButtons(QtGui.QMessageBox.Yes| QtGui.QMessageBox.No);
msgBox.setDefaultButton(QtGui.QMessageBox.Yes);
return msgBox.exec_()

def criticalDialog(self,app, caption = 'Eye: Critical Error',text = "Impossible to continue working!"):
self.activate()
msgBox = QtGui.QMessageBox.critical(self,caption,text)
moduleglobalconstants.APP_RUNNING = False

def closeEvent(self, event):
reply = self.questionDialog()
if reply == QtGui.QMessageBox.Yes:
moduleglobalconstants.APP_RUNNING = False
event.accept()
else:
event.ignore()

def showNewLines(self, singleLine = None, lines = None, mode='insert'):
if (mode == 'rewrite'):
self.textEdit.clear()
if lines:
for line in lines:
self.textEdit.insertPlainText(line.strip() + "\n")
elif singleLine:
self.textEdit.insertPlainText(singleLine.strip()+"\n")

最佳答案

这与 python 的垃圾收集有关——因为(几乎)很快一个对象就不再被引用了,它会销毁它,所以我想只要窗口没有被垃圾收集,进程就不会终止。

你可以尝试在末尾添加 del Programm.window 或类似的东西(可能有更好的方法,但我自己从未编写过 QT,所以我不能在这里帮助你)

关于python - PyQt 应用程序因错误而关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12827305/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com