PDF öffnen, ohne das GUI einfriert

Fragen zu Tkinter.
Antworten
tobi45f
User
Beiträge: 24
Registriert: Montag 22. Februar 2021, 14:31

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
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

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()
tobi45f
User
Beiträge: 24
Registriert: Montag 22. Februar 2021, 14:31

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!
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Nein. Shell=True sprenkelt nur eine extra Shell dazwischen. Die bräuchtest du nur bei zb glob Ausdrücken etc.
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

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.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Antworten