Variable von einer Klasse in eine Dev übergeben

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
Antworten
Challanger
User
Beiträge: 14
Registriert: Dienstag 26. Januar 2016, 16:49

Hallo

Ich habe erst mit dem Programmieren in Python angefangen also Anfänger

Und habe das Problem das ich es nicht hinbekomme von der Klasse Lichtschalter die Variable pin in die Devinition Schalter zu übergeben.
Wenn ich das Script ausführe sollte beim Drücken vom Butten nicht eine 0 angezeigt werden sondern die Zahl die sich hinter dem Button verbirgt (pin)

Ich habe schon einiges versucht aber nichts hat geholfen

Code: Alles auswählen

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)
        
        
def Schalten():
        print (pin)
        print ("sss")
        

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

print (pin)

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

print (pin)

mainloop()

wäre für einige Tpps sehr dankbar
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@Challanger: mit ein paar Tipps ist da nicht viel geholfen. Dir fehlt noch das grundlegende Verständnis von Variablen und ihre Gülitgkeitsbereiche, außerdem was Funktionen oder Klasse sind und wie man sie benutzt. Was benutzt Du denn zum Lernen?

Um erst gar nicht in so verwirrende Situationen zu kommen, empfiehlt es sich, keine Abkürzungen zu verwenden (vf? af? gf?), dann braucht man auch keinen Kommentar, der sagt, was denn die Abkürzung bedeutet, keine globale Variablen zu verwenden (pin sollte nicht global existieren) und Konstanten komplett groß zu schreiben (VORDERGUND_FARBE, ...). Keine *-Importe, weil man da nicht kontrollieren kann, welche Namen da importiert werden. tkinter wird üblicherweise als »import tkinter as tk« importiert und alle Namen über tk. referenziert. Kein Code (außer Definitionen und Konstanten) auf oberster Ebene. Der ganze Rest gehört in eine Funktion, die üblicherweise main genannt wird.

Code: Alles auswählen

import tkinter as tk
 
VORDERGRUND_FARBE = "#0000ff"
AKTIVE_FARBE = "green"
 
class Lichtschalter(tk.Button):
    def __init__(self, parent, text, pin):
        tk.Button.__init__(self, parent, text=text,
            fg=VORDERGRUND_FARBE,
            activebackground=AKTIVE_FARBE,
            command=self.schalten)
        self.pin = pin
       
    def schalten(self):       
        print(self.pin)
       
def main():
    fenster = tk.Tk()
    fenster.title("Smart Home Display")
    fenster.geometry("1024x600")
    fenster.bg="#ffdab9"
    taster1 = Lichtschalter(fenster, "Flur",2)
    taster2 = Lichtschalter(fenster, "Garten",3)
    taster1.pack()
    taster2.pack()
    fenster.mainloop()
    
if __name__ == '__main__':
    main()
 
BlackJack

@Challanger: Variablen haben auf Modulebene nichts zu suchen. Zudem scheinen viele ”Variablen” dort eigentlich Konstanten zu sein. Die schreibt man per Konvention komplett in Grossbuchstaben. Siehe Style Guide for Python Code.

Auf Modulebene gehört nur Code der Konstanten, Funktionen, und Klassen definiert. Das Hauptprogramm steht üblicherweise in einer Funktion die `main()` heisst. Funktionen und Methoden sollten nichts verwenden was nicht als Argument übergeben wurde (ausser Konstanten), sonst wird das Programm ganz schnell sehr undurchsichtig.

Hast Du mal BASIC auf dem C64 programmiert? Die Zeiten wo man nur zwei Buchstaben für einen Variablennamen verwenden konnte sind nun doch schon eine Weile vorbei. Statt zweibuchstabige Namen in einem Kommentar zu erklären sollte man den Namen gleich so wählen, dass man ihn nicht extra erklären muss.

Die Klasse `Lichtschalter` macht keinen Sinn. Eine einfache Funktion mit dem Inhalt der `__init__()` würde hier völlig ausreichen. Von `place()` und der Vorgabe einer Fenstergrösse sollte man Abstand nehmen. Für die Anordnung verwendet man `grid()` oder `pack()` und die Fenstergrösse richtet sich dann nach dem Inhalt des Fensters. Falls man das Fenster als Vollbild haben möchte, dann löst man das nicht über eine feste Grössenangabe sondern in dem man das Fenster maximiert.

`Schalten()` sollte als Funktionsname per Konvention klein geschrieben werden. Wenn `pin` in der Funktion benötigt wird, dann muss das auch als Argument übergeben werden.

Namen sollten nicht durchnummeriert werden. Entweder sollte man sich dann einen passenderen Namen ausdenken, hier zum Beispiel `flurlichtschalter` und `gartenlichtschalter`, oder man will eigentlich eine Datenstruktur statt einzelner Namen. Oft ist das eine Liste. Hier beispielsweise eine Liste `schalter` mit den `Lichtschalter`-Objekten. Wenn es denn sinnvolle Objekte wären, den im Moment ist so ein `Lichtschalter`-Exemplar völlig unsinnig, weil das nicht nur nichts ”kann”, sondern noch nicht einmal Datenattribute hat.

