2016-09-16 1 views
0

Ich folge ein Tutorial über die Erstellung einer grundlegenden GUI mit QT-Ersteller und Python. Ich habe erfolgreich ein Fenster mit einer Schaltfläche erstellt, die das Fenster beim Drücken schließt. Es funktioniert gut in QT Creator und ich konvertierte die UI-Datei in Py und es läuft und erstellt das Fenster wie erwartet, wenn ich ein Eingabeaufforderungsfenster öffne und es mit python main.py aufrufen. Ich arbeite gerne in der spyder IDE und möchte das auch weiterhin tun. Das Problem ist, dass wenn ich die main.py in spyder öffnen und führen Sie es zuerstQT Creator konvertiert ui zu py arbeitet in Windows-Terminal, aber nicht mit Spyder IDE

An exception has occurred, use %tb to see the full traceback. 

SystemExit: -1 

dann den Fehler geben, wenn ich versuchen, es ein zweites Mal der Kernel hängen zu laufen.

Was ist erforderlich, um dieses Skript erfolgreich in Spyder auszuführen? Hier ist der Code:

from PyQt4 import QtCore, QtGui 

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(_fromUtf8("MainWindow")) 
     MainWindow.resize(400, 300) 
     self.centralWidget = QtGui.QWidget(MainWindow) 
     self.centralWidget.setObjectName(_fromUtf8("centralWidget")) 
     self.horizontalLayout = QtGui.QHBoxLayout(self.centralWidget) 
     self.horizontalLayout.setMargin(11) 
     self.horizontalLayout.setSpacing(6) 
     self.horizontalLayout.setObjectName(_fromUtf8("horizontalLayout")) 
     self.pushButton = QtGui.QPushButton(self.centralWidget) 
     self.pushButton.setObjectName(_fromUtf8("pushButton")) 
     self.horizontalLayout.addWidget(self.pushButton) 
     MainWindow.setCentralWidget(self.centralWidget) 
     self.menuBar = QtGui.QMenuBar(MainWindow) 
     self.menuBar.setGeometry(QtCore.QRect(0, 0, 400, 21)) 
     self.menuBar.setObjectName(_fromUtf8("menuBar")) 
     MainWindow.setMenuBar(self.menuBar) 
     self.mainToolBar = QtGui.QToolBar(MainWindow) 
     self.mainToolBar.setObjectName(_fromUtf8("mainToolBar")) 
     MainWindow.addToolBar(QtCore.Qt.TopToolBarArea, self.mainToolBar) 
     self.statusBar = QtGui.QStatusBar(MainWindow) 
     self.statusBar.setObjectName(_fromUtf8("statusBar")) 
     MainWindow.setStatusBar(self.statusBar) 

     self.retranslateUi(MainWindow) 
     QtCore.QObject.connect(self.pushButton, QtCore.SIGNAL(_fromUtf8("clicked()")), MainWindow.close) 
     QtCore.QMetaObject.connectSlotsByName(MainWindow) 

    def retranslateUi(self, MainWindow): 
     MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow", None)) 
     self.pushButton.setText(_translate("MainWindow", "Close", None)) 


if __name__ == "__main__": 
    import sys 
    app = QtGui.QApplication(sys.argv) 
    MainWindow = QtGui.QMainWindow() 
    ui = Ui_MainWindow() 
    ui.setupUi(MainWindow) 
    MainWindow.show() 
    sys.exit(app.exec_()) 
+0

Wie läuft es von Spyder? Rufen Sie es gerade von einer Konsole in der IDE an? Hat Spyder eine Möglichkeit, externe Prozesse zu starten? –

+0

Ich öffne die Datei und drücke dann run (f5). Ich bin nicht sicher über Ihre dritte Frage – kaminsknator

Antwort

0

Es ist schwer zu sagen, ohne die eigentliche Traceback. Ich vermute, es ist eines von zwei Dingen, die beide mit der Tatsache zusammenhängen, dass Spyder auch auf Qt basiert.

  1. Sie versuchen, Ihre App innerhalb der Spyder-Umgebung auszuführen. Ihre App versucht einen QApplication zu erstellen, aber da Spyder bereits auf Qt läuft, ist bereits ein QApplication vorhanden und es kommt zu Fehlern.

  2. Nicht übereinstimmende Versionen von PyQt/Qt. Ich gehe davon aus, dass Spyder mit seiner eigenen Version von Qt/PyQt ausgeliefert wird und Sie Spyder nicht installieren müssen. Aber ich schätze, Sie haben auch Ihre eigene Version von Qt/PyQt installiert und PyQt lädt die falschen DLLs (die mit Spyder gelieferten und nicht die, die Sie installierten).

einige Dinge zu überprüfen:

  • Überprüfen Sie, dass Sie einen externen Prozess von Spyder sind startet (dh in einem brandneuen Schale mit einem neuen Python-Prozess) und nicht einfach läuft die Code innerhalb des Spyder eingebetteten Python-Prozesses. Ich kenne Spyder nicht gut genug, um zu wissen, wie man das macht, aber die meisten IDEs haben einige Einstellungen, die steuern, wie externe Prozesse gestartet werden.

  • Überprüfen Sie die PATH Umgebungsvariable von Ihrem gestarteten Skript. Es ist möglich, dass das Spyder-Verzeichnis vor der Installation von Qt hinzugefügt wird, was dazu führt, dass die Spyder Qt-DLLs beim Import von PyQt anstelle Ihrer Systeminstallation von Qt geladen werden.

+0

Interessant, danke für Ihre Einsicht. Unter Tools, Einstellungen, Ausführen gibt es drei Optionen für die Konsole. Die einzige, die nicht funktioniert, wird in der aktuellen Python- oder Ipython-Konsole ausgeführt. Mit den anderen beiden Optionen kann das Skript ausgeführt und das Fenster angezeigt werden. – kaminsknator