Seite 1 von 1

Python GUI Variable

Verfasst: Donnerstag 2. Januar 2014, 13:12
von andip
Hallo,
ich bin neu hier im Forum und mit meinen Programmierkenntnissen am Ende...

Mein Ziel ist es, mit dem Raspberry meine Heizung zu steuern und Remote vom Netzwerk auf den Raspberry zugreifen zu können.
Remote auf den Raspberry zugreifen klappt.
Ein erstes Programm mit diversen Eingaben läuft.
Allerdings kommen jetzt die Probleme:
Ich kann z.B. in der GUI eine Variable setzen und diese im Programm dann weiter verarbeiten (getestet mit Ausgaben in der Shell).

Allerdings bringe ich es dann nicht fertig die Variable irgendwo auf der GUI dann wieder auszugeben.
Das Programm habe ich mir (wie so viele andere wohl auch) aus verschiedenen Tutorials heraus zusammengezimmert...
Ich denke das mein Problem mit der Kapselung von Klassen zusammenhängt, finde aber aktuell keinen Ausweg.

Zum Beispiel kann ich über die Funktion werte_setzen über die Radio-Buttons Werte in der GUI verändern oder auch mit dem Button "Programm setzen".
Nur meine Variable Aussentemp bekomme ich nach der Änderung in der Funktion ausgabe (Zeile 35 und 36) nicht in die GUI.

Ich hänge mein Testprog mal an, vielleicht fällt Euch ja da etwas dazu ein?

Code: Alles auswählen

# -*- coding: cp1252 -*-
# #!/usr/bin/python
import wx
from threading import *
global rt
global Erster_Timer
global Aussentemp, Timer1
Aussentemp="1"


def werte_setzen(an1, aus1, an2, aus2, an3, aus3, an4, aus4) :
    an1 = wx.TextCtrl(panel, -1,value=an1, pos=(50, 60), size=(40,-1))
    aus1 = wx.TextCtrl(panel, -1,value=aus1, pos=(100, 60), size=(40,-1))
    an2 = wx.TextCtrl(panel, -1,value=an2, pos=(50, 90), size=(40,-1))
    aus2 = wx.TextCtrl(panel, -1, value=aus2, pos=(100, 90), size=(40,-1))
    an3 = wx.TextCtrl(panel, -1, value=an3, pos=(50, 120), size=(40,-1))
    aus3 = wx.TextCtrl(panel, -1, value=aus3, pos=(100, 120), size=(40,-1))
    an4 = wx.TextCtrl(panel, -1, value=an4, pos=(50, 150), size=(40,-1))
    aus4 = wx.TextCtrl(panel, -1, value=aus4, pos=(100, 150), size=(40,-1))

    



def ausgabe(wert_ausgabe):
    global Aussentemp
    #lokaltemp ="1"
    print wert_ausgabe
    print "ausgabe : ", Aussentemp
    lokaltemp=(int(Aussentemp)+1)
    Aussentemp=str(lokaltemp)
    print "Aussentemp_ausgabe : ", Aussentemp
    print "_____"
    
    wert_ausgabe = wx.TextCtrl(panel, -1, value=Aussentemp, pos=(480, 63), size=(40,-1))
    header = wx.StaticText(panel, label=Aussentemp, pos=(40, 350))
   
    #werte_setzen("00:01","00:02","00:03", "00:04", "00:05", "00:06", "00:07", "00:08")
    #self.Timer1.SetLabel(Aussentemp)
    #panel.Refresh()


class RepeatedTimer(object):
    global Aussentemp
    def __init__(self, interval, function, *args, **kwargs):
        self._timer     = None
        self.interval   = interval
        self.function   = function
        self.args       = args
        self.kwargs     = kwargs
        self.is_running = False
        self.start()

    def _run(self):
        self.is_running = False
        self.start()
        self.function(*self.args, **self.kwargs)

    def start(self):
        if not self.is_running:
            self._timer = Timer(self.interval, self._run)
            self._timer.start()
            self.is_running = True

    def stop(self):
        self._timer.cancel()
        self.is_running = False

    
    
