Python Class Variable übergeben

  • Hallo

    bin am verzweifeln, suche schon ewig im Netz finde aber keine Antwort

    Und zwar möchte ich in meinem Script von der Klasse Lichtschalter die Variable ´pin´ in der Devinition Schalten gebrauchen.
    Habe schon einiges ausprobiert aber nicht hat geklappt.

    Vielleicht kann mir jemand einen Tipp geben

    [code=php]from tkinter import *

    fenster = Tk()
    fenster.title("Smart Home Display")
    fenster.geometry("1024x600")
    fenster.bg="#ffdab9"

    # Variablen

    pin = 0
    bx = 0 # bx = Button Position in X
    by = 0 # by = Button Position in Y
    vf = "#0000ff" # vf = Schriftfarbe Button
    af = "green" # af = Buttonfarbe gedrückt
    gf = "#0000af" # gf = Farbe Licht eingeschaltet
    bd = 8 # bd = Rahmengröße in Pixel
    hi = 4 # hi = Höhe Button
    bg = "green" # bg = Butten hintergrundfarbe
    wi = 8 # wi = Länge Button
    re = RIDGE # re = relief


    class Lichtschalter:
       
    def __init__(self,tx,pin,bx,by): # tx = Buttontext bx = X Position by = Y Position pin = GPIO Pin
    Button(fenster, text=tx, fg=vf, command = Schalten, activebackground=af , bd=bd, height=hi,width=wi, bg=bg,relief=re ).place(x=bx,y=by)
    self.name = pin
    print (self.name)
           
    def Schalten():
           
    print ("sss")

    taster1 = Lichtschalter("Flur",2,400,200)

    print (pin)

    taster2 = Lichtschalter("Garten",3,600,200)

    print (pin)

    mainloop()

    [/php]

  • Hallo,

    wenn du ein Attribut einer Klasse aufrufen willst, dann musst du die Klasse mit angeben - woher soll Python sonst wissen, was du meinst? Es ist ja durch aus möglich, dass verschiedene Klassen Attribute mit identischem Namen haben.

    Beispiel für Attribut-Zugriff:

    Python
    >>> class Foo:
    ...     def __init__(self, bar):
    ...         self.bar = bar
    ... 
    >>> my_foo = Foo('das ist bar')
    >>> my_foo.bar
    'das ist bar'
    >>>

    Übrigens:

    Quote

    bin am verzweifeln, suche schon ewig im Netz finde aber keine Antwort


    Vielleicht solltest du einfach mal das offizielle Python-Tutorial lesen? Und du solltest vielleicht mal deine Suchstrategie im Netz überdenken - es gibt tausende Seiten, die das erklären, weil das absoluten Grundlagen sind, wenn man mit Python und Klassen arbeitet.


    Gruß, noisefloor

  • Erstmal danke für die Antwort

    Da steckt aber eben irgendwo mein Problem

    genau dein Beispiel bearbeite ich zeit 2 Stunden welches ich aus einem Buch habe

    Aber ich bekomme es nicht hin wenn ich den ersten Button drücke das dann auch eine 2 ausgegeben wird.
    Ich bekomme die Variable pin nicht in die Funktion Schalter

    Es will einfach nicht klappen
    Automatisch zusammengefügt:
    So ich bin wohl nun einen Schritt weiter

    [code=php]from tkinter import *

    fenster = Tk()
    fenster.title("Smart Home Display")
    fenster.geometry("1024x600")
    fenster.bg="#ffdab9"

    # Variablen

    pin = 0
    bx = 0 # bx = Button Position in X
    by = 0 # by = Button Position in Y
    vf = "#0000ff" # vf = Schriftfarbe Button
    af = "green" # af = Buttonfarbe gedrückt
    gf = "#0000af" # gf = Farbe Licht eingeschaltet
    bd = 8 # bd = Rahmengröße in Pixel
    hi = 4 # hi = Höhe Button
    bg = "green" # bg = Butten hintergrundfarbe
    wi = 8 # wi = Länge Button
    re = RIDGE # re = relief


    class Lichtschalter(object):
       
    def __init__(self,tx,pin,bx,by): # tx = Buttontext bx = X Position by = Y Position pin = GPIO Pin
    Button(fenster, text=tx, fg=vf, command = Schalten, activebackground=af , bd=bd, height=hi,width=wi, bg=bg,relief=re ).place(x=bx,y=by)
    self.tx = tx
    Lichtschalter.pin = pin
    print (pin)
    print (Lichtschalter.pin)

    def Schalten():
    print (Lichtschalter.pin)

    taster1 = Lichtschalter("Flur",2,400,200)
    #print(taster1.tx)


    taster2 = Lichtschalter("Garten",3,600,200)

    #print(taster2.tx)


    mainloop()


    [/php]

    allerdings bin ich davon ausgegangen wenn ich auf den Button drücke das dann auch die Variablen von dem Button weitergegeben werden
    leider sind die daten von dem letzten Button also die 3

    Edited once, last by Challanger72 (December 4, 2016 at 2:33 PM).

  • So habe es hinbekommen


    [code=php]from tkinter import *

    fenster = Tk()
    fenster.title("Smart Home Display")
    fenster.geometry("300x200")
    fenster.bg="#ffdab9"

    # Variablen

    pin = 0
    bx = 0 # bx = Button Position in X
    by = 0 # by = Button Position in Y
    vf = "#0000ff" # vf = Schriftfarbe Button
    af = "green" # af = Buttonfarbe gedrückt
    gf = "#0000af" # gf = Farbe Licht eingeschaltet
    bd = 8 # bd = Rahmengröße in Pixel
    hi = 4 # hi = Höhe Button
    bg = "green" # bg = Butten hintergrundfarbe
    wi = 8 # wi = Länge Button
    re = RIDGE # re = relief

    class Lichtschalter(object):
       
    def __init__(self,tx,pin,bx,by): # tx = Buttontext bx = X Position by = Y Position pin = GPIO Pin
    Button(fenster, text=tx, fg=vf, command = self.Schalten, activebackground=af , bd=bd, height=hi,width=wi, bg=bg,relief=re ).place(x=bx,y=by)
    self.pin = pin
    self.tx = tx
    Lichtschalter.pin = pin

    def Schalten(self):
    print ("Dieser Button ",self.tx," enspricht dem GPIO Pin ",self.pin)
           
    taster1 = Lichtschalter("Flur",2,50,50)
    taster2 = Lichtschalter("Garten",3,150,50)

    mainloop()
    [/php]

  • Woher soll das auch magisch kommen? Du arbeitest mit globalen variablen, die du bestaendig aenderst. Natuerlich arbeitet dein Code dann immer mit deren aktuellem Zustand.

    Stattdessen musst du mit vernuenftiget Methoden und INSTANZVARIABLEN arbeiten. Das ist ein fundamentaler Unterschied, da deren Werte PRO INSTANZ, also n mal, nicht *einmal* PRO KLASSE existieren.

    Hier eine kurze Skizze:

    Python
    class Lichtschalter(object):
    
    
         def __init__(self, ...):
                self.eine_eigenschaft = irgendwas
                Button(fenster, command =self.buttonCallback)
    
    
        def buttonCallback(self):
                print(self.eine_eigenschaft)

    Das besondere ist eben genau das "self.buttonCallback" - dadurch hast du pro Lichtschalter genau einen Callback, nicht eine Callback fuer alle.

    Nur am Rande: place() sollte man in Tkinter nicht benutzen, das pack-System ist deutlich sinnvoller, da es besser mit dynamischen GUIs umgehen kann und auch mit veraenderten Randbedingungen wie Fontgroessen oder Bildschirm-DPI.

Participate now!

Don’t have an account yet? Register yourself now and be a part of our community!