Sinnvoll könnte es werden wenn es mindestens die Pinnummer kapseln würde und eine `schalten()`-Methode besässe die als Kommando von der Schaltfläche aufgerufen würde. Was dann auch gleich die Antwort auf Deine Frage wäre.

Als Anfänger möchte man vielleicht nicht mit GUI-Programmierung anfangen. Da muss man linearen Programmablauf, die Kontrollstrukturen um den zu beeinflussen, Funktionen, und objektorientierte Programmierung (OOP) als Grundlagen bereits können. Und da kommt dann ereignisbasierte Programmierung durch die GUI noch oben drauf. Wenn man also mit GUIs anfängt, muss man im Grunde alles auf einmal lernen was eigentlich aufeinander aufbaut.
Challanger
User
Beiträge: 14
Registriert: Dienstag 26. Januar 2016, 16:49

ja das sind ja tolle antworten

was soll ich damit anfangen ???

Das noch nicht alles toll ist in meinem Script ist mir auch klar.

ach was solls hab auch keine lust auf sowas

Es tut mir leid das ich als Anfänger es gewagt habe hier sowas zu Posten

und Tschüß
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

Challanger hat geschrieben:ja das sind ja tolle antworten

was soll ich damit anfangen ???
Lesen und lernen.
Challanger hat geschrieben:Das noch nicht alles toll ist in meinem Script ist mir auch klar.

ach was solls hab auch keine lust auf sowas

Es tut mir leid das ich als Anfänger es gewagt habe hier sowas zu Posten

und Tschüß
BlackJack und Sirius haben sich nicht die Zeit genommen um dich fertig zu machen, das geht wesentlich einfacher als mit einem verbesserten Code (+ ausführlicher Erklärung) und einem kleinem Aufsatz.

Wenn du programmieren zu persönlich nimmst, wirst du dich nie verbessern, also runter kommen, nochmals alles lesen und versuchen zu verstehen.
the more they change the more they stay the same
BlackJack

@Challanger: Womit konkret kannst Du denn nichts anfangen? Das waren alles Punkte an denen Du arbeiten kannst. Und IMHO sollte man nicht mit GUIs anfangen, sondern eben mit den Grundlagen. Natürlich ist bei einem Anfänger nicht das ganze Programm toll. Auch bei Fortgeschrittenen und Profis nicht. Aber Dein Quelltext zeigt halt insgesamt das die Grundlagen fehlen. Hätte man Dich da jetzt anlügen sollen? Damit ist Dir doch auch nicht weiter geholfen.
Challanger
User
Beiträge: 14
Registriert: Dienstag 26. Januar 2016, 16:49

So habe mein Problem gelöst

Da ich Anfänger bin ist es mir egal wie das Script aussieht es soll erstmal nur Funtionieren.
Und ich lerne an den Sachen die mich Interessieren.

Daher bringt es mir nichts das mir jemand sagt ich muß dies und das verbessern was mich im moment noch nicht Interessiert.
zB. Ja ich habe auf dem C64 Programmiert . und zum testen reichen mir zwei Zeichen für eine Variable vollkommen.
Im endeffekt ist es mir vollkommen klar das ich mit den Scripten nur rumbastle aber ich werde auch so zum ziel kommen
Versteht mich nicht falsch ich werde all diese Dinge beherzigen aber erst wenn ich dazu bereit bin.

Na egal vielleicht klappts bei den nächten malen besser
BlackJack

@Challanger: Zwei Zeichen pro Namen reichen Dir nicht, denn dann hättest Du ja keine Kommentare schreiben müssen die erklären was die kryptischen Kürzel bedeuten. ;-)

Es sollte Dir auch als Anfänger nicht egal sein wie es aussieht. Gute, passende Namen sind nicht nur für die Optik da, sondern ganz oft merkt man wenn man keinen passenden Namen findet, dass man das Problem oder den Lösungsansatz nicht verstanden hat, wenn man die Dinge nicht benennen kann. Und es erleichtert dem Leser das Verständnis. Das sind zum einen hier Leute die helfen wollen, und zum anderen Du selbst, spätestens wenn Du den Quelltext nach ein paar Monaten wieder anschaust und nicht mehr verstehst was Du da gemacht hast, und dich erst wieder einarbeiten musst.
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

exakt die gleiche Frage vom selben TE gibt's auch im Raspi-Forum: http://www.forum-raspberrypi.de/Thread- ... uebergeben

Nur sind da die Antworten etwas komprimierter ;-)

@Challanger: wenn du einfach nur erwartest, dass dir jemand eine Lösung mundgerecht serviert, weil du nicht so richtig die Motivation hast, selber zu lesen & lernen, dann sind deine Chancen darauf im Raspi-Forum größer. Dafür sind hier im Python-Forum deine Chancen größer, so richtig nachhaltig was zu lernen.

Gruß, noisefloor
Antworten