Button nachträglich ändern

Fragen zu Tkinter.
Antworten
Challanger
User
Beiträge: 14
Registriert: Dienstag 26. Januar 2016, 16:49

Ich komm einfach nict weiter ich habe das Script schon soweit das es kein fehler mehr ausgibt
Allerdings ändert es aber auch die Buttons nicht
wo liegt denn da jetzt wieder der fehler ?


Code: Alles auswählen

from tkinter import *
fenster = Tk()
fenster.title("Smart Home Display")
fenster.geometry("1024x600")
fenster.configure(background="#330000")

# Variablen

zaehler =0
Positionx = 0             #  bx = Button Position in X
Positiony = 0             #  by = Button Position in Y
Schriftfarbe = "#0000ff"  #  Schriftfarbe Button
Farbegedrueckt = "green"  #  Buttonfarbe gedrückt
RahmenG = 8               #  Rahmengröße in Pixel
Hoch = 4                  #  Höhe Button
Breit = 8                 #  Länge Button
Hintergrundfarbe = "#FFFACD"  # bg = Butten hintergrundfarbe

re = RIDGE  # re = relief



def Lichtschalter( tx, pin, Positionx, Positiony,):  # tx = Buttontext bx = X Position  by = Y Position pin = GPIO Pin
        Button(fenster, text=tx, fg=Schriftfarbe, command=Schalten, activebackground=Farbegedrueckt, bd=RahmenG, height=Hoch, width=Breit, bg=Hintergrundfarbe,
               relief=re).place(x=Positionx, y=Positiony)
        global zaehler

        ##self.tx = tx
        #self.zaehler = zaehler
        Lichtschalter.pin = pin
        return zaehler


def Schalten():
        #print("Dieser Button ", tx, " enspricht dem GPIO Pin ", pin)
        global zaehler
        if zaehler == 0:
            print(" Licht ein")
            zaehler = 1
            Button(fenster).config(relief=SUNKEN)
            return zaehler

        elif zaehler == 1:
            print(" Licht aus")
            zaehler = 0
            Button(fenster).config(relief=RAISED)
            return zaehler



def main():

    taster1 = Lichtschalter("Flur", 2, 50, 50)
    taster2 = Lichtschalter("Garten", 3, 150, 50)
    fenster.mainloop()
if __name__ == '__main__':
    main()
Zuletzt geändert von Anonymous am Dienstag 13. Dezember 2016, 14:13, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
BlackJack

@Challanger: `Button()` *erzeugt* eine *neue* Schaltfläche. Wenn Du eine bestehende verändern willst, dann musst Du, nun ja die bestehende verändern. Also die nicht nur erzeugen, sondern auch irgendwie geeignet merken, damit man da an anderer Stelle dann Veränderungen dran vornehmen kann. Und das dann aber alles sinnvoll in einer Klasse statt mit ``global``.

Ich würde ja einen `Checkbutton` nehmen, mit der Option `indicatoron` auf `False` gesetzt, statt diese Funktionalität selber zu programmieren.
Challanger
User
Beiträge: 14
Registriert: Dienstag 26. Januar 2016, 16:49

hmm Der Checkbutton scheidet aus da er mir Optisch nicht gefällt

Dann wurde mir hier im Forum erzhlt das ich keine Klasse nehmen soll sondern nur eine Funktion

nungut ich erzeuge einen neuen Button, vielleicht hilft mir das weiter ich mach mal weiter
Sirius3
User
Beiträge: 17712
Registriert: Sonntag 21. Oktober 2012, 17:20

@Challanger: Du glaubst, wenn Du irgendwelchen Objekten irgendwelche Attribute zuweist, weiß Python auf magische Weise, wie Du es meinst und macht schon alles richtig. So funktioniert Programmieren nicht. Du bringst Klassen, Objekte, Funktionen und globale Zustände durcheinander. Funktionsaufrufe erzeugen nicht gleich auch Objekte eines bestimmten Typs. "Lichtschalter.pin" ist ein Attribut des Funktionsobjekts Lichtschalter, das existiert nur einmal. "Button(fenster)" erzeugt einen neuen Knopf und liefert nicht den Knopf zurück, den Du irgendwann einmal in einem anderen Funktionsaufruf erzeugt hast. Es gibt nur einen globalen Zähler zaehler. Wie willst Du damit zwei Knöpfe gleichzeitig ansprechen?

Es sieht so aus, als ob Du das Konzept "Klassen" nicht verstanden hast und deshalb versuchst, Dir das Leben "einfach" zu machen und die gleiche Funktionalität mit Funktionen nachzubilden. Das funktioniert leider nicht. Du wirst nicht drumrum kommen, wirklich zu Lernen, wie man Klassen definiert:

Code: Alles auswählen

import tkinter as tk

AUS = False
AN = True

class Lichtschalter(tk.Button):
    def __init__(self, parent, title, pin):
        tk.Button.__init__(self, parent, text=title, command=self.schalten)
        self.pin = pin
        self.zustand = AUS
        
    def schalten(self):
        if self.zustand == AUS:
            self.zustand = AN
            print("Licht ein")
            self["relief"] = tk.SUNKEN
        else:
            self.zustand = AUS
            print("Licht aus")
            self["relief"] = tk.RAISED

def main():
    fenster = tk.Tk()
    fenster.title("Smart Home Display")
    taster1 = Lichtschalter(fenster, "Flur", 2)
    taster2 = Lichtschalter(fenster, "Garten", 3)
    taster1.pack()
    taster2.pack()
    fenster.mainloop()

if __name__ == '__main__':
    main()
Challanger
User
Beiträge: 14
Registriert: Dienstag 26. Januar 2016, 16:49

Ich bedanke mich recht herzlich für das Script
da kann ich jetzt drauf aufbauen
Challanger
User
Beiträge: 14
Registriert: Dienstag 26. Januar 2016, 16:49

Hallo nochmal

Kann ich jetzt auch noch in der Funktion def Schalten

Die zustände von den anderen Buttons auslesen ?
BlackJack

@Challanger: Nein, die Schalter sind unabhängig, es gibt ja nicht eine `schalten()`-Methode sondern jedes Exemplar von `Lichtschalter` hat seine eigene gebundene Methode. Was willst Du denn erreichen?
Antworten