Frage

Ich schreibe ein GUI-Programm mit PyQt4. Es gibt einen Knopf in meinem Hauptfenster und durch einen Klick auf diese Schaltfläche. Ich hoffe, einen Hintergrundprozess zu starten Welches ist eine Instanz einer Klasse abgeleitete von processing.Process.

class BackgroundTask(processing.Process):
    def __init__(self, input):
        processing.Process.__init__(self)
        ...

    def run(self):
        ...

(Beachten Sie, dass ich den python2.5 Port verwenden der Python-Multiprocessing erhaltenen von http://code.google.com/p/python-multiprocessing/ aus diesem Grund ist es processing.Process statt multiprocessing.Process. Ich denke, das sollte keinen Unterschied machen. Bin ich richtig?)

Der Code mit dem Button-Klick-Signal ist etwas einfach wie

 processing.freezeSupport()
 task = BackgroundTask(input)
 task.start()

Das Programm funktioniert wie unter dem Python-Interpreter erwartet, das heißt wenn es von der Kommandozeile „Python myapp.py“ gestartet.

Doch nach I-Paket, das Programm py2exe verwenden, jedes Mal, wenn ich auf diese Schaltfläche klicken, wird stattdessen zum Starten der Hintergrundaufgabe, eine Kopie das Hauptfenster erscheint. ich bin mir nicht sicher Was ist der Grund für dieses Verhalten. ich vermute es wird auf die folgende Anmerkung im Zusammenhang adressiert beim http://docs.python.org/library/multiprocessing.html#multiprocessing-programming

"Funktionalität innerhalb dieses Pakets erfordert, dass die Haupt Methode von den Kindern importierbar sein. Diese Programmierung Richtlinien abgedeckt ist jedoch lohnt es mich, hier den Hinweis auf. Dies bedeutet, dass einige Beispiele, wie das Multiprocessing .Pool Beispiele wird nicht funktionieren in der interaktiven Interpreter „

Der einzige Ort, ich habe, wenn Namen == " Haupt " ist in dem Hauptmodul wie in einem typischen pyqt Programm

if __name__ == "__main__":
    a = QApplication(sys.argv)
    QObject.connect(a,SIGNAL("lastWindowClosed()"),a,SLOT("quit()"))
    w = MainWindow()
    w.show()
    a.exec_()

Jede Lösungen, wie dieses Problem zu beheben? Dank!

War es hilfreich?

Lösung

Ich denke, Ihr eigentliches Problem damit zu tun hat:

  

Das Programm funktioniert wie unter dem Python-Interpreter erwartet, das heißt, wenn es von der Kommandozeile „Python myapp.py“ gestartet wird.

     

Allerdings, nachdem ich das Programm mit py2exe verpacken, jedes Mal, wenn ich auf diese Schaltfläche klicken,> statt die Hintergrundaufgabe startet, wird eine Kopie des Hauptfensters erscheint.

Sie benötigen einen speziellen Aufruf an die freeze_support () Funktion hinzuzufügen, um das Multiprocessing Module arbeitet mit „eingefroren“ ausführbaren Dateien zu machen (zum Beispiel jene, die mit py2exe):

if __name__ == "__main__":
    # add freeze support
    processing.freeze_support()
    a = QApplication(sys.argv)
    QObject.connect(a,SIGNAL("lastWindowClosed()"),a,SLOT("quit()"))
    w = MainWindow()
    w.show()
    a.exec_()

Referenz: http://docs.python.org/library/multiprocessing. html # multiprocessing.freeze_support

Andere Tipps

„Funktionalität innerhalb dieses Pakets erfordert, dass die wichtigste Methode von den Kindern importierbar sein.“

Ich denke, das bedeutet Sie main () Funktion definiert irgendwo haben müssen.

Die Frage ist über Python 2 und gelöst wurde. Für Python 3, würde es wie folgt aussehen:

from multiprocessing import freeze_support

if __name__ == '__main__':
    freeze_support()

    a = QApplication(sys.argv)
    ...
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top