michahe
Anmeldungsdatum: 12. Dezember 2013
Beiträge: 810
|
Hallo, auf meinem Weg, PYTHON zu erlernen, habe ich Probleme mit PySimpleGui: Als Beispiel möchte ich ein Fenster, um den Code abzubrechen oder fortzuführen. Ich habe:
| import PySimpleGUI as sg
layout = [[sg.Text("Test PySimpleGUI")], [sg.Button("OK")], [sg.Button("Cancel")]]
window = sg.Window("Buttons OK Cancel", layout) # Create the window
while True: # Create an event loop
event, values = window.read()
if event == "Cancel" or event == sg.WIN_CLOSED: # End program if user closes window or presses the Cancel button
break
elif event == "OK":
print("weiter ...")
break
window.close()
|
Das läuft, sieht aber "irgendwie falsch" aus, z.B. die zweifachen 'break'. Ich bitte um Empfehlungen für eine (übersichtliche) Anleitung für PySimpleGUI; viele Seiten, die ich gefunden habe (Beispiel), sind einfach zu umfangreich für den Einstieg. Danke, Michael
|
Speedy-10
Anmeldungsdatum: 23. März 2010
Beiträge: 863
Wohnort: Pfalz
|
Hi, ich kenne eine andere einfache Methode, um eine GUI zu implementieren, das Modul Tkinter: https://www.inf-schule.de/software/gui/entwicklung_tkinter/fenster Dort ist es einfach erklärt. LG
|
noisefloor
Ehemaliger
Anmeldungsdatum: 6. Juni 2006
Beiträge: 28758
Wohnort: WW
|
Hallo, Speedy-10 schrieb: Hi, ich kenne eine andere einfache Methode, um eine GUI zu implementieren, das Modul Tkinter:
Warum soll das einfacher sein? PySimpleGUI ist ein High-Level Interface, was auf tkinter aufsetzt... @michahe:Was hast du denn genau vor? Was heißt "Code abrrechen". Der von der gezeigte Code beendet in der Tat das Programm sowohl bei "OK" als auch "Cancel" - nur das halt bei "OK" noch was mittels print ausgegeben wird. Und was hast du langfristig vor? PySimpleGUI ist wie gesagt ein High-Level Interface, was mit sehr wenig Code eine (einfache) GUI ermöglicht. Dafür kommt man auch relativ schnell ans Limit des Moduls. D.h. wenn du später mal was "größeres" mit GUI Programmieren willst / musst, dann musst du zu Qt oder GTK or tkinter wechseln. Was wiederrum dann die Frage aufwirft, warum man den Weg über PySimpleGUI geht. Der "größte" "Vorteil" von PySimpleGUI ist, dass man keine Klassen-basierten Ansatz bei der Programmierung gehen muss, was man unter Python sonst tunlichst bei der GUI Programmierung tun sollte. Gruß, noisefloor
|
michahe
(Themenstarter)
Anmeldungsdatum: 12. Dezember 2013
Beiträge: 810
|
Danke noisefloor, Was hast du denn genau vor? ... Was heißt "Code abbrechen".
PySimpleGUI habe ich nach Deiner Empfehlung gewählt. Im Grund brauche ich nur ein Äquivalent zu kDialog, das ich in der BASH nutze. Ich bin auch recht zuversichtlich, dass PySimpleGUI meine Anforderungen erfüllt, aber eine "übersichtliche" Anleitung (Einsteiger-geeignet) fehlt mir noch. Im konkreten Fall geht es um ein Fenster mit einer Text-Nachricht "Dieses Programm macht ... Weiter?" und zwei Buttons "OK" und "Abbruch". Bei "Weiter" muss dass While True verlassen und der anschließend folgende Code ausgeführt werden. "Abbruch" soll dieses Abfrage-Fenster schließen, ggf. mit Nachricht "Abbruch gewählt" und dann z.B. mit close() die Routine beenden.
|
ChickenLipsRfun2eat
Anmeldungsdatum: 6. Dezember 2009
Beiträge: 12067
|
Hallo! Python ist nicht meine Welt, daher kann ich dir keine Empfehlungen für Webseiten geben. Aber die beiden breaks sind nötig, um die while-Schleife abzubrechen. Lässt du die breaks weg, würde die Schleife weiterlaufen und du wärst in dieser endlos gefangen, egal was du klickst. Vielleicht kannst du es so besser lesen: | running=True
while running:
event, values = window.read()
if event == "Cancel" or event == sg.WIN_CLOSED: # End program if user closes window or presses the Cancel button
running=False
elif …
|
|
noisefloor
Ehemaliger
Anmeldungsdatum: 6. Juni 2006
Beiträge: 28758
Wohnort: WW
|
Hallo, wenn das Programm weiter machen soll, dann musst du doch in der while-Schleife bleiben - oder eine neue Starten. Bei GUI-Programmierung ist es immer so, dass der Haupt Eventloop die Kontrolle hat. Bei PySimpleGUI wird das es bisschen weg abstrahiert und durch die while-Schleife ersetzt. Du kannst innerhalb der Schleife ja auch Funktionen aufrufen, die dann irgendwann wieder zurück kehren. Mir ist aber immer noch nicht ganz klar, was dein Programm am Ende können soll... könntest du vielleicht mal ein bisschen konkreter werden? Gruß, noisefloor
|
michahe
(Themenstarter)
Anmeldungsdatum: 12. Dezember 2013
Beiträge: 810
|
Danke ChickenLipsRfun2eat und noisefloor, tut mir leid, ich kapier's nicht. Hier mal der Vergleich meines (stark gekürzten Backup-Skripts (rsync)):
| OptDialog=kdialog
if ! $OptDialog --warningcontinuecancel "Datensicherung (Backup \nWeiter?" --title "Backup-rsync"; then
$OptDialog --error "Die Anfrage wurde nicht bestätigt; die Routine wird abgebrochen";
exit 1
else
rsync ...
fi
|
wenn das Programm weiter machen soll, dann musst du doch in der while-Schleife bleiben - oder eine neue Starten.
Wozu braucht's in PySimpleGUI das While? Hab's jetzt eliminiert und es tut wie ich will:
1
2
3
4
5
6
7
8
9
10
11
12
13 | import PySimpleGUI as sg
layout = [[sg.Text("Test PySimpleGUI")], [sg.Button("OK")], [sg.Button("Cancel")]]
window = sg.Window("Buttons OK Cancel", layout) # Create the window
event, values = window.read()
if event == mod_gui.WIN_CLOSED or event == "Cancel":
print("Abbruch gewählt! Event: " + event)
exit() # window.close() ist implizit
elif event == "OK": # Dieses ''elif'' ...
print(event)
window.close() # kann (ohne Unterschied) hier enden oder (wie in meinem BASH-Beispiel) bis ans Programmende offen bleiben
print("jetzt wird eine ganze Menge Code abgearbeitet ...")
# .....
print ("Programm sauber beendet.")
|
Ist das prinzipiell so OK oder ...
|
ChickenLipsRfun2eat
Anmeldungsdatum: 6. Dezember 2009
Beiträge: 12067
|
Das liegt am generellen Aufbau eines Programmes. Bei vielen Programmen will man ja, das diese offen bleiben und auf Eingaben reagieren. Bspw. wäre es blöd, wenn sich dein Terminal nach Absetzen eines Befehls schließen würde oder spezieller bei GUI-Programmen erwartet man, das diese explizit geschlossen werden wollen und ansonsten präsent sind oder im Hintergrund schlummern. Das erreicht man durch eine Endlosschleife, die auf eventuelle Eingaben reagiert und ansonsten vor sich hinschlummert oder angewiesene Aufgaben erledigt. In deinem Fall ist eigentlich keine GUI nötig, dein Script soll auch nicht offen bleiben und den Prozess anzeigen, o.ä. sondern dient lediglich für eine Abfrage. Was nach der Abfrage passiert, passiert ja wieder außerhalb der GUI. Du brauchst also keine Hauptschleife, um dein Programm am Leben zu halten. Warum bleibst du da nicht bei kdialog ? Das ist doch genau für solche Minimalfälle gedacht…
|
michahe
(Themenstarter)
Anmeldungsdatum: 12. Dezember 2013
Beiträge: 810
|
Danke ChickenLipsRfun2eat, Warum bleibst du da nicht bei kdialog ?
für PYTHON? Wie funktioniert das?
|
noisefloor
Ehemaliger
Anmeldungsdatum: 6. Juni 2006
Beiträge: 28758
Wohnort: WW
|
Hallo,
Ist das prinzipiell so OK oder ...
Wenn du PySimpleGui nur dafür nutzen willst, ein Skript zu starten, dass dann keine GUI mehr will / braucht → ja, kann man so machen. Wobei das halt ein bisschen ... ungewöhnlich ist. Du könntest du Abfrage "Willst das Skript WIRKLICH starten?" auch genau so gut im Terminal per Texteingabe machen. Gruß, noisefloor
|
Axel-Erfurt
Anmeldungsdatum: 18. Mai 2016
Beiträge: 1347
|
Für einfache Abfragen mit Fenster eignen sich auch zenity oder yad
|
ChickenLipsRfun2eat
Anmeldungsdatum: 6. Dezember 2009
Beiträge: 12067
|
michahe schrieb: für PYTHON? Wie funktioniert das?
Theoretisch über die Python-Qt-Anbindung (pyqt). In deinem Fall wäre das aber ein Overkill. Solche Aufgaben lassen sich tatsächlich in der Bash (oder anderer Shell) einfacher lösen, da der Hauptteil ein rsync -Aufruf ist und du nicht per GUI alles steuerst. Zum Python lernen wäre ggf. ein anderes Projekt besser geeignet, in dem du bspw. durch Verzeichnisse navigieren oder Optionen setzen musst, denn ein einfaches Ja/Nein. Du kannst auch Python drumherumwickeln und das per system -Aufruf machen, ist dann aber auch kein Python, sondern ein Shell-Aufruf ausgehend vom Python-Script. Für kleine Script-Abfragen bietet KDialog mehr als genug Möglichkeiten und genau dafür ist es gedacht. KDialog in C++ ist weitaus mächtiger und dynamischer, aber du wirst diese Grenze mit dem Script kaum erreichen. Qt bietet zwar eine wohl ganz passable Python-Anbindung, ich würde aber aus dem Bauch heraus annehmen, das sich KDE-Software besser mit C++/QML (JavaScript-basierte GUI) umsetzen lässt (im Idealfall mit Kirigami), denn in Python. Dazu können andere aber mehr sagen. Ich nutze Python nur selten und als erweiterte Shell-Script-Sprache, da dort die Anbindung an D-Bus, bzw. in meinem Fall noch das Editieren von Audio-Metadaten viel einfacher ist.
|
noisefloor
Ehemaliger
Anmeldungsdatum: 6. Juni 2006
Beiträge: 28758
Wohnort: WW
|
Hallo,
Qt bietet zwar eine wohl ganz passable Python-Anbindung
PySide von Qt ist ein Wrapper um die C++ API von Qt. AFAIK bietet die Python API die gleiche Funktion wie die C++ API. QML kann man da auch einbinden. Im gegebenen Fall ist aber explizit Python (und nicht Zenity oder KDialog oder ... ) gewünscht. Ob das wirklich sinnvoll ist (siehe mein vorheriger Post) ist eine andere Frage. Letztendlich ist das hier IMHO auch keine GUI-Programmierung im eigentlichen Sinne, weil der TE ja "nur" ein einfaches Pop-Up Fenster haben möchte. Und dafür reicht PySimpleGUI locker. Gruß, noisefloor
|