Wie binde ich einen "echten" Button in mein tkinter script ein?

  • Hallo,

    ich habe mir für meinen RPi3 mit LCD-Display damals ein Timer Script geschrieben, welches von 50 runterzählt und immer, wenn das display angetippt wird, wieder bei 50 anfängt. Ich würde nun gerne, dass ich nicht das Display (den tkinter Button) antippen muss, sondern einen richtige Schalter, den ich an GPIO 19 angeschlossen habe.


    Das war das original Skript:


    Wie bringe ich jetzt meinen Knopf in's spiel? Ich habe vieles versucht, aber nichts scheint zu klappen. Ich befürchte, dass es mit dem mainloop() zu tun hat.


    Python
    from gpiozero import Button
    
    buzzer = Button(19)
    buzzer.wait_for_press()
    count()

    irgendwie so in die Richtung habe ich gedacht ^^


    Könnte mir jemand vielleicht kurz schreiben, wie es ginge. Wir fahren morgen in den Urlaub und ich würde meinen Spiele-Timer gerne benutzen.

    Gruß, Tom

  • Danke, ich habe es so ausprobiert. Ich habe es in die for-Schleife mit reingeschrieben.

    Es funktioniert allerdings nur ein Mal :-| wenn ich das erste Mal drück beginnt der countdown wieder bei 50. Dann kann ich drücken, wie ich will, nichts passiert.

    Verstehe ich nicht ^^

    Gruß, Tom

  • Jo, habe ich.



    Es hat bestimmt was damit zu tun, dass ich in count() count ausführe oder?

  • Sowas dachte ich mir. Füge mal

    Code
    t_button.when_pressed = count

    in die Zeile 34 ein (über button.pack()) ein.

    Habe ich gemacht. Es bleibt aber: Das erste Mal, wenn ich drücke geht der Timer auf 50 zurück. Danach kann ich drücken aber es passiert nichts.

    • Official Post

    Könntest du bitte mal die wesentlichen Schritte in deinem Code erklären? Ich kann mir z.B. beim besten Willen nicht erklären, warum du 150x hintereinander die Callback-Funktion des selben Buttons setzt.

    Tillmario Sehe ich auch so, das wäre wirklich hilfreich.

  • Tillmario Sehe ich auch so, das wäre wirklich hilfreich.

    Das kann ich nicht. Ich habe vor gefühlt einem Jahr das letzte Mal mit Python gearbeitet und verstehe es nicht mehr zu 100%, was ich da gemacht habe.

    Ich kann mir z.B. beim besten Willen nicht erklären, warum du 150x hintereinander die Callback-Funktion des selben Buttons setzt.

    Ich weiß nicht mal, worauf sich das bezieht.


    Es soll einfach ein Timer sein, der von 50 runterzählt und mir das möglichst groß auf dem Display anzeigt. Und wenn ich den Knopf drücke soll er wieder auf 50 springen.

    Was ich gemacht habe: Versucht das umzusetzen.

    Wenn es anders besser geht bin ich gerne bereit, es so zu machen aber erklären kann ich es leider nicht.

  • Das ist problematisch, wie programmiert man etwas, was man selbst nicht versteht?

    Was möchtest Du hier gerade erreichen? Mir helfen?

    Ich habe doch geschrieben, was ich programmieren möchte. Ich weiß aber nicht, wie ich es umsetzen soll.



    Darauf.

    Das habe ich da reingeschrieben, weil ich möchte, dass der Timer - egal wann ich drücke - auf 50 zurück springt. Und ich dachte, dass ich es deswegen dahin schreiben sollte.

  • Was möchtest Du hier gerade erreichen? Mir helfen?

    Ja, ohne aber zu riskieren, dass das hier eine "hier, macht das mal für mich" Aufgabe wird. Gab's schon oft genug.


    Ich weiß aber nicht, wie ich es umsetzen soll.

    Dann versuche mal, einzuschätzen, woran das liegt - so können wir zielführender helfen.


    Das habe ich da reingeschrieben, weil ich möchte, dass der Timer - egal wann ich drücke - auf 50 zurück springt.

    Da kann ich jetzt nicht ganz folgen wie das mit dem gezeigten Code funktionieren soll :conf:

  • Da kann ich jetzt nicht ganz folgen wie das mit dem gezeigten Code funktionieren soll :conf:

    count() lässt den countdown von 50 runterlaufen.

    der Druck auf den Knopf soll den counter wieder auf 50 setzten bzw. count() neu starten.


    Mein Problem ist doch, dass ich nicht weiß, wo ich diesen Knopfdruck nun hinschreiben muss.

    Sowas dachte ich mir. Füge mal

    Code
    t_button.when_pressed = count

    in die Zeile 34 ein (über button.pack()) ein.

    An dieser Stelle klappt es nicht.

  • Also, das funktioniert:


    Jetzt hab ich meine eigenen Regeln missachtet, aber was solls. Das lauffähige Programm kannst du natürlich an deine Gegebenheiten anpassen, ebenso musst du halt das print in Zeile 25 mit etwas sinnvollem ersetzen, die Fenstergröße anpassen, deine Lieblingsfarben für Text & Hintergründe verwenden... du verstehst schon.


    Was du dir bitte unbedingt einprägen solltest:

    • Keine Sternchenimports, niemalsnie. Ganz schlechter Stil, führt nur zu Bugs und müllt den globalen Namensraum zu.
    • Sobald ein GUI auch nur minimal komplex wird, einen Klassenbasierten Ansatz verwenden (wie gezeigt, ich habe mit einem Beispiel aus der Python-Doku angefangen). Hat dir noisefloor aber auch schon erklärt. :denker:

    Jetzt fehlt noch der gpiozero-Teil. Ich hab's nicht getestet, aber das könnte funktionieren: