Wischfunktion durch Buttonklick hervorrufen

Fragen zu Tkinter.
apple
User
Beiträge: 8
Registriert: Sonntag 16. April 2017, 15:58

Hallo zusammen,

ich beschäftige mich erst seit ein / zwei Wochen mit Python und TKinter.
Ich möchte eine GUI mit mehreren Buttons programmieren, mit denen ich die GPIO´s eines Raspberry Pi 3 ansteuern kann. Dies funktioniert auch alles problemlos.

Nun möchte ich das ganze noch ein wenig wie ein Smartphone aufbauen und soll wie folgt aussehen/funktionieren:

Sobald ich meine Standard-GUI habe, befindet sich sämtliche Buttons auf der Oberfläche. Unter anderem unten mittig. Bei Betätigung dieses Buttons soll, wie bei einem Smartphone, ein neues Fenster / Label mit weiteren Buttons von unten bis etwa Mitte der Oberfläche erscheinen. So ne Art Wischfunktion. Dieses Fenster soll ebenfalls neue Buttons mit einer weiteren Funktion beinhalten. Nach nochmaligen betätigen des Buttons soll das Fenster / Label wieder nach unten verschwinden.

Ich such schon seit Tagen vergeblich nach einer solchen Funktion und hoffe, dass mir hier jemand helfen kann :D

Vielen Dank vorab.

Grüße apple
__deets__
User
Beiträge: 14542
Registriert: Mittwoch 14. Oktober 2015, 14:29

Nimm qml von Qt. Das kann so Späße. Tkinter ist dafür nicht gedacht. Da gibts keine Animationen etc.
apple
User
Beiträge: 8
Registriert: Sonntag 16. April 2017, 15:58

Sind die beiden miteinander kompatibel? Will mein Programm, welches ich schon in TKinter geschrieben habe nicht verwerfen.
apple
User
Beiträge: 8
Registriert: Sonntag 16. April 2017, 15:58

Besteht die Möglichkeit mit QT die GPIO´s eines Raspberry Pi 3 anzusteuern oder ist QT nur für eine GUI geeignet?
Sirius3
User
Beiträge: 17753
Registriert: Sonntag 21. Oktober 2012, 17:20

@apple: Qt ist wie TkInter nur ein GUI-Framework, wobei Qt größer, mächtiger, schwerfälliger ist, also mehr kann. Ich würde so GUI-Krams gleich als Browser-Anwendung mit Python als Server schreiben, dann kann man die Steuerung auch von seinem Smartphone aus bedienen.
__deets__
User
Beiträge: 14542
Registriert: Mittwoch 14. Oktober 2015, 14:29

Weder Qt noch Tkinter "koennen" GPIOs. Theoretisch koennte Qt sie noch eher als Tkinter, weil es eigene Abstraktionen fuer IO hat, aber die wirst du nicht benutzen wollen dafuer, weil es spezialisierte und bessere Bibliotheken wie pigpio gibt.

Und Tkinter ist auch schlechter beim verarbeiten von GPIOs als Qt, da es nur timer-basierte synchronisation zwischen Threads kennt, wohingegen Qt mit seinen signal/slots direkte Benachrichtigung erlaubt.
BlackJack

@__deets__: Tk bzw. Tcl kann man auch für GPIOs verwenden. Die kann man über ``/sys/class/gpio/`` ansprechen und aus Sicht einer Programmiersprache sind das ja nur ”Textdateien”. Zeichenketten kann Tcl gut. Und auch ohne das man da Threads bräuchte, denn man kann (”echte”) Dateien als Ereignisquellen verwenden.

Selbsterstellte Ereignisse kann man ebenfalls von anderen Threads aus posten. Tk/Tcl kann auch Daten mitsenden, leider ist das in der Python-Anbindung nicht drin, da kann man nur das Ereignis selbst versenden. Wahrscheinlich wird es deswegen selten bis gar nicht benutzt, weil man beispielsweise nur melden kann *das* es Daten gibt, für die Übermittlung dann aber doch wieder eine Queue oder etwas ähnliches braucht.
__deets__
User
Beiträge: 14542
Registriert: Mittwoch 14. Oktober 2015, 14:29

@BlackJack das mit den Ereignissen war mir unbekannt, muss ich mal anschauen. Ich habe durch Studium des Quellcodes von Tkinter mal rausgefunden, dass die StringVar & Konsorten ebenfalls thread-sicher sind, aber das hat natuerlich nicht so sehr Ereignischarakter.

Und ja, ich meinte auch die GPIO Dateien, doch die wuerde man in Tkinter ja einfach ueber die dafuer vorgesehenen Python-Funktionen anbinden. Und mir waere jetzt nicht bekannt, dass tkinter einen Mainloop hat, der auf Datei-Ereignisse wartet. Da lasse ich mich aber auch gerne eines besseren belehren.

Qt aber kann genau das - das stand hinter meinem Argument.

