Seite 1 von 1

PDF öffnen, ohne das GUI einfriert

Verfasst: Freitag 26. November 2021, 11:31
von tobi45f
Hallo zusammen,

ich habe ein GUI Fenster für diverse Berechnungen und möchte ganz klassisch über F1 eine PDF öffnen, mit Erklärungen, so als Hilfe-Funktion. Ich bin nicht in der Lage die PDF-Datei so zu starten, dass die GUI nicht einfriert.
os.System
subprocess.call mit diversen Parameter
threading.Thread(target=os.system(pdfpath), args=(1,)).start()

irgendwie stehe ich auf dem Schlauch, warum das nicht funktioniert? Muss ich meine GUI dafür komplett umbauen? Ich muss doch irgendwie ein Befehl ausführen können, auf den nicht gewartet wird? :?
Gruß Tobias

Re: PDF öffnen, ohne das GUI einfriert

Verfasst: Freitag 26. November 2021, 11:42
von Sirius3
Wie immer hilft es, den Pythoncode zu sehen, und nicht nur Fragmente.
os.system sollte man nicht mehr verwenden.
target erwartet eine Funktion, und nicht den Exitcode vom os.system-Aufruf. Das args-Argument ist auch nicht sehr sinnoll, warum 1?
Damit der Prozess wieder sauber aufgeräumt wird, ist es am einfachsten, Threads zu benutzen.

Code: Alles auswählen

threading.Thread(target=subprocess.call, args=(["start", pdfpath],), daemon=True).start()

Re: PDF öffnen, ohne das GUI einfriert

Verfasst: Freitag 26. November 2021, 12:42
von tobi45f
Sorry, ich viele unterschiedliche Zeilen versucht, aber immer wieder gelöscht. Ich dachte, dass die Beschreibung und die Fragmente ausreichend wären.

Wenn ich nicht irre oder sonst was falsch gemacht habe, muss doch shell=True noch rein?

Code: Alles auswählen

threading.Thread(target=subprocess.call(["start", r"..pfad.pdf"], shell=True), daemon=True).start() 
so geht es auf jeden Fall. Vielen Dank!

Re: PDF öffnen, ohne das GUI einfriert

Verfasst: Freitag 26. November 2021, 12:45
von __deets__
Nein. Shell=True sprenkelt nur eine extra Shell dazwischen. Die bräuchtest du nur bei zb glob Ausdrücken etc.

Re: PDF öffnen, ohne das GUI einfriert

Verfasst: Freitag 26. November 2021, 13:23
von __blackjack__
Das Problem ist was immer Du als `target` da hin schreibst: das muss eine Funktion sein, oder was aufrubares, was `Thread` dann mit dem `start()`-Aufruf in einem eigenen Thread startet. Du rufst das aber schon selbst auf bevor das `Thread`-Objekt überhaupt erst erstellt ist. Dann blockiert das natürlich solange bis es fertig ist die GUI wenn Du das gar nicht in einem eigenen Thread startest.