Änderung der Button-Images

  • Hallo Zusammen,

    mit einem Pi und einem Touch-Display habe ich ein Webradio gebaut. Als Feierabendbeschäftigung bin ich nun dabei mittels Python dem Gerät "Leben" einzuhauchen.
    Das ging auch bisher ganz gut. Allerdings bin ich jetzt an einem Punkt angekommen, wo ich nicht mehr weiter komme. Ich möchte die Darstellung der Button in Abhängigkeit von Zustand auf dem Display ändern. z.B. letzter Sender errreicht -> Button Sender plus wird grau. Ich habe schon einiges probiert, aber es gelingt mir einfach nicht. Wieso kann ich die mit "lambda:steuerung(00)" übergebenen Wert nicht weiter im Programm auswerten?
    Den Code habe ich unten angefügt.

    Vielen Dank für Eure Hilfe im Voraus!
    voi

    • Offizieller Beitrag
    Zitat

    Wieso kann ich die mit "lambdaIcon_confusedteuerung(00)" übergebenen Wert nicht weiter im Programm auswerten?


    Python supports the creation of anonymous functions (i.e. functions that are not bound to a name) at runtime, using a construct called "lambda".

    Deswegen ;)

    Der Unterschied zwischen Genie und Wahnsinn definiert sich im Erfolg.

  • Bitte nicht "_thread" verwenden. Das ist, wie der Name eigentlich verrät, ein Internes Module was nicht für den Nutzer bestimmt ist. Stattdessen bitte "threading" nutzen. ABER da du Tkinter verwendest kannst du vollständig auf threading verzichten! Siehe dazu am Ende des Beitrags.

    Wenn du MPC ansteuerst wäre es vermutlich sinnvoller das extra dafür vorgesehene Python Module "mpd2" zu nutzen, das wäre nicht nur einfacher zu handhaben sondern auch Ressourcenschonender und schneller.

    Eindeutige Variablenamen können auch helfen durch den Code durchzusteigen... was "bn" oder "bn10" usw bedeutet muss man sich derzeit mühsam zurecht suchen.

    Dort wo man Leerzeichen setzt, hast du keine und dort wo man keine setzt hast du welche... das ist auch etwas unstrukturiert.

    FAQ => Nützliche Links / Linksammlung => Tkinter

  • Hallo,

    ich habe mir das mal aus eurer Sicht angesehen. Aber ehrlich gesagt, weis ich nicht wo ich eingreifen muß. Ich wollte mit den Werten die ich an die Funktion "Steuerung" übergebe weitere Auswertungen machen. Wahrscheinlich liegt es an der Gültigkeit der Variablen aber ich komme einfach nicht drauf. Dazu bin ich wahrscheinlich noch zu etwas Newbie bei Python. Auch verstehe ich das mit den Leerzeichen nicht.
    Bitte nochmalig um Hilfe!!

  • Hast du meine verlinkten Beiträge gelesen? Insbesondere "python: Tkinter: Im Hintergrund zählen" und "python: Tkinter: time.sleep von while über GUI verändern" enthalten umfassende Erklärungen die ich ungerne noch mal wiederholen möchte.

    Magst du uns deinen aktuellen Code, in dem du das ohne _thread und mit mpd2 versucht hast, zeigen?


  • Hast du meine verlinkten Beiträge gelesen? Insbesondere "python: Tkinter: Im Hintergrund zählen" und "python: Tkinter: time.sleep von while über GUI verändern" enthalten umfassende Erklärungen die ich ungerne noch mal wiederholen möchte.

    Magst du uns deinen aktuellen Code, in dem du das ohne _thread und mit mpd2 versucht hast, zeigen?

    Hallo meigrafd,

    ich werde mir die empfohlenen Links ansehen. Natürlich werde ich auch den Code ohne _thread und mit mpd2 posten, wenn ich ihn geschrieben habe. Derzeitig existiert dazu noch garnichts, da ich mir erst mal die mpd2-Befehle dazu lesen muß. Dies wird wohl noch eine Weile dauern.

  • Hallo meigrafd,

    habe mir jetzt die links mit den links zu weiteren links angesehen. Dies wird wohl noch eine Weile dauern bis ich dies durchgearbeitet habe, da ich wie gesagt noch keine große Erfahrung mit Python habe. Allerdings richtig weitergeholfen hat mir das hier nicht. Ich wollte eigentlich nur die Images von Buttons ändern und nicht mit einem Python-Leistungskurs gleich mein bisheriges Programm komplett umschreiben. Damit ging meine Anfrage hier ins eigentlich Leere.

    voi

  • Naja dein Script hat an einigen Stellen Probleme - unter anderem das du mehrere Threads startest obwohl das überflüssig wäre...
    Ich hab nur keine Lust sowas ständig zu wiederholen und verweise daher auf die Linksammlung, wo sowas so oder ähnlich schon mal behandelt wurde...

    Wenn du dir meine beiden Beispiele anguckst bzw ausprobierst, müsstest du auch auf eine Lösung zu deinem direkt erfragten, kommen... Insofern versteh ich deinen letzten Satz nicht so recht.

  • Nur nicht so schnell aufgeben! @meigrafds Anmerkungen zu Deinem Code sind sicher alle richtig und auch ich würde Dir dazu raten, ihn gründlich zu überarbeiten - eine Änderung der Button-Images lässt sich aber sicher auch in seiner jetzigen Form erreichen.

    Eine generelle Bemerkung vorweg: Sowas


    Ich habe schon einiges probiert, aber es gelingt mir einfach nicht.

    ist immer ungünstig. Besser ist, konkret zu schreiben, was Du versucht hast und warum das nicht funktioniert hat. Dann lässt sich auch besser erkennen, wo Du stehst und in welche Richtung Du schon überlegt hast, und es ist einfacher, vielleicht einen Anstoß in die richtige Richtung zu geben.

    Im konkreten Fall scheinst Du auf jeden Fall schon auf einer heißen Spur zu sein:


    Wahrscheinlich liegt es an der Gültigkeit der Variablen

    Genau das ist wahrscheinlich bei Deinen bisherigen Versuchen Dein Problem gewesen. Du wirst allerdings nicht umhinkommen, Dir zumindest einen groben Überblick dazu zu verschaffen. Relevante Suchanfragen dazu könnten z.B. "python scope", "python global local variables" bzw. "python globale lokale Variablen" sein. Vorschlag: Lies Dich da ein bißchen ein, versuch, etwas davon in Deinem Programm umzusetzen, und wenn Du dann auf konkrete Schwierigkeiten stösst, fragst Du hier nochmal nach.

    Noch ein Tip zum Loswerden der Threads: Schau Dir mal die Tkinter-Funktion "after" an.

    Viel Erfolg bei Deinem Programm!

  • Beide Probleme werden in besagten Beiträgen behandelt.
    Im ersten python: Tkinter: Im Hintergrund zählen wird "after" behandelt und auch ausführlich erklärt. Das solltest du anstatt Threading nutzen.
    Im anderen python: TKinter Zähler findest du ein kleines Script was eine Besonderheit von Tkinter verwendet: http://infohost.nmt.edu/tcc/help/pubs/…-variables.html ... mit dessen Hilfe du dir dein "Gültigkeit der Variablen" Problem beseitigen könntest. Ein weiteres Beispiel dazu findest du im python: Tkinter: Startverzoegerung Beitrag
    Und last but not least kannst du zum ändern deiner Button Images "label.configure" verwenden.. Auch das wird über "python: Tkinter: Im Hintergrund zählen" ersichtlich, denn dort wird auch der Text des Buttons "led_tgl_button" verändert. Sofern man das Label Objekt richtig speichert kann man darüber nachträglich _alles_ verändern. Ich benutze da gerne einen einzigen "Start" oder "Stop" Button der nach Betätigung seine Farbe und Text ändert... Wie zB auch > hier < zu sehen.

    Wenn du Problem hast dann frag bitte gezielt - wie Manul auch schon erklärte. Einfach nur "geht nix" zu schreiben erwidern wir auch nur mit schulter zucken... Wo soll man da ansetzen?

  • Gute/r Frau/Mann!

    da ich selber seit 4 Monaten Python lerne bzw gezwungen bin es zu können, mit zusätzlichem Zeitdruck, kann ich dein Problem gut verstehen.
    Gleichzeitig haben die anderen Gesellen hier auch recht und ordentlich was im Kasten, daher sind deren Ratschläge immer ne feine Sache (wenn du denn die Zeit dafür hast) ;)

    Ich bin aktuell selber an einer GUI dran und habe das Bilder-auf-Buttons Problem folgendermaßen gemacht:

    [code=php]
    #symbols ist eine Liste, mit den Pfaden, wo die Symbole gespeichert sind
    bild = Image.open(symbols[i]) #Symbol wird geöffnet
    bild = bild.resize((40, 40), Image.ANTIALIAS) #Symbol wird auf vorgegebene Größe angepasst (40x40)
    display = ImageTk.PhotoImage(bild) #Umformen des Bilds in ein Tk-Format....frag mich hier besser nicht weiter :D

    #Symbol auf Button machen:
    self.button.configure(compound="top",image = display) #compound brauchst du, wenn du auch text auf dem Button hast
    self.button.image = display #Referenz (Garbage Collector)
    self.button.grid()
    [/php]

    Da ich mehrere Buttons (die alle gleich heißen) in einer Schleife durchratter sieht das Ergebnis so aus:
    [code=php]def button_symbol(self,s1,s2,s3,s4,s5):
    """Symbole festlegen - button_symbol(Pfad1,Pfad2,...,Pfad5)"""
    symbols = [s1,s2,s3,s4,s5]
    for i in range(0,5):
    if symbols[i] !="":
    try:
    bild = Image.open(symbols[i])
    bild = bild.resize((40, 40), Image.ANTIALIAS)
    display = ImageTk.PhotoImage(bild)

    self.buttons[i].configure(compound="top",image = display)
    self.buttons[i].image = display #Referenz (Garbage Collector)
    self.buttons[i].grid()
    except:
    print("Buttonsymbol konnte nicht geladen werden")
    pass
    else:
    self.buttons[i].configure(image = "")
    self.buttons[i].grid()[/php]
    Der Befehl zum Symbol ändern kommt dabei von woanders durch den Funktionsaufruf (button_symbol(.....):
    [code=php]button_symbol("./images/action-ok.png",
    "./images/action-cancel.png",
    "./images/kalender.ico",
    "./images/options.png", "./images/shutdown.png")[/php]

    Die Basis des Codes ist nicht meinem Hirn entsprungen, sondern ist das wunderbare Werk von "Astorek", der hier im Forum auch mal seine GUI veröffentlicht hat (siehe: selbstprogrammierte-gui-steuerung-fuers-display :danke_ATDE:

    Grüße und viel Erfolg dir noch!

    EDIT: ich muss gestehen, ich habe deinen Code nur überflogen und teilweise gar nicht gelesen :D (sorry)...aber scheinbar hast du ja ein Problem mit dem Setzen von Symbolen auf Buttons... bei mir klappt das so. wie es in deinem Fall angepasst werden muss kann ich auf die schnelle aber grade nicht sagen (habe leider Zeitdruck mein eigenes System fertig zu bekommen)

    Einmal editiert, zuletzt von DerSimon (24. Oktober 2016 um 22:29)

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!