class ExamplePanel(wx.Panel):
    global rt
    global Aussentemp, Temp_Aussentemp, Timer1


    def __init__(self, parent):
        wx.Panel.__init__(self, parent)
        global Aussentemp, Temp_Aussentemp, Timer1
        On1time = "04:30"
        Off1time = "08:00"
        On2time = "12:00"
        Off2time = "13:00"
        On3time = "19:00"
        Off3time = "21:00"
        On4time = "00:00"
        Off4time = "00:00"
        BrennerOn = "1"
        Vorlaufpumpe = "1"
        Warmwasserpump = "0"
        Vorlauftemp = "56"
        Ruecklauftemp = "44"
        ExamplePanel.Aussentemp = "222"
        Temp_Aussentemp = "4"
        Erster_Timer = "100"
        Aussentemp= "3"
           
            
        self.header = wx.StaticText(self, label="Schaltzeiten aktuell:", pos=(20, 30))
        self.header.SetFont(wx.Font(10, wx.SWISS, wx.NORMAL, wx.BOLD))
         
        self.header = wx.StaticText(self, label="(Ein)", pos=(60, 45))
        self.header = wx.StaticText(self, label="(Aus)", pos=(110, 45))
         
        self.timenr = wx.StaticText(self, label="1.:", pos=(25, 63))
        On1time = wx.TextCtrl(self, value=On1time, pos=(50, 60), size=(40,-1))
        Off1time = wx.TextCtrl(self, value=Off1time, pos=(100, 60), size=(40,-1))

        self.timenr = wx.StaticText(self, label="2.:", pos=(25, 93))
        On2time = wx.TextCtrl(self, value=On2time, pos=(50, 90), size=(40,-1))
        Offt2ime = wx.TextCtrl(self, value=Off2time, pos=(100, 90), size=(40,-1))
                                                           
        self.timenr = wx.StaticText(self, label="3.:", pos=(25, 123))
        On3time = wx.TextCtrl(self, value=On3time, pos=(50, 120), size=(40,-1))
        Off3time3 = wx.TextCtrl(self, value=Off3time, pos=(100, 120), size=(40,-1))
         
        self.timenr = wx.StaticText(self, label="4.:", pos=(25,153))
        On4time = wx.TextCtrl(self, value=On4time, pos=(50, 150), size=(40,-1))
        Off4time = wx.TextCtrl(self, value=Off4time, pos=(100, 150), size=(40,-1))
 

        self.header = wx.StaticText(self, label="Schaltzustände:", pos=(200, 30))

        self.header.SetFont(wx.Font(10, wx.SWISS, wx.NORMAL, wx.BOLD))


        self.header = wx.StaticText(self, label="Brenner", pos=(200, 63))
        self.header = wx.StaticText(self, label=BrennerOn, pos=(310, 63))

        self.header = wx.StaticText(self, label="Vorlaufpumpe", pos=(200, 93))
        self.header = wx.StaticText(self, label=Vorlaufpumpe, pos=(310, 93))

        self.header = wx.StaticText(self, label="Warmwasserpumpe", pos=(200, 123))
        self.header = wx.StaticText(self, label=Warmwasserpump, pos=(310, 123))
        

        self.header = wx.StaticText(self, label="Temperaturen:", pos=(370, 30))
        self.header.SetFont(wx.Font(10, wx.SWISS, wx.NORMAL, wx.BOLD))
        
        self.header = wx.StaticText(self, label="Aussentemp", pos=(370, 63))
        self.header = wx.StaticText(self, label=Temp_Aussentemp, pos=(480, 63))
        Temp_Aussentemp = wx.TextCtrl(self, style=wx.PROCESS_ENTER, value=Temp_Aussentemp, pos=(580, 63), size=(40,-1))
        self.Bind(wx.EVT_TEXT_ENTER, self.EvtAussentemp, Temp_Aussentemp)
        
        self.header = wx.StaticText(self, label="Vorlauftemp", pos=(370, 93))
        self.header = wx.StaticText(self, label=Vorlauftemp, pos=(480, 93))

        self.header = wx.StaticText(self, label="Ruecklauftemp", pos=(370, 123))
        self.header = wx.StaticText(self, label=Ruecklauftemp, pos=(480, 123))

        self.header = wx.StaticText(self, label="Timer läuft", pos=(40, 300))
        self.Timer1 =wx.TextCtrl(self, value=Erster_Timer, pos=(100, 300), size=(40,-1))
   
     
       
        # Close button
        self.button =wx.Button(self, label="Quit", pos=(700, 500))
        self.Bind(wx.EVT_BUTTON, self.OnClose,self.button)

    
        self.Setzen =wx.Button(self, label="Programm setzen", pos=(100, 400))
        self.Bind(wx.EVT_BUTTON, self.Button_Auswahl,self.Setzen)



         #Radio-Buttons
        radioList = ['Frühschicht', 'Spätschicht', 'Nachtschicht', 'Nur Warmwasser', 'Urlaub daheim', 'Nachtabsenkung', 'Vollast Heizung', 'Vollast Wasser']
        rb = wx.RadioBox(self, label="Welches Programm möchten Sie laden ?", pos=(20, 210), choices=radioList,  majorDimension=3,style=wx.RA_SPECIFY_COLS)
        self.Bind(wx.EVT_RADIOBOX, self.EvtRadioBox, rb)

   
    def EvtRadioBox(self, event):
        
        BOX_Zaehler=event.GetInt()
        
        if BOX_Zaehler == 0: #Frühschicht ************* Hier die gewünschten Zeiten eintragen
            an1 = "04:30"
            aus1 = "08:00"
            an2 = "19:00"
            aus2 = "21:00"
            an3 = "00:00"
            aus3 = "00:00"
            an4 = "00:00"
            aus4 = "00:00"
            werte_setzen(an1,aus1, an2, aus2, an3, aus3, an4, aus4)

        elif BOX_Zaehler == 1: #Spätschciht
            an1 = "04:30"
            aus1 = "05:30"
            an2 = "07:00"
            aus2 = "08:30"
            an3 = "12:00"
            aus3 = "13:00"
            an4 = "19:00"
            aus4 = "21:00"
            werte_setzen(an1,aus1, an2, aus2, an3, aus3, an4, aus4)
            
        elif BOX_Zaehler == 2: #Nachtschicht
            an1 = "04:30"
            aus1 = "06:30"
            an2 = "13:00"
            aus2 = "14:30"
            an3 = "19:00"
            aus3 = "21:00"
            an4 ="00:00"
            aus4 = "00:00"
            werte_setzen(an1,aus1, an2, aus2, an3, aus3, an4, aus4)


    def EvtAussentemp(self, event):
        global Aussentemp,rt
        Aussentemp=Temp_Aussentemp.GetValue() 
        print "EvtAussentemp:", Aussentemp
        self.Refresh()
        rt.stop()
        print "Timer gestoppt und neu gestartet"
        rt = RepeatedTimer(1, ausgabe, Aussentemp)
        
    def temp_zahler(a):
        b=a
        ausgabe(str(b))
        print b


       
            
    def OnClose(self, event):
        rt.stop()
        frame.Destroy() 
       
    def Button_Auswahl(self, event):
        Ontime1 = "12:30"        
        Offtime1 = "14:00"
      
        Ontime1 = wx.TextCtrl(self, value=Ontime1, pos=(50, 60), size=(40,-1))
        Offtime1 = wx.TextCtrl(self, value=Offtime1, pos=(100, 60), size=(40,-1))





    # Timer starten, jede Sekunde, Aufruf Function "ausgabe", Übergabe an Function =Aussentemp
    #rt = RepeatedTimer(1, ausgabe, Aussentemp)


  
app = wx.App(False)
frame = wx.Frame(None,title="Heizung 0.2",size=(800,600))
panel = ExamplePanel(frame)
frame.Show()
werte_setzen("00:01","00:02","00:03", "00:04", "00:05", "00:06", "00:07", "00:08")
print "Timer startet"
rt = RepeatedTimer(1, ausgabe, Aussentemp)


app.MainLoop()
Vielen Dank an alle, die sich die Mühe machen das hier mal anzuschauen!

Re: Python GUI Variable

Verfasst: Donnerstag 2. Januar 2014, 13:35
von darktrym
global in 5, 6, 7 ist absolut sinnfrei wie auch die Zuweisung in Zeile 35, 36.

Re: Python GUI Variable

Verfasst: Donnerstag 2. Januar 2014, 13:45
von Sirius3
@andip: An welcher Stelle willst Du was setzen? Ich habe das noch nicht ganz durchschaut.

