Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在spyder中从一个提示符运行pyqt应用程序两次_Python_Pyqt4_Spyder - Fatal编程技术网

Python 在spyder中从一个提示符运行pyqt应用程序两次

Python 在spyder中从一个提示符运行pyqt应用程序两次,python,pyqt4,spyder,Python,Pyqt4,Spyder,我在spyder中运行pyqt4应用程序,使用QtGui.QMainWindow.close()退出,它将我返回到spyder python解释器提示符。但是,如果我再次尝试运行应用程序runfile('C:/Python33/~/qtapp.py',wdir=r'C:/Python33/~/Appdir')则不会显示窗口。我必须关闭python解释器窗口并打开一个新窗口,然后才能再次运行我的pyqt4应用程序。这向我表明我是 未正确关闭应用程序 未正确运行应用程序 我希望能够在同一提示符下运行

我在
spyder
中运行
pyqt4
应用程序,使用
QtGui.QMainWindow.close()
退出,它将我返回到
spyder python解释器
提示符。但是,如果我再次尝试运行应用程序
runfile('C:/Python33/~/qtapp.py',wdir=r'C:/Python33/~/Appdir')
则不会显示窗口。我必须关闭python解释器窗口并打开一个新窗口,然后才能再次运行我的
pyqt4
应用程序。这向我表明我是

  • 未正确关闭应用程序
  • 未正确运行应用程序
  • 我希望能够在同一提示符下运行
    pyqt4
    应用程序,这将加快我的开发时间

    下面是示例代码:

    from PyQt4 import QtCore, QtGui, Qwt5
    import sys
    
    try:
        _fromUtf8 = QtCore.QString.fromUtf8
    except AttributeError:
        def _fromUtf8(s):
            return s
    try:
        _encoding = QtGui.QApplication.UnicodeUTF8
        def _translate(context, text, disambig):
            return QtGui.QApplication.translate(context, text, disambig, _encoding)
    except AttributeError:
        def _translate(context, text, disambig):
            return QtGui.QApplication.translate(context, text, disambig)
    
    
    class Ui_MainWindow(object):
        def setupUi(self, MainWindow):
            MainWindow.setObjectName("MainWindow")
            MainWindow.resize(200, 200)
            self.checkBox = QtGui.QCheckBox(MainWindow)
            self.checkBox.setGeometry(QtCore.QRect(100, 100, 70, 17))
            self.checkBox.setObjectName("checkBox")
    
    
            self.retranslateUi(MainWindow)
            QtCore.QMetaObject.connectSlotsByName(MainWindow)
    
        def retranslateUi(self, MainWindow):
            MainWindow.setWindowTitle(QtGui.QApplication.translate("MainWindow", "Dialog",None, QtGui.QApplication.UnicodeUTF8))
            self.checkBox.setText(QtGui.QApplication.translate("MainWindow", "CheckBox", None, QtGui.QApplication.UnicodeUTF8))
    
    
    
    class MainWindow(QtGui.QMainWindow,Ui_MainWindow):
    
        def __init__(self):
            super(MainWindow, self).__init__()     
            self.setupUi(self)
    
    
    app = QtGui.QApplication(sys.argv)
    form = MainWindow()
    form.show()
    app.exec_()
    
    在我运行它之后,一旦窗口显示,在我再次运行它之后,窗口不会显示, 以下是我的版本信息:

    win32上的Python 3.3.2(v3.3.2:d047928ae3f6,2013年5月16日,00:03:43)[MSC v.1600 32位(英特尔)] 有关详细信息,请键入“帮助”、“版权”、“信用证”或“许可证”

    导入的NumPy 1.7.1、SciPy 0.12.0、Matplotlib 1.3.0+GUI数据1.6.1、GUI数据2.3.1
    键入“scientific”了解更多详细信息。

    我也遇到了同样的问题。下面的简单示例再现了这个问题(使用python 3.4)

    当您第一次运行它时,关闭窗口并运行第二次将失败。您可以在spyder中使用重置内核,但这会减慢开发时间

    对我有用的是打字

    %重置

    在当前内核的命令行上。这将重置变量QtCriticalMsg、QtSystemMsg等。之后,您可以重新运行代码

    虽然这比重新启动内核稍微快一点,但仍然很烦人。显然,关闭窗口后,Qt变量不会从内存中清除。有人建议退出后如何强制清除程序中的内存吗?这可能会避免每次键入reset并解决问题

    import sys
    from PyQt4.QtCore import *
    from PyQt4.QtGui import *
    class Form(QDialog):
    
        def __init__(self, parent=None):
            super(Form, self).__init__(parent)
            self.setAttribute(Qt.WA_DeleteOnClose)
    
            buttonBox = QDialogButtonBox(QDialogButtonBox.Ok|
                                         QDialogButtonBox.Cancel)
            grid = QGridLayout()
            grid.addWidget(buttonBox, 4, 0, 1, 2)
            self.setLayout(grid)
    
            self.connect(buttonBox, SIGNAL("accepted()"),
                         self, SLOT("accept()"))
            self.connect(buttonBox, SIGNAL("rejected()"),
                         self, SLOT("reject()"))
            self.setWindowTitle("Set Number Format (Modal)")
    
    
    if __name__=="__main__":
        app = QApplication(sys.argv)
        form = Form()
        form.show()
        app.exec_()
    

    我也有同样的问题。下面的简单示例再现了这个问题(使用python 3.4)

    当您第一次运行它时,关闭窗口并运行第二次将失败。您可以在spyder中使用重置内核,但这会减慢开发时间

    对我有用的是打字

    %重置

    在当前内核的命令行上。这将重置变量QtCriticalMsg、QtSystemMsg等。之后,您可以重新运行代码

    虽然这比重新启动内核稍微快一点,但仍然很烦人。显然,关闭窗口后,Qt变量不会从内存中清除。有人建议退出后如何强制清除程序中的内存吗?这可能会避免每次键入reset并解决问题

    import sys
    from PyQt4.QtCore import *
    from PyQt4.QtGui import *
    class Form(QDialog):
    
        def __init__(self, parent=None):
            super(Form, self).__init__(parent)
            self.setAttribute(Qt.WA_DeleteOnClose)
    
            buttonBox = QDialogButtonBox(QDialogButtonBox.Ok|
                                         QDialogButtonBox.Cancel)
            grid = QGridLayout()
            grid.addWidget(buttonBox, 4, 0, 1, 2)
            self.setLayout(grid)
    
            self.connect(buttonBox, SIGNAL("accepted()"),
                         self, SLOT("accept()"))
            self.connect(buttonBox, SIGNAL("rejected()"),
                         self, SLOT("reject()"))
            self.setWindowTitle("Set Number Format (Modal)")
    
    
    if __name__=="__main__":
        app = QApplication(sys.argv)
        form = Form()
        form.show()
        app.exec_()
    

    我也经历过同样的问题,但从未真正找到真正的解决办法。然而,我已经找到了一个解决问题的方法,并且也适用于Eelco van Vliet回答中的示例代码

    问题似乎在于Python解释器中存储了一个全局QApplication,在程序调用之间不会被销毁。我没有在执行开始时实例化新的QApplication,而是检查它是否存在,如果存在,则使用现有的QApplication,而不是创建新的QApplication:

    if __name__=="__main__":
        if QCoreApplication.instance() != None:
            app = QCoreApplication.instance()
        else:
            app = QApplication(sys.argv)
        form = Form()
        form.show()
        app.exec_()
    

    我也经历过同样的问题,但从未真正找到真正的解决办法。然而,我已经找到了一个解决问题的方法,并且也适用于Eelco van Vliet回答中的示例代码

    问题似乎在于Python解释器中存储了一个全局QApplication,在程序调用之间不会被销毁。我没有在执行开始时实例化新的QApplication,而是检查它是否存在,如果存在,则使用现有的QApplication,而不是创建新的QApplication:

    if __name__=="__main__":
        if QCoreApplication.instance() != None:
            app = QCoreApplication.instance()
        else:
            app = QApplication(sys.argv)
        form = Form()
        form.show()
        app.exec_()
    

    要在Spyder中再次运行PyQt应用程序,必须删除/销毁正在运行的应用程序,但我们不能使用sys.exit(),因为它将尝试关闭Python。一个适合我的解决方案(Python 3.4.1、Spyder 2.3.5.2、PyQt 4.10.4)是使用
    QtCore.QCoreApplication.instance().quit()
    deleteLater
    ,如本例所示:

    import sys
    from PyQt4 import QtGui, QtCore
    
    class Window(QtGui.QMainWindow):
        """PyQt app that closes successfully in Spyder.
        """
        def __init__(self):
            super().__init__()
            self.setGeometry(200, 100, 400, 300)
            self.button()
    
        def button(self):
            btn = QtGui.QPushButton('Quit', self)
            btn.setGeometry(150, 125, 100, 50)
            btn.clicked.connect(self.quitApp)
    
        def quitApp(self):
            QtCore.QCoreApplication.instance().quit()
    
    if __name__ == '__main__':
        app = QtGui.QApplication(sys.argv)
        app.aboutToQuit.connect(app.deleteLater)
        win = Window()
        win.show()
        app.exec_()
    

    要在Spyder中再次运行PyQt应用程序,必须删除/销毁正在运行的应用程序,但我们不能使用sys.exit(),因为它将尝试关闭Python。一个适合我的解决方案(Python 3.4.1、Spyder 2.3.5.2、PyQt 4.10.4)是使用
    QtCore.QCoreApplication.instance().quit()
    deleteLater
    ,如本例所示:

    import sys
    from PyQt4 import QtGui, QtCore
    
    class Window(QtGui.QMainWindow):
        """PyQt app that closes successfully in Spyder.
        """
        def __init__(self):
            super().__init__()
            self.setGeometry(200, 100, 400, 300)
            self.button()
    
        def button(self):
            btn = QtGui.QPushButton('Quit', self)
            btn.setGeometry(150, 125, 100, 50)
            btn.clicked.connect(self.quitApp)
    
        def quitApp(self):
            QtCore.QCoreApplication.instance().quit()
    
    if __name__ == '__main__':
        app = QtGui.QApplication(sys.argv)
        app.aboutToQuit.connect(app.deleteLater)
        win = Window()
        win.show()
        app.exec_()
    

    这实际上似乎是IPython内核及其与PyQt交互的问题。基本上,IPython似乎挂起了Qt实例,需要在重新实例化之前清除它。这可以非常简单地通过将保存Qt实例的变量重新绑定到其他变量来实现:

    app = 0
    app = QtGui.QApplication([])
    ...
    sys.exit(app.exec_())
    

    这是从中派生出来的,这是从中派生出来的(并进行了更全面的解释)。

    这实际上似乎是IPython内核及其与PyQt的交互存在问题。基本上,IPython似乎挂起了Qt实例,需要在重新实例化之前清除它。这可以非常简单地通过将保存Qt实例的变量重新绑定到其他变量来实现:

    app = 0
    app = QtGui.QApplication([])
    ...
    sys.exit(app.exec_())
    

    这是从中派生出来的,这是从中派生出来的(并进行了更全面的解释)。

    (这里是Spyder dev)你能不能发布一个我可以在我这边测试的最小示例?再次查看上面的帖子…可能的重复(这里是Spyder dev)你能发布一个我可以在我这边测试的最小示例吗?再次查看上面的帖子…可能的重复