Beides ist so oder so eh akademischer Natur: die Qualitaet bzw. Leistungsfaehigkeit der File-basierten GPIOs laesst *sehr* zu wuenschen uebrig, so das man eigentlich sofort auf pigpio oder einen der anderen Bibliotheken zurueckgreifen will.
BlackJack

Mit `Tkinter.tkinter.createfilehandler()` (die Doppelung ist kein Schreibfehler :-)) kann man Rückruffunktionen für alles was eine Dateinummer hat (also ”echte” Dateien und Sockets) registrieren. Entweder für „es gibt jetzt was zu lesen“ oder „es kann was geschrieben werden“. Also quasi so etwas wie `select()` in die Tk-Ereignisverarbeitung integriert.
__deets__
User
Beiträge: 14542
Registriert: Mittwoch 14. Oktober 2015, 14:29

Hah! Sehr schön. Warum auch immer ich das nie gefunden habe. Danke.
apple
User
Beiträge: 8
Registriert: Sonntag 16. April 2017, 15:58

Um nochmals zurück auf die Wischfunktion zu kommen... :D
Hat jemand ein kleines Beispiel in Qt was folgendes kann:

Bei Betätigung eines Buttons soll eben ein Label mit mehreren Buttons von unten nach oben "hereinwischen". Bei nochmaligen betätigen des Buttons soll das Label samt den Buttons wieder nach unten hin "herauswischen".

Ich hab jetzt schon gesucht aber komme auf keinen grünen Zweig :K

Wäre nice wenn mir da jemand weiterhelfen kann :D
__deets__
User
Beiträge: 14542
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ich habe qml erwähnt. Wie man das in Python benutzt kann man hier sehen: https://www.boxcontrol.net/beginners-py ... orial.html

Ein Animations-Tutorial ist zB das hier:

https://m.youtube.com/watch?v=FRXJM5z2OxM

Sirius hat HTML vorgeschlagen. Unter normalen Umständen wäre das einfacher, weil mehr Beispiele und breiter in der Nutzung.

Qml hat aber den Vorteil auf dem Pi OpenGL beschleunigt zu sein. Das kann bei HTML sonst ruckelig werden.
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

Das geht schon in tkinter.

Für dieses Fenster mit den Buttons einen Frame nehmen. Für den Frame ein place Layout verwenden. Dann timergesteuert die y-Koordinate verringern, damit es den Frame nach oben schiebt. Dabei auch die Höhe des Frames anpassen.

Also timergesteuert y-Koordinate und Höhe entsprechend setzen.
__deets__
User
Beiträge: 14542
Registriert: Mittwoch 14. Oktober 2015, 14:29

"Gehen" tut vieles. Zum Beispiel ein Loch ins Knie bohren, geht auch. Gute Ideen sind das aber nicht alle. Für flüssige Animationen brauchts schon etwas mehr. Es gibt schon gute Gründe warum so etwas in entsprechend Frameworks eingebaut wird.
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

__deets__ hat geschrieben:"Gehen" tut vieles. Zum Beispiel ein Loch ins Knie bohren, geht auch. Gute Ideen sind das aber nicht alle. Für flüssige Animationen brauchts schon etwas mehr. Es gibt schon gute Gründe warum so etwas in entsprechend Frameworks eingebaut wird.
Einen Frame durch Setzen der Koordinaten zu verschieben, geht flüssig. Übrigens, die Höhe muss nicht angepasst werden, da der Frame nicht über die Parent Grenzen hinaus sichtbar sein kann. Und wenn da nicht gleich eine Funktion im tkinter Framework da ist, die kann man sich unter Benützung des timers selber schreiben.

Wer natürlich denkt, selber programmieren ist dasselbe wie ein Loch ins Knie bohren, der soll es halt bleiben lassen.
BlackJack

@Alfons Mittelmeyer: Hast Du ausprobiert ob das flüssig geht? Auf einem Raspiberry Pi? Denn darum geht es hier ja.
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

@BlackJack: ja, habe mir heute einmal nach langer Zeit wieder meinen GuiDesigner angeschaut und ihn auf meinen Raspberry Pi3 geladen. Das Container Bewegen geht total flüssig. Und dazu benutze ich after, Mauspositionsabfrage und place. Das geht sicher auch ohne Verschieben mittels der Mausposition.
__deets__
User
Beiträge: 14542
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ich habe heute auch deinen GUI-Designer angeschaut, und außer einer decode exceptions war da nix flüssig... ich bleibe also skeptisch was deine Tipps für modernes GUI Design angeht :lol:
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

__deets__ hat geschrieben:Ich habe heute auch deinen GUI-Designer angeschaut, und außer einer decode exceptions war da nix flüssig
Was soll dieser Unsinn?
Frame bewegen geht genauso schnell wie ein Anwendungsfenster bewegen oder ein sonstiges Betriebssystem GUI Element, wie etwa ein Icon für einen Ordner.

Und wenn Du irgendwo eine decode exception bekommst, wäre gut, den Fehler zu beschreiben und abzuklären, denn ich habe so eine exception nicht bekommen.
Antworten