Zum Code: »global« auf Modul- bzw. Klassenebene sind völlig wirklungslos. »global« in Methoden ist keine gute Idee. Warum ist »werte_setzen« keine Methode Deiner Panel-Klasse? Du setzt auch keine Werte, sondern erzeugst ständig neue TextCtrls. Die meisten Zuweisungen sind unnötig, da die Variablen danach nicht mehr benutzt werden, oder sofort überschrieben.

Re: Python GUI Variable

Verfasst: Donnerstag 2. Januar 2014, 13:52
von andip
Hallo,

DANKE, erste Verbesserung erreicht.
Ich habe die Zeilen 5,6 und 7 ausgext.

Gerade die Zeilen 35 und 36 sind mein Problem.
Wie bekomme ich die (wofür auch immer, ist nur ein Versuch...) berechnete Variable wieder in der GUI ausgegeben?

DANKE!!!

Re: Python GUI Variable

Verfasst: Donnerstag 2. Januar 2014, 15:36
von andip
Hallo,

zunächst mal vielen Dank Sirius3.
Ich habe Deine Ratschläge mal beherzigt und habe damit
a) Mein Problem gelöst, ich kann jetzt in dem Fenster Daten verändern.
b) Einige wohl eher unsinnige Befehle durch sinnvollere ersetzt (z.B. das Thema mit den TextCtrl).

Ich hänge das geänderte Progi nochmals an.
Vielleicht kannst Du Dir das nochmals anschauen und mir ggf. noch vorhandene grobe Patzer vor Augen führen.

Code: Alles auswählen

# -*- coding: cp1252 -*-
# #!/usr/bin/python
import wx
from threading import *

class RepeatedTimer(object):
    global Aussentemp
    def __init__(self, interval, function, *args, **kwargs):
        self._timer     = None
        self.interval   = interval
        self.function   = function
        self.args       = args
        self.kwargs     = kwargs
        self.is_running = False
        self.start()

    def _run(self):
        self.is_running = False
        self.start()
        self.function(*self.args, **self.kwargs)

    def start(self):
        if not self.is_running:
            self._timer = Timer(self.interval, self._run)
            self._timer.start()
            self.is_running = True

    def stop(self):
        self._timer.cancel()
        self.is_running = False

    
    
class ExamplePanel(wx.Panel):
    #global rt
    #global Aussentemp, Temp_Aussentemp, Timer1


    def __init__(self, parent):
        wx.Panel.__init__(self, parent)
        global Aussentemp, Temp_Aussentemp, Timer1
        On1time = "04:30"
        Off1time = "08:00"
        On2time = "12:00"
        Off2time = "13:00"
        On3time = "19:00"
        Off3time = "21:00"
        On4time = "00:00"
        Off4time = "00:00"
        BrennerOn = "1"
        Vorlaufpumpe = "1"
        Warmwasserpump = "0"
        Vorlauftemp = "56"
        Ruecklauftemp = "44"
        ExamplePanel.Aussentemp = "222"
        Temp_Aussentemp = "4"
        Erster_Timer = "100"
        Aussentemp= "3"
           
            
        self.header = wx.StaticText(self, label="Schaltzeiten aktuell:", pos=(20, 30))
        self.header.SetFont(wx.Font(10, wx.SWISS, wx.NORMAL, wx.BOLD))
         
        self.header = wx.StaticText(self, label="(Ein)", pos=(60, 45))
        self.header = wx.StaticText(self, label="(Aus)", pos=(110, 45))
         
        self.timenr = wx.StaticText(self, label="1.:", pos=(25, 63))
        self.ein_1 = wx.TextCtrl(self, value=On1time, pos=(50, 60), size=(40,-1))
        self.aus_1= wx.TextCtrl(self, value=Off1time, pos=(100, 60), size=(40,-1))

        self.timenr = wx.StaticText(self, label="2.:", pos=(25, 93))
        self.ein_2 = wx.TextCtrl(self, value=On2time, pos=(50, 90), size=(40,-1))
        self.aus_2 = wx.TextCtrl(self, value=Off2time, pos=(100, 90), size=(40,-1))
                                                           
        self.timenr = wx.StaticText(self, label="3.:", pos=(25, 123))
        self.ein_3 = wx.TextCtrl(self, value=On3time, pos=(50, 120), size=(40,-1))
        self.aus_3 = wx.TextCtrl(self, value=Off3time, pos=(100, 120), size=(40,-1))
         
        self.timenr = wx.StaticText(self, label="4.:", pos=(25,153))
        self.ein_4 = wx.TextCtrl(self, value=On4time, pos=(50, 150), size=(40,-1))
        self.aus_4 = wx.TextCtrl(self, value=Off4time, pos=(100, 150), size=(40,-1))
 

        self.header = wx.StaticText(self, label="Schaltzustände:", pos=(200, 30))

        self.header.SetFont(wx.Font(10, wx.SWISS, wx.NORMAL, wx.BOLD))


        self.header = wx.StaticText(self, label="Brenner", pos=(200, 63))
        self.brenner = wx.StaticText(self, label=BrennerOn, pos=(310, 63))

        self.header = wx.StaticText(self, label="Vorlaufpumpe", pos=(200, 93))
        self.vorlaufheizung = wx.StaticText(self, label=Vorlaufpumpe, pos=(310, 93))

        self.header = wx.StaticText(self, label="Warmwasserpumpe", pos=(200, 123))
        self.vorlaufww = wx.StaticText(self, label=Warmwasserpump, pos=(310, 123))
        

        self.header = wx.StaticText(self, label="Temperaturen:", pos=(370, 30))
        self.header.SetFont(wx.Font(10, wx.SWISS, wx.NORMAL, wx.BOLD))
        
        self.header = wx.StaticText(self, label="Aussentemp", pos=(370, 63))
        self.t_aussen = wx.StaticText(self, label=Temp_Aussentemp, pos=(480, 63))
        Temp_Aussentemp = wx.TextCtrl(self, style=wx.PROCESS_ENTER, value=Temp_Aussentemp, pos=(580, 63), size=(40,-1))
        self.Bind(wx.EVT_TEXT_ENTER, self.EvtAussentemp, Temp_Aussentemp)
        
        self.header = wx.StaticText(self, label="Vorlauftemp", pos=(370, 93))
        self.t_vorlaufheizung = wx.StaticText(self, label=Vorlauftemp, pos=(480, 93))

        self.header = wx.StaticText(self, label="Ruecklauftemp", pos=(370, 123))
        self.t_ruecklaufheizung = wx.StaticText(self, label=Ruecklauftemp, pos=(480, 123))

        self.header = wx.StaticText(self, label="Timer läuft", pos=(40, 300))
        self.Timer1 =wx.TextCtrl(self, value=Erster_Timer, pos=(100, 300), size=(40,-1))
   
     
       
        # Close button
        self.button =wx.Button(self, label="Quit", pos=(700, 500))
        self.Bind(wx.EVT_BUTTON, self.OnClose,self.button)

    
        self.Setzen =wx.Button(self, label="Programm setzen", pos=(100, 400))
        self.Bind(wx.EVT_BUTTON, self.Button_Auswahl,self.Setzen)



         #Radio-Buttons
        radioList = ['Frühschicht', 'Spätschicht', 'Nachtschicht', 'Nur Warmwasser', 'Urlaub daheim', 'Nachtabsenkung', 'Vollast Heizung', 'Vollast Wasser']
        rb = wx.RadioBox(self, label="Welches Programm möchten Sie laden ?", pos=(20, 210), choices=radioList,  majorDimension=3,style=wx.RA_SPECIFY_COLS)
        self.Bind(wx.EVT_RADIOBOX, self.EvtRadioBox, rb)

    def werte_setzen(self, an1, aus1, an2, aus2, an3, aus3, an4, aus4) :
        self.ein_1.SetValue(an1)
        self.aus_1.SetValue(aus1)
        self.ein_2.SetValue(an2)
        self.aus_2.SetValue(aus2)
        self.ein_3.SetValue(an3)
        self.aus_3.SetValue(aus3)
        self.ein_4.SetValue(an4)
        self.aus_4.SetValue(aus4)


    def ausgabe(self, wert_ausgabe):
        print wert_ausgabe
        self.t_aussen.SetLabel(wert_ausgabe)
        
        
   
    def EvtRadioBox(self, event):
        
        BOX_Zaehler=event.GetInt()
        
        if BOX_Zaehler == 0: #Frühschicht ************* Hier die gewünschten Zeiten eintragen
            an1 = "03:30"
            aus1 = "08:00"
            an2 = "19:00"
            aus2 = "21:00"
            an3 = "00:00"
            aus3 = "00:00"
            an4 = "00:00"
            aus4 = "00:00"
            self.werte_setzen(an1,aus1, an2, aus2, an3, aus3, an4, aus4)

        elif BOX_Zaehler == 1: #Spätschciht
            an1 = "04:30"
            aus1 = "05:30"
            an2 = "07:00"
            aus2 = "08:30"
            an3 = "12:00"
            aus3 = "13:00"
            an4 = "19:00"
            aus4 = "21:00"
            self.werte_setzen(an1,aus1, an2, aus2, an3, aus3, an4, aus4)
            
        elif BOX_Zaehler == 2: #Nachtschicht
            an1 = "05:30"
            aus1 = "06:30"
            an2 = "13:00"
            aus2 = "14:30"
            an3 = "19:00"
            aus3 = "21:00"
            an4 ="00:00"
            aus4 = "00:00"
            self.werte_setzen(an1,aus1, an2, aus2, an3, aus3, an4, aus4)


    def EvtAussentemp(self, event):
        global Aussentemp,rt
        Aussentemp=Temp_Aussentemp.GetValue() 
        print "EvtAussentemp:", Aussentemp
        self.Refresh()
        rt.stop()
        print "Timer gestoppt und neu gestartet"
        rt = RepeatedTimer(1, self.ausgabe, Aussentemp)
        
            
    def OnClose(self, event):
        rt.stop()
        frame.Destroy() 
       
    def Button_Auswahl(self, event):
        Ontime1 = "12:30"        
        Offtime1 = "14:00"
        self.ein_1.SetValue(Ontime1)
        self.aus_1.SetValue(Offtime1)
     
  
