关闭后无法杀死 PyQT Window。这需要我重新启动内核
Can't Kill PyQT Window after closing it. Which requires me to restart the kernal
我想我没有正确关闭我的 PyQT5 Window。我正在使用与 anaconda 一起安装的 spyder (3.3.5) 来编写 pyqt5 程序。我正在使用 qt creator 设计我的 ui 文件,我使用 pyqt 包中的 loadUi 函数加载它。代码一切正常,直到我需要关闭它。我通过关闭按钮(右上角的 x 按钮)关闭 window。 window 本身已关闭,但控制台(或 shell)似乎卡住了,我无法给它进一步的命令或重新 运行 程序,而不必重新启动内核(完全关闭我的 IDE 并重新打开它)。
我曾尝试在互联网上寻找问题的解决方案,但 none 似乎对我有用。包括将 IPython 控制台 > 图形更改为自动。
编辑:还创建了一个问题:
https://github.com/spyder-ide/spyder/issues/9991
import sys
from PyQt5 import QtWidgets,uic
from PyQt5.QtWidgets import QMainWindow
class Mic_Analysis(QMainWindow):
def __init__(self):
QMainWindow.__init__(self)
self.ui=uic.loadUi("qt_test.ui",self)
...
if __name__ == "__main__":
def run_app():
if not QtWidgets.QApplication.instance():
app = QtWidgets.QApplication(sys.argv)
else:
app=QtWidgets.QApplication.instance()
mainWin=Mic_Analysis()
mainWin.show()
app.exec_()
run_app()
如果有人有任何建议,我会很高兴听到他们。
对我来说,它有助于删除 'app.exec_()' 命令。
但是当 运行 代码时它会立即关闭。为了保持 window 打开,我需要将 MainWindow 实例 return 到全局范围(或使其成为全局对象)。我的代码如下所示:
from PyQt5 import QtWidgets
import sys
def main():
if not QtWidgets.QApplication.instance():
app = QtWidgets.QApplication(sys.argv)
else:
app = QtWidgets.QApplication.instance()
main = MainWindow()
main.show()
return main
if __name__ == '__main__':
m = main()
令人惊讶的是,这对我来说效果很好。不需要 QApplication。
它似乎在另一个线程中工作。
from PyQt5 import QtWidgets,uic
class Ui(QtWidgets.QDialog):
def __init__(self):
super().__init__()
uic.loadUi('./test.ui',self)
self.show()
w=Ui()
尝试添加:
app.setQuitOnLastWindowClosed(True)
到您的 main() 函数
def main():
app = QApplication(sys.argv)
app.setQuitOnLastWindowClosed(True)
win = MainWindow()
win.show()
sys.exit(app.exec_())
我想我没有正确关闭我的 PyQT5 Window。我正在使用与 anaconda 一起安装的 spyder (3.3.5) 来编写 pyqt5 程序。我正在使用 qt creator 设计我的 ui 文件,我使用 pyqt 包中的 loadUi 函数加载它。代码一切正常,直到我需要关闭它。我通过关闭按钮(右上角的 x 按钮)关闭 window。 window 本身已关闭,但控制台(或 shell)似乎卡住了,我无法给它进一步的命令或重新 运行 程序,而不必重新启动内核(完全关闭我的 IDE 并重新打开它)。
我曾尝试在互联网上寻找问题的解决方案,但 none 似乎对我有用。包括将 IPython 控制台 > 图形更改为自动。
编辑:还创建了一个问题: https://github.com/spyder-ide/spyder/issues/9991
import sys
from PyQt5 import QtWidgets,uic
from PyQt5.QtWidgets import QMainWindow
class Mic_Analysis(QMainWindow):
def __init__(self):
QMainWindow.__init__(self)
self.ui=uic.loadUi("qt_test.ui",self)
...
if __name__ == "__main__":
def run_app():
if not QtWidgets.QApplication.instance():
app = QtWidgets.QApplication(sys.argv)
else:
app=QtWidgets.QApplication.instance()
mainWin=Mic_Analysis()
mainWin.show()
app.exec_()
run_app()
如果有人有任何建议,我会很高兴听到他们。
对我来说,它有助于删除 'app.exec_()' 命令。 但是当 运行 代码时它会立即关闭。为了保持 window 打开,我需要将 MainWindow 实例 return 到全局范围(或使其成为全局对象)。我的代码如下所示:
from PyQt5 import QtWidgets
import sys
def main():
if not QtWidgets.QApplication.instance():
app = QtWidgets.QApplication(sys.argv)
else:
app = QtWidgets.QApplication.instance()
main = MainWindow()
main.show()
return main
if __name__ == '__main__':
m = main()
令人惊讶的是,这对我来说效果很好。不需要 QApplication。
它似乎在另一个线程中工作。
from PyQt5 import QtWidgets,uic
class Ui(QtWidgets.QDialog):
def __init__(self):
super().__init__()
uic.loadUi('./test.ui',self)
self.show()
w=Ui()
尝试添加:
app.setQuitOnLastWindowClosed(True)
到您的 main() 函数
def main():
app = QApplication(sys.argv)
app.setQuitOnLastWindowClosed(True)
win = MainWindow()
win.show()
sys.exit(app.exec_())