Mittlerweile eignen sich Browser ganz als GUI-Frontend für z.B. Java
oder Python Server.
Ich würden gerne eine Oberfläche mit Slider und Buttons machen, sie
sollen aber frei positionierbar sein.
Hier ist ein Beispiel für die Erstellung von Slidern:
https://www.w3schools.com/howto/howto_js_rangeslider.asp
Leider werden dort die Elemente aber automatisch plaziert.
Gibt es eine Möglichkeit, beliebig viele Elemente frei zu positionieren?
Ist aber sch***. Damit bist du auf eine Bildschirmauflösung
festgenagelt, und das Layout kann sich nicht an PC vs. Tablet vs.
Telefon vs. Hoch/Querformat anpassen.
Danke für das Beispiel.
>Ist aber sch***. Damit bist du auf eine Bildschirmauflösung>festgenagelt, und das Layout kann sich nicht an PC vs. Tablet vs.>Telefon vs. Hoch/Querformat anpassen.
Ich finde das nicht so problematisch, weil man ja in das Bild
hineinzoomen kann.
chris_ schrieb:> Hat jemand ein Beispiel für Python,
Puh. Würde das mit Websockets machen.
Python ist nicht meine Day-To-Day-Sprache, insofern: Besser selber
Beispiele suchen.
Aber im Prinzip, Server-Seitig im Python:
(Wäre pur Websocket. Vermutlich macht eine Integration mit flask o.Ä.
mehr Sinn.)
"request_handler" wird dann für jede Nachricht vom Websocket-Client
ausgeführt.
Client-Seitig im Javascript:
1
const socket = new WebSocket("ws://localhost:1234");
2
socket.onmessage = msg=>{console.log("Antwort von Python:",msg);};
Εrnst B. schrieb:> chris_ schrieb:>> Hat jemand ein Beispiel für Python,>> Puh. Würde das mit Websockets machen.> Python ist nicht meine Day-To-Day-Sprache, insofern: Besser selber> Beispiele suchen.>> (Wäre pur Websocket. Vermutlich macht eine Integration mit flask o.Ä.> mehr Sinn.)
Für Flask gibt es da das Modul flask-socketio von Miguel Grinberg: [1].
Funktioniert wunderbar und sehr einfach. Die andere Frage ist
allerdings, ob es wirklich nötig oder sinnig ist, Websockets zu
benutzen, das hängt wohl vom Bedienmodell ab: wenn lediglich eine
einzelne Slidereinstellung möglichst in Echtzeit übertragen werden soll,
sind Websockets sicherlich eine feine Sache. Aber wenn mehrere in
irgendeiner Weise zusammenhängende Einstellungen geändert und dann
zusammen übertragen werden sollen, ist eine Übertragung mit AJAX
vermutlich die bessere Alternative.
[1] https://flask-socketio.readthedocs.io/en/latest/
Ich habe mal ein Pythonbeipiel genommen und etwas modifiert. Wenn der
Slider bewegt wird, gibt Python eine Meldung aus. Ich schaffe es aber
nicht, den Sliderwert zu übertragen.
Das Problem scheint auf der HTML-Seite zu liegen:
chris_ schrieb:> Ich habe mal ein Pythonbeipiel genommen und etwas modifiert. Wenn der> Slider bewegt wird, gibt Python eine Meldung aus.
Welche?
> Ich schaffe es aber nicht, den Sliderwert zu übertragen.> Das Problem scheint auf der HTML-Seite zu liegen:>
Du holst Dir den eingestellten Wert des Sliders in die Variable "value",
machst dann aber nichts damit. Probier doch anstelle von
1
{action: 'slider'}
einmal
1
{action: 'slider', 'value': value}
zu benutzen. Ansonsten ist mir nicht ganz klar, warum Du den Wert Deines
Slider erst in eine Integer parst und dann wieder in einen String
wandelst, gibt es dafür einen Grund? Zudem ist der Parameter der Basis
für die toString()-Methode ohnehin per Default 10, eine explizite Angabe
ist also nicht notwendig.
Ansonsten würde ich Dir trotz allem empfehlen, Dir die Arbeit zu
erleichtern und entsprechende Frameworks zu benutzen, etwa Flask für
Python und jQuery für JS -- natürlich bedingt das einen kleinen Aufwand
für die Einarbeitung, spart Dir aber enorm viel Entwicklungszeit, wenn
Du mehr willst als ein Minibeispiel.
>{action: 'slider', 'value': value}
Danke dafür. Ich hatte das schon probiert, hatte aber 'value' nicht in
Anführungsstrichen.
Das ursprüngliche Beispiel, welches ich genommen habe, war zu überladen.
Im Anhang habe ich es mal auf das wesentliche reduziert.
Man kann den Slider jetzt bewegen, Python empfängt den Wert, sendet ihn
zurück und er wird auf der Webseite in Echtzeit dargestellt.
>Ansonsten würde ich Dir trotz allem empfehlen, Dir die Arbeit zu>erleichtern und entsprechende Frameworks zu benutzen,
Das ist so ein Aufwand, den ich immer gerne scheue. Ich bin mir noch
nicht sicher, wie weit ich diesen Versuch hier treiben will und ich
wollte mich nicht mehrere Tage mit einem Framework beschäftigen.
Ist meine Implementierung im Anhang so einigermaßen OK?
chris_ schrieb:>> Ansonsten würde ich Dir trotz allem empfehlen, Dir die Arbeit zu>> erleichtern und entsprechende Frameworks zu benutzen,>> Das ist so ein Aufwand, den ich immer gerne scheue. Ich bin mir noch> nicht sicher, wie weit ich diesen Versuch hier treiben will und ich> wollte mich nicht mehrere Tage mit einem Framework beschäftigen.>> Ist meine Implementierung im Anhang so einigermaßen OK?
Mir ist natürlich bewußt, daß das einen gewissen Einarbeitungsaufwand
erfordert -- aber den hast Du ohnehin, um Dich in Python, JavaScript und
Websockets zu fuchsen. Ein leichtgewichtiges Microframework wie Flask
mit Flask-SocketIO und ein kleines JavaScript-Framework wie jQuery
erhöhen Deinen Aufwand nur minimal, sorgen aber für deutlich
aufgeräumteren Code und bieten Dir etliches an Funktionalität, welche Du
ansonsten mühsam von Hand implementieren, testen und pflegen mußt.
Unterm Strich verringern sie Deinen Aufwand signifikant. Zum Beispiel
wirst Du Deine "page.html" irgendwie ausliefern müssen, das heißt: Du
brauchst einen Webserver. Sowas ist für Entwicklungszwecke bereits in
Flask enthalten, obendrein eine leistungsfähige Template-Engine und ein
URL-Mapper... und ein Logging, ein sauberes Exception-Handling, ein
Debugging und obendrein ein paar Sicherheitsfunktionen, die keiner
selbst entwickeln, testen und pflegen wollen würde...
Dem entsprechend finde ich auch ein paar Kritikpunkte an Deinem Code, so
werden Deine Websocket-Requests nicht ordentlich geloggt und Dein
Exception-Handling ist kaputt. Einfach mal alles in einen try-Block zu
packen ist auch nicht besonders sinnvoll, nur so als Hinweis: warum wird
Dein finally-Konstrukt eigentlich nie ausgeführt, obwohl es immer
ausgeführt werden müßte -- und zwar auch dann, wenn keine Exception
auftritt? Bitte lies' nochmal in der Dokumentation, was finally macht
und wozu es da ist... ;-)
>Dem entsprechend finde ich auch ein paar Kritikpunkte an Deinem Code,
Das ist in Ordnung so, ich experimentiere ja gerade ein wenig mit JS un
den Websockets.
>werden Deine Websocket-Requests nicht ordentlich geloggt
Im Beispiel-Code der original Python-Websockets von hier
https://websockets.readthedocs.io/en/stable/intro.html#browser-based-example
war ein Logging eingebaut.
1
importlogging
2
...
3
logging.basicConfig()
4
...
5
logging.error("unsupported event: %s",data)
Da mir das Beispiel für meine Zwecke überladen schien und ich nicht
weiß, wofür ich es gebrauchen könnte, habe ich es rausgeworfen.
> und Dein>Exception-Handling ist kaputt. Einfach mal alles in einen try-Block zu>packen ist auch nicht besonders sinnvoll, nur so als Hinweis: warum wird>Dein finally-Konstrukt eigentlich nie ausgeführt, obwohl es immer>ausgeführt werden müßte -- und zwar auch dann, wenn keine Exception>auftritt?
Falls ich keine Einrückung verschoben habe, war das so im Original von
oben drinn.
> Bitte lies' nochmal in der Dokumentation, was finally macht> und wozu es da ist... ;-)
Hmm ...
https://www.w3schools.com/python/ref_keyword_finally.asp
Du hast Recht, finally sollte immer ausgeführt werden.
Mir ist aber nicht ganz klar, was es im Originacode machen soll.