app = wx.App(False)
frame = wx.Frame(None,title="Heizung 0.2",size=(800,600))
panel = ExamplePanel(frame)
frame.Show()

print "Timer startet"
rt = RepeatedTimer(1, panel.ausgabe, Aussentemp)


app.MainLoop()
(PS.: Ich habe an dem Problem jetzt schon ca. 3 Wochen fast täglich rumgedoktort und nichts geregelt bekommen.)

DANKE :!: :!: :!: :!: :!:

Re: Python GUI Variable

Verfasst: Donnerstag 2. Januar 2014, 15:44
von Hyperion
Oha... da ist vieles eher umständlich gelöst. Z.B. das hier:

Code: Alles auswählen

        if BOX_Zaehler == 0: #Frühschicht ************* Hier die gewünschten Zeiten eintragen
            an1 = "03:30"
            aus1 = "08:00"
            an2 = "19:00"
            aus2 = "21:00"
            an3 = "00:00"
            aus3 = "00:00"
            an4 = "00:00"
            aus4 = "00:00"
            self.werte_setzen(an1,aus1, an2, aus2, an3, aus3, an4, aus4)
Wenn man anfängt Namen durch zu nummerieren, dann hat man idR. einen schlechten Entwurf. Benutze besser eine Liste o.ä. Datenstruktur, um den Index abbilden zu können. Ich würde wohl direkt eine Liste von Paaren für das An- und Ausschalten verwenden.

Re: Python GUI Variable

Verfasst: Freitag 3. Januar 2014, 13:43
von andip
Hallo Hyperion,

ja, ist wie gesagt schon ziemlich zusammengewürfelt.
Das mit der Liste (Array?) schaue ich mir mal an!
Danke für Deine Unterstützung.
Sonst noch irgendwelche groben Patzer, welche ich ausbügeln sollte?

Re: Python GUI Variable

Verfasst: Freitag 3. Januar 2014, 13:53
von TrayserCassa
Also nach meinem Wissen über PEP8 (was nun auch nicht wirklich groß ist) ist dein Code nicht geschrieben.
Z.B.:

Code: Alles auswählen

        self._timer      = None
        self.interval    = interval
        self.function   = function
        self.args         = args
        self.kwargs     = kwargs
        self.is_running = False
Auch wenn es für dich unübersichtlich scheint, sollte das so aussehen:

Code: Alles auswählen

        self._timer = None
        self.interval = interval
        self.function = function
        self.args = args
        self.kwargs = kwargs
        self.is_running = False
Hier mal der Link zur deutschen Übersetzung ;)
Link

edit:
Listen:

Code: Alles auswählen

liste = [3, 6, 5.5]

# gesamte Liste wiedergeben
print(liste)

