2014-03-24 8 views
19

Ich benutze Python 3 und PyQt5. Hier ist mein Test PyQt5 Programm, konzentrieren sich auf den letzten 2 Zeilen:Sollte ich `app.exec()` oder `app.exec _()` in meiner PyQt-Anwendung verwenden?

from PyQt5.QtCore import * 
from PyQt5.QtWidgets import * 
import sys 

class window(QWidget): 
def __init__(self,parent=None): 
    super().__init__(parent) 
    self.setWindowTitle('test') 
    self.resize(250,200) 

app=QApplication(sys.argv) 
w=window() 
w.show() 
sys.exit(app.exec()) 
#sys.exit(app.exec_()) 

Ich weiß exec eine Sprache Schlüsselwort in Python ist. Aber Code auf Official PyQt5 Documentation(speziell die Object Destruction am Exit Teil). Ich sehe, dass dieses Beispiel die Verwendung von app.exec() zeigt, was mich verwirrt.

Als ich es auf meinem Rechner getestet habe. Ich fand, dass es keinen sichtbaren Unterschied von meinem Ende gibt. Sowohl mit als auch ohne _ erzeugt die gleiche Ausgabe in keiner Zeitdifferenz.

Meine Frage ist:

  • Gibt es etwas falsch läuft, wenn ich app.exec() verwenden? wie mit Pythons internen exec kollidieren? Ich vermute, weil beide exec etwas ausführen.
  • Wenn nicht, kann ich beide austauschbar verwenden?
+1

In PyQt5 benötigen Sie überhaupt nicht 'sys.exit()'. 'app.exec _()' oder 'app.exec()' alleine ist genug und es funktioniert normal. Sie haben einige Dinge in PyQt5 unter der Haube behoben, so dass Sie diese 'sys.exit()' nicht mehr benötigen. Wenn Sie möchten, dass Ihr Code auf PyQt4 läuft, dann haben Sie 'sys.exit()' dort. Außerdem sind 'app.exec _()' und 'app.exec()' austauschbar, so dass Sie beliebig verwenden können. Wenn Sie möchten, dass Ihr Code auch auf PyQt4 läuft, dann bleiben Sie bei 'app.exec _()'. Also, die Quintessenz ist: Damit Ihr Code richtig auf PyQt5 ** und ** PyQt4 funktioniert, verwenden Sie 'sys.exit (app.exec _())'. –

+0

@ Boštjan Mejak .. hoora für Ihren Kommentar und Erklärung! Mehr upvotes benötigt sicher! Der erste Kommentar, den ich bisher gefunden habe, erklärt diese kleinen Unterschiede, die ich im Code bemerkt habe. Der Wechsel von pyqt4 zu pyqt5 ist wie das Lernen, wieder zu lesen (muss zugeben ... 10 Jahre nicht programmieren macht einen ein bisschen rostig ... und Python knallt auch ein paar Funbälle unter die Haube). – ZF007

+0

@ BoštjanMejak: Sie brauchen 'sys.exit()' sonst führt 'app.exit (1)' Aufruf nicht zum entsprechenden Exit-Status, dh, verwenden Sie selbst bei Python 3 und PyQt5 'sys.exit (app. exec()) '. – jfs

Antwort

33

Das ist, weil bis Python 3, execwas a reserved keyword, so dass der PyQt Devs Unterstrich hinzugefügt. Ab Python 3 exec ist no longer a reserved keyword (weil es eine eingebaute Funktion ist; gleiche Situation wie print), so machte es in PyQt5 Sinn, eine Version ohne Unterstrich mit C++ - Dokumenten zu konsistent zu machen, aber eine Version mit Unterstrich für rückwärts zu behalten Kompatibilität. Für PyQt5 mit Python 3 sind also die beiden Funktionen exec identisch. Für ältere PyQt ist nur exec_() verfügbar.

5

Auf die Frage, ob man einen über den anderen bevorzugt: Mit exec_ haben Sie weniger Bedenken, wenn Sie sich entscheiden, Support für PyQt4 und/oder Python> = 2.6 hinzuzufügen und einen einzigen zu pflegen Code-Basis.

Verwandte Themen