# ein Element
print(liste[0])
print(liste[1])

# slice
print(liste[0:2])

# Elemente zählen
print("Anzahl der Elemente: ", len(liste))

Ich weiß leider nicht genau wie dein an und aus funktioniert, allerdings könnte man das doch besser in einem Dictionarys setzten, oder lieg ich da falsch? Bin auch nur ein Anfänger :mrgreen:
Allerdings solltest du dich mit Listen Tulpen und etc auseinander setzten, sind Basics die man berherschen sollte. ;)

mfg
Trayser

Re: Python GUI Variable

Verfasst: Freitag 3. Januar 2014, 15:31
von Sirius3
»RepeatedTimer« braucht weder »Aussentemp« noch ergibt das »global« auf Klassen-Ebene irgendeinen Sinn. Warum sind die global Variablen nicht sowieso Instanzattribute?
Das Erzeugen mit Liste sähe z.B. so aus:

Code: Alles auswählen

    def __init__(self, parent):
        wx.Panel.__init__(self, parent)
        on_off_times = [
            ("04:30", "08:00"),
            ("12:00", "13:00"),
            ("19:00", "21:00"),
            ("00:00", "00:00")
        ]
           
        static_text = wx.StaticText(self, label="Schaltzeiten aktuell:", pos=(20, 30))
        static_text.SetFont(wx.Font(10, wx.SWISS, wx.NORMAL, wx.BOLD))
         
        wx.StaticText(self, label="(Ein)", pos=(60, 45))
        wx.StaticText(self, label="(Aus)", pos=(110, 45))
        
        self.timer_textctrls = []
        for nr, (on_value, off_value) in enumerate(on_off_times,1):
            wx.StaticText(self, label="%d.:"%nr, pos=(25, 33 + nr*30))
            self.timer_textctrls.append((
                wx.TextCtrl(self, value=On1time, pos=(50, 30 + nr*30), size=(40,-1))
                wx.TextCtrl(self, value=Off1time, pos=(100, 30 + nr*30), size=(40,-1))
            ))
und das Wertesetzen so:

Code: Alles auswählen

    def werte_setzen(self, on_off_times):
        for (on_value, off_value), (on_ctrl, off_ctrl) in zip(on_off_times, self.timer_textctrls):
            on_ctrl.SetValue(on_value)
            off_ctrl.SetValue(off_value)

Re: Python GUI Variable

Verfasst: Freitag 3. Januar 2014, 16:13
von BlackJack
@andip: Diese ganzen absoluten Positionierungen von GUI-Elementen sind übrigens auch äusserst unschön. Beschäftige Dich mal mit „sizern” um ein Layout zu erstellen das unabhängig von konkreten Pixelauflösungen ist.

Re: Python GUI Variable

Verfasst: Samstag 4. Januar 2014, 12:42
von andip
Hallo,

@TrayserCassa: Ich habe da mal drüber geschaut und die für mich offensichtlichen Fehler behoben (Einrückungen).
Wie gesagt sind hier viele Beispiele aus dem Netz eingeflossen, die an sich schon nicht den Konventionen entsprechen.
Sirius3 hat zu den Listen Code bereitgestellt den ich gleich mal testen werde.

@BlackJack: Ja, das hatte ich auch schon mal gelesen. Allerdings sieht es aktuell so aus, dass ich vermutlich exakt diese eine Anwendung schreiben werde.
Da erscheint es mir wichtiger die im Prinzip ans laufen zu bekommen. Wenn ich das Projekt durchgestanden habe nehme ich mir sicher die Zeit auch mal in diese Richtung („sizern”) zu schauen.
Trotzdem vielen Dank für Deine Anregung!

@Sirius3: Mit der "Aussentemp" hatte ich so meine Probleme. Das habe ich dank Eurer Hilfe jetzt gelöst.
Weiterhin habe ich Deinen Code für die "Liste" anstelle der einzelnen Variablen mal eingebaut.Danach poppt beim Starten des Programms ein Fehler hoch:
Da fehlte bei der self.timer_textctrls.append ein Komma.
Mit dem Komma kommt dann die nächste Fehlermeldung:

Traceback (most recent call last):
File "D:/daten/python/Heizung_Visual3.4.py", line 183, in <module>
panel = ExamplePanel(frame)
File "D:/daten/python/Heizung_Visual3.4.py", line 63, in __init__
for nr, (on_value, off_value) in enumerate(on_off_times,1):
TypeError: enumerate() takes no arguments (2 given)

Ich hänge meine aktuelle Version (mit dem Fehler) hier nochmals an:

Code: Alles auswählen

# -*- coding: cp1252 -*-
# #!/usr/bin/python
import wx
from threading import *
from time import *

class RepeatedTimer(object):
    
    def __init__(self, interval, function, *args, **kwargs):
        self._timer = None
        self.interval = interval
        self.function = function
        self.args = args
        self.kwargs = kwargs
        self.is_running = False
        self.start()

    def _run(self):
        self.is_running = False
        self.start()
        self.function(*self.args, **self.kwargs)

    def start(self):
        if not self.is_running:
            self._timer = Timer(self.interval, self._run)
            self._timer.start()
            self.is_running = True

    def stop(self):
        self._timer.cancel()
        self.is_running = False

    
    
class ExamplePanel(wx.Panel):


    def __init__(self, parent):
        wx.Panel.__init__(self, parent)
        on_off_times = [
            ("04:30", "08:00"),
            ("12:00", "13:00"),
            ("19:00", "21:00"),
            ("00:00", "00:00")
        ]
        BrennerOn = "1"
        Vorlaufpumpe = "1"
        Warmwasserpump = "0"
        Vorlauftemp = "56"
        Ruecklauftemp = "44"
        ExamplePanel.Aussentemp = "222"
        Temp_Aussentemp = "4"
        Erster_Timer = "100"
        Aussentemp= "3"
           
        static_text = wx.StaticText(self, label="Schaltzeiten aktuell:", pos=(20, 30))
        static_text.SetFont(wx.Font(10, wx.SWISS, wx.NORMAL, wx.BOLD))
         
        wx.StaticText(self, label="(Ein)", pos=(60, 45))
        wx.StaticText(self, label="(Aus)", pos=(110, 45))
       
        self.timer_textctrls = []
        for nr, (on_value, off_value) in enumerate(on_off_times,1):
            wx.StaticText(self, label="%d.:"%nr, pos=(25, 33 + nr*30))
            self.timer_textctrls.append((
                wx.TextCtrl(self, value=On1time, pos=(50, 30 + nr*30), size=(40,-1)),
                wx.TextCtrl(self, value=Off1time, pos=(100, 30 + nr*30), size=(40,-1))
            ))
 

        self.header = wx.StaticText(self, label="Schaltzustände:", pos=(200, 30))

        self.header.SetFont(wx.Font(10, wx.SWISS, wx.NORMAL, wx.BOLD))


        self.header = wx.StaticText(self, label="Brenner", pos=(200, 63))
        self.brenner = wx.StaticText(self, label=BrennerOn, pos=(310, 63))

        self.header = wx.StaticText(self, label="Vorlaufpumpe", pos=(200, 93))
        self.vorlaufheizung = wx.StaticText(self, label=Vorlaufpumpe, pos=(310, 93))

        self.header = wx.StaticText(self, label="Warmwasserpumpe", pos=(200, 123))
        self.vorlaufww = wx.StaticText(self, label=Warmwasserpump, pos=(310, 123))
        

        self.header = wx.StaticText(self, label="Temperaturen:", pos=(370, 30))
        self.header.SetFont(wx.Font(10, wx.SWISS, wx.NORMAL, wx.BOLD))
        
        self.header = wx.StaticText(self, label="Aussentemp", pos=(370, 63))
        self.t_aussen = wx.StaticText(self, label=Temp_Aussentemp, pos=(480, 63))
        Temp_Aussentemp = wx.TextCtrl(self, style=wx.PROCESS_ENTER, value=Temp_Aussentemp, pos=(580, 63), size=(40,-1))
        self.Bind(wx.EVT_TEXT_ENTER, self.EvtAussentemp, Temp_Aussentemp)
        
        self.header = wx.StaticText(self, label="Vorlauftemp", pos=(370, 93))
        self.t_vorlaufheizung = wx.StaticText(self, label=Vorlauftemp, pos=(480, 93))

        self.header = wx.StaticText(self, label="Ruecklauftemp", pos=(370, 123))
        self.t_ruecklaufheizung = wx.StaticText(self, label=Ruecklauftemp, pos=(480, 123))

        self.header = wx.StaticText(self, label="Timer läuft", pos=(40, 300))
        self.Timer1 =wx.TextCtrl(self, value=Erster_Timer, pos=(100, 300), size=(40,-1))
       
        # Close button
        self.button =wx.Button(self, label="Quit", pos=(700, 500))
        self.Bind(wx.EVT_BUTTON, self.OnClose,self.button)
    
        self.Setzen =wx.Button(self, label="Programm setzen", pos=(100, 400))
        self.Bind(wx.EVT_BUTTON, self.Button_Auswahl,self.Setzen)


        #Radio-Buttons
        radioList = ['Frühschicht', 'Spätschicht', 'Nachtschicht', 'Nur Warmwasser', 'Urlaub daheim', 'Nachtabsenkung', 'Vollast Heizung', 'Vollast Wasser']
        rb = wx.RadioBox(self, label="Welches Programm möchten Sie laden ?", pos=(20, 210), choices=radioList,  majorDimension=3,style=wx.RA_SPECIFY_COLS)
        self.Bind(wx.EVT_RADIOBOX, self.EvtRadioBox, rb)


    def werte_setzen(self, on_off_times):
        for (on_value, off_value), (on_ctrl, off_ctrl) in zip(on_off_times, self.timer_textctrls):
            on_ctrl.SetValue(on_value)
            off_ctrl.SetValue(off_value)

    def ausgabe(self, wert_ausgabe):
        print wert_ausgabe
        lt = localtime()
        self.dat_time.SetLabel(strftime("%A, %d.%m.%Y, %X", lt))
        self.t_aussen.SetLabel(wert_ausgabe)
        
        
   
    def EvtRadioBox(self, event):
        
        BOX_Zaehler=event.GetInt()
        #Frühschicht ************* Hier die gewünschten Zeiten eintragen
        if BOX_Zaehler == 0: 
            on_off_times = [
            ("03:30", "07:00"),
            ("19:00", "21:00"),
            ("00:00", "00:00"),
            ("00:00", "00:00")
            ]
            self.werte_setzen(on_off_times)

        #Spätschicht
        elif BOX_Zaehler == 1: 
            on_off_times = [
            ("04:30", "05:30"),
            ("07:00", "08:30"),
            ("12:00", "13:00"),
            ("19:00", "21:00")
            ]
            self.werte_setzen(on_off_times)

        #Nachtschicht    
        elif BOX_Zaehler == 2: 
            on_off_times = [
            ("05:30", "06:30"),
            ("13:00", "14:30"),
            ("19:00", "21:00"),
            ("00:00", "00:00")
            ]
            self.werte_setzen(on_off_times)

    def EvtAussentemp(self, event):
        global rt
        rt.stop()
        print "Timer gestoppt und neu gestartet"
        rt = RepeatedTimer(1, self.ausgabe, Temp_Aussentemp.GetValue())
        
            
    def OnClose(self, event):
        rt.stop()
        frame.Destroy() 
       
    def Button_Auswahl(self, event):
        Ontime1 = "12:30"        
        Offtime1 = "14:00"
        self.ein_1.SetValue(Ontime1)
        self.aus_1.SetValue(Offtime1)
     
  
app = wx.App(False)
frame = wx.Frame(None,title="Heizung 0.2",size=(800,600))
panel = ExamplePanel(frame)
frame.Show()

print "Timer startet"
rt = RepeatedTimer(1, panel.ausgabe, "10")


app.MainLoop()

DANKE für Eure Unterstützung!

Re: Python GUI Variable

Verfasst: Samstag 4. Januar 2014, 14:03
von BlackJack
@andip: Schönes Beispiel warum Sternchen-Importe keine gute Idee sind. Im `threading`-Modul gibt es auch eine `enumerate()`-Funktion welche die laufenden Threads aufzählt und die keine Argumente erwartet. Das sagt Dir ja die Fehlermeldung.

Edit:

Code: Alles auswählen

from threading import Timer
from time import localtime, strftime
Edit2: Wobei die Klasse die den `Timer` verwendet unschön ist. Also nicht die Klasse, sondern wie die als globales Objekt verwendet wird. Und dann wird von einem anderen Thread aus auf die GUI zugegriffen, und das auch noch verändernd. Wenn das nicht abstürzt, dann hast Du einfach nur Glück, denn weder `wx` noch die darunter verwendeten GUI-Toolkits sind „thread safe”. Du möchtest stattdessen mal `wx.Timer` anschauen.

Re: Python GUI Variable

Verfasst: Samstag 4. Januar 2014, 15:43
von andip
Hallo BlackJack,

Wow, ein ganz schönes Stück Arbeit!!!!

Ich habe da jetzt massiv im Programm gearbeitet und den wx.timer eingesetzt.
Ich denke das sieht jetzt viel besser aus als vorher!

Code: Alles auswählen

# -*- coding: cp1252 -*-
# #!/usr/bin/python
import wx

from threading import Timer
from time import localtime, strftime
   
class ExamplePanel(wx.Panel):


    def __init__(self, parent):
        wx.Panel.__init__(self, parent)
        on_off_times = [
            ("04:30", "08:00"),
            ("12:00", "13:00"),
            ("19:00", "21:00"),
            ("00:00", "00:00")
        ]
        BrennerOn = "1"
        Vorlaufpumpe = "1"
        Warmwasserpump = "0"
        Vorlauftemp = "56"
        Ruecklauftemp = "44"
        Temp_Aussentemp = "4"
        Erster_Timer = "100"
        Aussentemp= "3"
        self.dat_time = wx.StaticText(self, label="Datum", pos=(20, 10))            
        static_text = wx.StaticText(self, label="Schaltzeiten aktuell:", pos=(20, 30))
        static_text.SetFont(wx.Font(10, wx.SWISS, wx.NORMAL, wx.BOLD))
         
        wx.StaticText(self, label="(Ein)", pos=(60, 45))
        wx.StaticText(self, label="(Aus)", pos=(110, 45))
       
        self.timer_textctrls = []
        for nr, (on_value, off_value) in enumerate(on_off_times,1):
            wx.StaticText(self, label="%d.:"%nr, pos=(25, 33 + nr*30))
            self.timer_textctrls.append((
                wx.TextCtrl(self, value=on_value, pos=(50, 30 + nr*30), size=(40,-1)),
                wx.TextCtrl(self, value=off_value, pos=(100, 30 + nr*30), size=(40,-1))
            ))
 

        self.header = wx.StaticText(self, label="Schaltzustände:", pos=(200, 30))

        self.header.SetFont(wx.Font(10, wx.SWISS, wx.NORMAL, wx.BOLD))


        self.header = wx.StaticText(self, label="Brenner", pos=(200, 63))
        self.brenner = wx.StaticText(self, label=BrennerOn, pos=(310, 63))

        self.header = wx.StaticText(self, label="Vorlaufpumpe", pos=(200, 93))
        self.vorlaufheizung = wx.StaticText(self, label=Vorlaufpumpe, pos=(310, 93))

        self.header = wx.StaticText(self, label="Warmwasserpumpe", pos=(200, 123))
        self.vorlaufww = wx.StaticText(self, label=Warmwasserpump, pos=(310, 123))
        

        self.header = wx.StaticText(self, label="Temperaturen:", pos=(370, 30))
        self.header.SetFont(wx.Font(10, wx.SWISS, wx.NORMAL, wx.BOLD))
        
        self.header = wx.StaticText(self, label="Aussentemp", pos=(370, 63))
        self.t_aussen = wx.StaticText(self, label=Temp_Aussentemp, pos=(480, 63))
        self.t_aussen2 = wx.TextCtrl(self, style=wx.PROCESS_ENTER, value=Temp_Aussentemp, pos=(580, 63), size=(40,-1))
        self.Bind(wx.EVT_TEXT_ENTER, self.EvtAussentemp, self.t_aussen2)
        
        self.header = wx.StaticText(self, label="Vorlauftemp", pos=(370, 93))
        self.t_vorlaufheizung = wx.StaticText(self, label=Vorlauftemp, pos=(480, 93))

        self.header = wx.StaticText(self, label="Ruecklauftemp", pos=(370, 123))
        self.t_ruecklaufheizung = wx.StaticText(self, label=Ruecklauftemp, pos=(480, 123))

        
        # Close button
        self.button =wx.Button(self, label="Quit", pos=(700, 500))
        self.Bind(wx.EVT_BUTTON, self.OnClose,self.button)
    
        self.Setzen =wx.Button(self, label="Programm setzen", pos=(100, 400))
        self.Bind(wx.EVT_BUTTON, self.Button_Auswahl,self.Setzen)


        #Radio-Buttons
        radioList = ['Frühschicht', 'Spätschicht', 'Nachtschicht', 'Nur Warmwasser', 'Urlaub daheim', 'Nachtabsenkung', 'Vollast Heizung', 'Vollast Wasser']
        rb = wx.RadioBox(self, label="Welches Programm möchten Sie laden ?", pos=(20, 210), choices=radioList,  majorDimension=3,style=wx.RA_SPECIFY_COLS)
        self.Bind(wx.EVT_RADIOBOX, self.EvtRadioBox, rb)

        self.timer = wx.Timer(self)
        self.Bind(wx.EVT_TIMER, self.update, self.timer)
        self.timer.Start(1000)

    def update(self, event):
        lt = localtime()
        self.dat_time.SetLabel(strftime("%A, %d.%m.%Y, %X", lt))
        print self.t_aussen2.GetValue()


    def werte_setzen(self, on_off_times):
        for (on_value, off_value), (on_ctrl, off_ctrl) in zip(on_off_times, self.timer_textctrls):
            on_ctrl.SetValue(on_value)
            off_ctrl.SetValue(off_value)

    def EvtAussentemp(self, event):
        self.t_aussen.SetLabel(self.t_aussen2.GetValue())
        print "Aussentemp Wert geändert"
   
    def EvtRadioBox(self, event):
        
        BOX_Zaehler=event.GetInt()
        #Frühschicht ************* Hier die gewünschten Zeiten eintragen
        if BOX_Zaehler == 0: 
            on_off_times = [
            ("03:30", "07:00"),
            ("19:00", "21:00"),
            ("00:00", "00:00"),
            ("00:00", "00:00")
            ]
            self.werte_setzen(on_off_times)

        #Spätschicht
        elif BOX_Zaehler == 1: 
            on_off_times = [
            ("04:30", "05:30"),
            ("07:00", "08:30"),
            ("12:00", "13:00"),
            ("19:00", "21:00")
            ]
            self.werte_setzen(on_off_times)

        #Nachtschicht    
        elif BOX_Zaehler == 2: 
            on_off_times = [
            ("05:30", "06:30"),
            ("13:00", "14:30"),
            ("19:00", "21:00"),
            ("00:00", "00:00")
            ]
            self.werte_setzen(on_off_times)

             
    def OnClose(self, event):
        self.timer.Stop()
        frame.Destroy() 
       
    def Button_Auswahl(self, event):
        Ontime1 = "12:30"        
        Offtime1 = "14:00"
        self.ein_1.SetValue(Ontime1)
        self.aus_1.SetValue(Offtime1)
     
  
app = wx.App(False)
frame = wx.Frame(None,title="Heizung 0.9",size=(800,600))
panel = ExamplePanel(frame)
frame.Show()

app.MainLoop()

Gibt es noch mehr Verbesserungspotenzial?

Re: Python GUI Variable

Verfasst: Samstag 4. Januar 2014, 16:55
von BlackJack
@andip: Der ersten beiden Zeilen sind übrigens falsch herum und bei der zweiten, die eigentlich die erste sein müsste ist am Anfang einmal '# ' zu viel.

Wenn Du den `threading.Timer` nicht mehr verwendest, brauchst Du ihn auch nicht mehr zu importieren. ;-) In der `__init__()` wird auch nicht alles verwendet was an einen Namen gebunden wird.

Jetzt könnte man schon fast das ``if __name__ == '__main__':``-Idiom verwenden um das bisschen Hauptprogramm in einer Funktion verschwinden zu lassen — wenn da nicht `OnClose()` wäre was einfach so auf das modulglobale `frame` zugreift. Einfach aber nicht wirklich robust kann man das mit ``self.GetParent().Destroy()`` vermeiden. Das setzt natürlich voraus, dass `frame` tatsächlich das Elternelement ist, wenn sich das ändert weil das Panel vielleicht erst noch in ein anderes Container-Widget gesteckt wird, dann müsste man da nachbessern.

In der `Button_Auswahl()` wird auf `self.ein_1` und `self.aus_1` zugegriffen ­— die beiden Attribute werden aber soweit ich das sehe nirgends definiert‽

Re: Python GUI Variable

Verfasst: Samstag 4. Januar 2014, 17:43
von andip
Hallo BlackJack:
Der ersten beiden Zeilen sind übrigens falsch herum und bei der zweiten, die eigentlich die erste sein müsste ist am Anfang einmal '# ' zu viel.
Erledigt!
Wenn Du den `threading.Timer` nicht mehr verwendest, brauchst Du ihn auch nicht mehr zu importieren.
Erledigt! Ist bei den Aufräumarbeiten überflüssig geworden.
In der `Button_Auswahl()` wird auf `self.ein_1` und `self.aus_1` zugegriffen ­— die beiden Attribute werden aber soweit ich das sehe nirgends definiert‽
Ja, habe ich auch erledigt. Die waren auch übrig geblieben.

Bis hierher prima! Alles erreicht!

Aber jetzt kommt das hier:
Jetzt könnte man schon fast das ``if __name__ == '__main__':``-Idiom verwenden um das bisschen Hauptprogramm in einer Funktion verschwinden zu lassen — wenn da nicht `OnClose()` wäre was einfach so auf das modulglobale `frame` zugreift. Einfach aber nicht wirklich robust kann man das mit ``self.GetParent().Destroy()`` vermeiden. Das setzt natürlich voraus, dass `frame` tatsächlich das Elternelement ist, wenn sich das ändert weil das Panel vielleicht erst noch in ein anderes Container-Widget gesteckt wird, dann müsste man da nachbessern.
Ja, da waren sie wieder, meine 3 Probleme: Keine Ahnung, keine Meinung, kein Konzept...

Gibt's den Text auch in einfach?

Zu OnClose: Das habe ich irgendwo aufgeschnappt. Man soll Timer am Ende des Programms anhalten und Fenster schließen.

Re: Python GUI Variable

Verfasst: Samstag 4. Januar 2014, 21:05
von BlackJack
@andip: Gemeint war das hier:

Code: Alles auswählen

def main():
    app = wx.App(False)
    frame = wx.Frame(None, title='Heizung 0.9', size=(800, 600))
    panel = ExamplePanel(frame)
    frame.Show() 
    app.MainLoop()


if __name__ == '__main__':
    main()
Und das geht nur wenn auf die nun lokalen Namen in `main()` nicht von irgendwo anders her zugegriffen wird. Was eigentlich auch nicht der Fall sein sollte, aber bei Dir in der `OnClose()` halt doch passiert:

Code: Alles auswählen

    def OnClose(self, event):
        self.timer.Stop()
        frame.Destroy()
Die Methode bekommt das `frame`-Objekt nicht übergeben sondern baut einfach darauf das es so etwas ausserhalb der Klasse schon irgendwie geben wird. Das ist eine Abhängigkeit von der Umgebung die man eigentlich nicht haben möchte.

Da das Objekt das Eltern-Widget vom dem `Panel` ist auf dem die Methode definiert ist, kann man es von dort aber auch wieder abfragen:

Code: Alles auswählen

    def OnClose(self, event):
        self.timer.Stop()
        self.GetParent().Destroy()
Und schon ist man nicht mehr von einem magischen `frame` abhängig. Man könnte jetzt sogar mehrere Heizungsfenster öffnen, wenn man das beispielsweise irgendwann mal zu einer Software ausbauen möchte mit der man nicht nur eine Anlage verwalten kann. Diese Vermeidung von globalem Zustand und die Möglichkeit der Wiederverwendung ist ja eine der Motivationen warum man Klassen erfunden hat.

Re: Python GUI Variable

Verfasst: Montag 13. Januar 2014, 17:28
von andip
Hi BlackJack,
ich bin jetzt ein paar Tage nicht dazu gekommen hier weiter zu arbeiten.
Natürlich habe ich Deine Anregungen ins Progi eingebaut.
Und natürlich läuft das!
Durch Deine Hilfe ist mein Programm wohl tatsächlich ein wenig stabiler und professioneller geworden.
Ich Danke Dir dafür!!!

Ohne Deine Hilfe und die der anderen Nutzer hätte ich wahrscheinlich noch ein paar Monate rumprobiert ohne wirklich etwas zu erreichen...


DANKE!!!

Ich mache jetzt mal weiter und würde das Programm dann gerne nochmals zur Diskussion stellen.