Daten aus einer Datei lesen

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
Antworten
WernerSch
User
Beiträge: 13
Registriert: Sonntag 25. Februar 2018, 19:50

Guten Tag alle zusammen
Ich bin noch ein Anfänger beim Programmieren und brauche Hilfe. Ich weiss das ich Kraut und Rüben Programmiert habe.
Ich möchte nur einige Servos Steuern und möchte Variablen aus einer Datei laden und die dann auch in meinem Programm gültig sind.
Hier ist ein ausgekürztes Beispiel.
das steht in der Parameter.dat:

Code: Alles auswählen

servo_anz=20    
v_zeit=0.06  
s1_min = 200
s1_max = 450 
k_s1=0

s2_min = 200
s2_max = 450
k_s2=1

s3_min = 200
s3_max = 450 
k_s3=5

s4_min = 200
s4_max = 450
k_s4=6
Das ist mein Programm nach vielen Versuchen

Code: Alles auswählen

import sys, time, Adafruit_PCA9685, tkinter,pickle,os
from tkinter import *
pwm = Adafruit_PCA9685.PCA9685()
pwm.set_pwm_freq(60)

    
def tor1():
     #Daten aus Datei verarbeiten
     servo1_min = s1_min
     servo1_max = s1_max
     kanal1=k_s1
     servo2_min = s2_min
     servo2_max = s2_max
     kanal2=k_s2
     #Variabelen verrechnen
     servo1_step=(servo1_max-servo1_min)/servo_anz 
     servo1_pos=servo1_min #Absolute Startposition
     servo2_step=(servo2_max-servo2_min)/servo_anz
     servo2_pos=servo2_min #Absolute Startposition
     oeffnen()
def tor2():
     #Daten aus Datei verarbeiten
     #Funktioniert, wenn ich Werte eintrage, aber nicht aus der Datei
     servo1_min = s3_min
     servo1_max = s3_max
     kanal1=k_s3
     servo2_min = s4_min
     servo2_max = s4_max     
     kanal2=k_s4

     #Variabelen verrechnen

     servo1_step=(servo1_max-servo1_min)/servo_anz
     servo1_pos=servo1_min   #Absolute Startposition
     servo2_step=(servo2_max-servo2_min)/servo_anz
     servo2_pos=servo2_min   #Absolute Startposition

     #Variabelen ausführen
     
     for i in range(int(servo_anz)):
            servo1_pos=int(servo1_pos+servo1_step)
            pwm.set_pwm(kanal1, 0, servo1_pos) 
            time.sleep(float(v_zeit))
        
            servo2_pos=int(servo2_pos+servo2_step)
            pwm.set_pwm(kanal2, 0, servo2_pos)
            time.sleep(float(v_zeit))
    
     print(servo1_pos,servo2_pos)
 
     for i in range(servo_anz):
            servo1_pos=int(servo1_pos-servo1_step)
            pwm.set_pwm(kanal1, 0, servo1_pos)
            time.sleep(v_zeit)
        
            servo2_pos=int(servo2_pos-servo2_step)
            pwm.set_pwm(kanal2, 0, servo2_pos)
            time.sleep(v_zeit)

        
     print(servo1_pos,servo2_pos)
     
def oeffnen():
     for i in range(int(servo_anz)):
            servo1_pos=int(servo1_pos+servo1_step)
            pwm.set_pwm(kanal1, 0, servo1_pos) 
            time.sleep(float(v_zeit))
        
            servo2_pos=int(servo2_pos+servo2_step)
            pwm.set_pwm(kanal2, 0, servo2_pos)
            time.sleep(float(v_zeit))
     print(servo1_pos,servo2_pos)
 
     for i in range(servo_anz):
            servo1_pos=int(servo1_pos-servo1_step)
            pwm.set_pwm(kanal1, 0, servo1_pos)
            time.sleep(v_zeit)
        
            servo2_pos=int(servo2_pos-servo2_step)
            pwm.set_pwm(kanal2, 0, servo2_pos)
            time.sleep(v_zeit)
     print(servo1_pos,servo2_pos)

def Grafik():
    rootWindow=Tk()
    rootWindow.wm_geometry("500x300")

    b1=Button(rootWindow,text="tor 1",command=tor1)

    b1.place(x=50, y=50, anchor="s")

    b2=Button(rootWindow,text="tor 2",command=tor2)

    b2.place(x=100, y=50, anchor="s")

def daten():
    file=open("parameter.dat")
    
    data=pickle.load(file)

def endlos():
     it=1

def programm():
     daten()
     Grafik()
#oeffnen()
#schliessen()

it=1
main=programm()
if it==1:
     programm

main.mainloop()


def ende():
    sys.exit(0)

Vielen Vielen Dank für die Hilfe
WernerSch
User
Beiträge: 13
Registriert: Sonntag 25. Februar 2018, 19:50

Mir fehlt die Struktur im Python. Wie werden Variablen übergeben. Ich kann ein wenig Basic und sehr gut CNC Programmierung
WernerSch
User
Beiträge: 13
Registriert: Sonntag 25. Februar 2018, 19:50

Guten Abend alle zusammen
Ich hab folgendes probiert

Code: Alles auswählen

import sys, time, Adafruit_PCA9685, tkinter,pickle,os,subprocess
from tkinter import *

pwm = Adafruit_PCA9685.PCA9685()
pwm.set_pwm_freq(60)

    
def tor1():
     #Daten aus Datei verarbeiten
     servo1_min = s1_min
     servo1_max = s1_max
     kanal1=k_s1
     servo2_min = s2_min
     servo2_max = s2_max
     kanal2=k_s2
     #Variabelen verrechnen
     servo1_step=(servo1_max-servo1_min)/servo_anz 
     servo1_pos=servo1_min #Absolute Startposition
     servo2_step=(servo2_max-servo2_min)/servo_anz
     servo2_pos=servo2_min #Absolute Startposition
     oeffnen()
def tor2():
     #Daten aus Datei verarbeiten
     #Funktioniert, wenn ich Werte eintrage, aber nicht aus der Datei
     servo1_min = s3_min
     servo1_max = s3_max
     kanal1=k_s3
     servo2_min = s4_min
     servo2_max = s4_max     
     kanal2=k_s4

     #Variabelen verrechnen

     servo1_step=(servo1_max-servo1_min)/servo_anz
     servo1_pos=servo1_min   #Absolute Startposition
     servo2_step=(servo2_max-servo2_min)/servo_anz
     servo2_pos=servo2_min   #Absolute Startposition

     #Variabelen ausführen
     
     for i in range(int(servo_anz)):
            servo1_pos=int(servo1_pos+servo1_step)
            pwm.set_pwm(kanal1, 0, servo1_pos) 
            time.sleep(float(v_zeit))
        
            servo2_pos=int(servo2_pos+servo2_step)
            pwm.set_pwm(kanal2, 0, servo2_pos)
            time.sleep(float(v_zeit))
    
     print(servo1_pos,servo2_pos)
 
     for i in range(servo_anz):
            servo1_pos=int(servo1_pos-servo1_step)
            pwm.set_pwm(kanal1, 0, servo1_pos)
            time.sleep(v_zeit)
        
            servo2_pos=int(servo2_pos-servo2_step)
            pwm.set_pwm(kanal2, 0, servo2_pos)
            time.sleep(v_zeit)

        
     print(servo1_pos,servo2_pos)
     
def oeffnen():
     for i in range(int(servo_anz)):
            servo1_pos=int(servo1_pos+servo1_step)
            pwm.set_pwm(kanal1, 0, servo1_pos) 
            time.sleep(float(v_zeit))
        
            servo2_pos=int(servo2_pos+servo2_step)
            pwm.set_pwm(kanal2, 0, servo2_pos)
            time.sleep(float(v_zeit))
     print(servo1_pos,servo2_pos)
 
     for i in range(servo_anz):
            servo1_pos=int(servo1_pos-servo1_step)
            pwm.set_pwm(kanal1, 0, servo1_pos)
            time.sleep(v_zeit)
        
            servo2_pos=int(servo2_pos-servo2_step)
            pwm.set_pwm(kanal2, 0, servo2_pos)
            time.sleep(v_zeit)
     print(servo1_pos,servo2_pos)

def Grafik():
    rootWindow=Tk()
    rootWindow.wm_geometry("500x300")

    b1=Button(rootWindow,text="tor 1",command=tor1)

    b1.place(x=50, y=50, anchor="s")

    b2=Button(rootWindow,text="tor 2",command=tor2)

    b2.place(x=100, y=50, anchor="s")

def daten():
    datei=open("parameter.dat","r")
    for zeile in datei.readlines():
          pos_trennung=zeile.find("=")
          pos_ende=zeile.find("/n")
          vari_name=zeile[0:(pos_trennung-1)]
          wert=zeile[(pos_trennung+1):pos_ende]
          variable=(vari_name,"=",wert)
          words=zeile.strip("/n")
          
          print(vari_name,wert)    #zur kontrolle  kommt servo_an 20
          print(variable) # funktioniert nicht kommt sowas ('servo_an', '=', '20')

def main():
     daten()
     Grafik()
     


def ende():
    sys.exit(0)

if __name__ == '__main__':
     main()

Code: Alles auswählen

servo_anz=20
v_zeit=0.06
s1_min=200
s1_max=450
k_s1=0

s2_min=200
s2_max=450
k_s2=1

s3_min=200
s3_max=450
k_s3=5

s4_min=200
s4_max=450
k_s4=6
Jetzt wird jede Zeile gelesen , aber nicht in variablen geschrieben. ich werde irre.
Immer bekomme ich den Fehler 'name_s1_min' is not defined.

Wie bekomme ich es hin, das die Variablen Namen und die Variablen Werte in eine Programm gültige Liste übernommen werden.
Für einen Denkanstoss bin ich sehr Dankbar
WernerSch
User
Beiträge: 13
Registriert: Sonntag 25. Februar 2018, 19:50

falsch
Immer bekomme ich den Fehler "name 's1_min' is not defined".
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@WernerSch: erst mal ein paar Formalitäten: eingerückt wird immer mit 4 Leerzeichen pro Ebene, nicht 4,5,6 oder 7, sonst mußt Du beim Hin- und Herkopieren ständig die Einrückungen reparieren. Jeder Import gehört in eine eigne Zeile und *-Importe vermeiden, sonst verliert man schnell den Überblick, was alles importiert wird. Typen von Variablen sollten fix sein, so dass es nicht nötig ist, bei jeder Verwendung nochmal den Typ umzuwandeln (z.B. bei `float(v_zeit)`). Das ständige Umwandeln in `int` Deiner Positionen machen die Positionsangabe sehr ungenau.

Variablen sind lokal, das heißt, sie gelten nur innerhalb der Funktion, in der sie definiert werden. `oeffnen` braucht z.B. servo_anz, servo1_pos, kanal1, usw. die man als Parameter übergeben muß.

Code: Alles auswählen

def oeffnen(servo_anz, servo1_pos, servo1_step, kanal1, servo2_pos, servo2_step, kanal2, v_zeit):
def oeffnen(servo_anz, servo1_pos, servo1_step, kanal1, servo2_pos, servo2_step, kanal2, v_zeit):
    for i in range(servo_anz):
        pwm.set_pwm(kanal1, 0, int(servo1_pos + i * servo1_step))
        time.sleep(v_zeit)
        
        pwm.set_pwm(kanal2, 0, int(servo2_pos + i * servo2_step))
        time.sleep(v_zeit)
 
     for i in reversed(range(servo_anz)):
        pwm.set_pwm(kanal1, 0, int(servo1_pos + i * servo1_step))
        time.sleep(v_zeit)
        
        pwm.set_pwm(kanal2, 0, int(servo2_pos + i * servo2_step))
        time.sleep(v_zeit)
tor2 macht das selbe wie tor1, so dass man nur eine Funktion braucht, die man dann mit unterschiedlichen Parametern aufruft.

Zu `daten`: statt mit `find` und Indizes zu arbeiten gibt es str.partition. Das Zeile-Ende-Zeichen ist '\n' nicht '/n'.

Code: Alles auswählen

def read_data():
    result = {}
    with open("parameter.dat") as lines:
        for line in lines:
            name, _, value = line.partition('=')
            result[name.strip()] = value.strip()
    return result
Ich habe das Ergebnis in ein Wörterbuch geschrieben, weil das die Methode ist, um Namen Werten zuzuordnen. Benutzt wird das Wörterbuch als

Code: Alles auswählen

data = read_data()
v_zeit = float(data['v_zeit'])
Tholo
User
Beiträge: 177
Registriert: Sonntag 7. Januar 2018, 20:36

Ich hab die Module nicht installiert und daher nur in der IDE mal drüber geschaut. Ich bin selbst Anfänger trotzdem möchte ich mal ein paar Sachen sagen, welche mir aufgefallen sind.

Deine Delimter sind falsch oder? Du machst aber sind die Delimeter
' ' or 'space'
'\t' or 'tab'
'\n' or 'new line'


Ich habe hier mal was zusammengeschrieben. So bekommst die die Daten schon einmal in ein Dictonary

Code: Alles auswählen

def daten():
def daten():
    filedict = {}
    with open("parameter.dat", "r") as paradat:
        for zeile in paradat.read().rsplit(): #ignoriert neue Zeile "\n"
            splitted = zeile.split("=")
            key = splitted[0]
            filedict[key] = splitted[1]  # das geht bestimmt viel besser aber da hänge ich selbst gerade
    return filedict

daten()
print(daten())
Output

Code: Alles auswählen

{'servo_anz': '20', 'v_zeit': '0.06', 's1_min': '200', 's1_max': '450', 'k_s1': '0', 's2_min': '200', 's2_max': '450', 'k_s2': '1', 's3_min': '200', 's3_max': '450', 'k_s3': '5', 's4_min': '200', 's4_max': '450', 'k_s4': '6'}
Tante Edit sagt:Sirius3 war schenller und elganter...
Wie gesagt ebenfalls Anfänger
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@Tholo: macht ja nichts, vielleich hilft es ja, wenn man es auf zwei verschiedene Arten erklärt bekommt. Bei Deiner Funktion ist leider noch ein bißchen was falsch. `rsplit` ist das selbe wie `split` solange man keine Anzahl angibt, denn es ist egal, ob man einen String von rechts oder von links aufspaltet. Damit liefert `paradat.read().rsplit()` auch keine Zeilen ohne Zeile-Ende-Zeichen, sondern den gesamten Dateiinhalt am Leerraum aufgespalten. Beispiel:

Code: Alles auswählen

>>> "Zeile1\nZeile2\nund noch eine Zeile\n".rsplit()
['Zeile1', 'Zeile2', 'und', 'noch', 'eine', 'Zeile']
Mit was Du es vielleicht verwechslt hast, ist `rstrip`, das Leerraum am Ende eines Strings entfernt. Deshalb sieht man oft:

Code: Alles auswählen

for zeile in paradat:
    zeile = zeile.rstrip() # entfernt \n und anderen Leerraum
    ...
Tholo
User
Beiträge: 177
Registriert: Sonntag 7. Januar 2018, 20:36

Ja das "\n" zu entfernen war mein Ziel. Nur wieso ist der Output mit rsplit genauso erfolgreich wie mit rstrip.
Am oberen Beispiel erkennt man ja, dass das Dict richtig befüllt ist.

Oder Anderer Ansatz. weil das "blub\n" ja als value ins Dict geht, wird der Zeilenumbruch sowieso ignoriert. Kann das sein?
Also mal wieder durch Glück den richtigen Output generiert..Schon das 2te mal so...
Sirius3 hat geschrieben:

Code: Alles auswählen

for line in lines:
            name, _, value = line.partition('=')
            result[name.strip()] = value.strip()
Die For Schleife versteh ich nicht ganz.
name ist klar, er nimmt Wert[0], Value[1] aber was ist ,_,? Hier wird doch keine Variable geheim weitergegeben..*Verwirrt*
zu der Zeit ist der Output doch Key=value
Wüßte nicht mal wie ich danach schauen sollte
Benutzeravatar
noisefloor
User
Beiträge: 3843
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,
aber was ist ,_,?
Der Unterstrich ist ein gültiger Variablenname in Python:

[codebox=pycon file=Unbenannt.txt]>>> text = 's1_min=servo_1_min'
>>> left, _, right = text.partition('=')
>>> left
's1_min'
>>> _
'='
>>> right
'servo_1_min'
>>>[/code]

Per Konvention nutzt man _ aber für "Wegwerfvariablen", d.h. Variablen, denen man einen Wert zuweisen muss, aber diesen nicht braucht. `partition()` liefert ja ein Tupel mit drei Werten zurück, den mittleren (also das =) braucht man hier aber nicht.

Gruß, noisefloor
Benutzeravatar
DeaD_EyE
User
Beiträge: 1012
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

Welchen Unterschied macht es eigentlich partition anstatt von split zu verwenden?
Das zweite Argument der Methode split definiert wie oft der String geteilt wird.
1 gibt an, dass er nur einmal beim ersten Vorkommnis der gesuchten Zeichenkette geteilt wird.
Also bekommt man eine Liste mit zwei Elementen.

Code: Alles auswählen

text = 'Foo = Bar = Foo'
left1, right1 = text.split('=', 1)
left2, _,  right2 = text.partition('=')
print(left1, '|', right2)
print(left2, '|', right2)
Das Beispiel mit partition habe ich schon oft gesehen. In wirklich jeden Beispiel, dass ich sah, schmeißt man die gesuchte Zeichenkette weg.
Wieso macht man das so?
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@DeaD_EyE: partition garantiert, dass man immer ein 3-Tupel als Ergebnis bekommt.

Code: Alles auswählen

>>> "a=5".partition('=')
('a', '=', '5')
>>> "a=5".partition(':')
('a=5', '', '')
Am zweiten Rückgabewert kann man daher unterscheiden, ob der Separator im String war, oder nicht.
Benutzeravatar
DeaD_EyE
User
Beiträge: 1012
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

Danke.
Die Methode split macht das nicht. Man kann die maximale Anzahl vorgeben.
Es ist bei split aber nicht gewährleistet, dass exakt X Elemente ausgegeben werden.
Da ist partition besser.
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
WernerSch
User
Beiträge: 13
Registriert: Sonntag 25. Februar 2018, 19:50

Vielen vielen Dank an euch drei. Ohne eure Hilfe wäre ich nicht dahin gekommen. Ich hab 6 Bücher über Python und ihr könnt mir glauben, alle zu dem Thema gelesen und NICHT Verstanden zu haben.
Ich habe als ERSTES gelernt, das ich den Code des Helfers nicht in meinen Code direkt übertragen sollte und kleinere Programme zum ausprobieren schreiben, denn Copy Paste geht dann besser.
Als Zweites hab ich ein wenig Verstanden, das man was in die Klammern schreiben muss. (Bei meiner bisherigen Kraut und Rüben Programmierung, war das nicht nötig)
Als Drittes: Objektprogrammierung ist nichts anderes wie Unterprogramme aufrufen, ohne deklarierte Variablen. Das bereitet mir die Größten Probleme, denn in meinem CNC Programm deklariere ich an einer Stelle und sie sind dann in meinem Programm aktiv. Ich denke, da brauche ich noch viel viel Zeit , um das zu verstehen, wie die Mechanismen sind.
Hier mein Aktueller Code:

Code: Alles auswählen

import sys, time, Adafruit_PCA9685, tkinter,shelve,os,subprocess
from tkinter import *

pwm = Adafruit_PCA9685.PCA9685()
pwm.set_pwm_freq(60)

    
def tor1():
     #Variable uebergeben
     daten=read_data()
     servo1_min = float(daten['s1_min'])
     servo1_max = float(daten['s1_max'])
     kanal1=int(daten['k_s1'])
     servo2_min = float(daten['s2_min'])
     servo2_max = float(daten['s2_max'])
     kanal2=int(daten['k_s2'])
     servo_anz=int(daten['servo_anz'])
     v_zeit=float(daten['v_zeit'])
     
     oeffnen(servo1_min,servo1_max,kanal1,servo2_min,servo2_max,kanal2,servo_anz,v_zeit)

     #print(servo1_pos,servo2_pos) #das funktioniert nicht Sie sind nicht Definiert

def tor2():
     #Variable uebergeben
     daten=read_data()
     servo1_min = float(daten['s3_min'])
     servo1_max = float(daten['s3_max'])
     kanal1=int(daten['k_s3'])
     servo2_min = float(daten['s4_min'])
     servo2_max = float(daten['s4_max'])
     kanal2=int(daten['k_s4'])
     servo_anz=int(daten['servo_anz'])
     v_zeit=float(daten['v_zeit'])
     
     oeffnen(servo1_min,servo1_max,kanal1,servo2_min,servo2_max,kanal2,servo_anz,v_zeit)
    
def oeffnen(servo1_min,servo1_max,kanal1,servo2_min,servo2_max,kanal2,servo_anz,v_zeit):

     servo1_step=(servo1_max-servo1_min)/servo_anz 
     servo1_pos=servo1_min #Absolute Startposition
     servo2_step=(servo2_max-servo2_min)/servo_anz
     servo2_pos=servo2_min #Absolute Startposition

     for i in range(int(servo_anz)):
            servo1_pos=int(servo1_pos+servo1_step)
            pwm.set_pwm(kanal1, 0, servo1_pos) 
            time.sleep(float(v_zeit))
        
            servo2_pos=int(servo2_pos+servo2_step)
            pwm.set_pwm(kanal2, 0, servo2_pos)
            time.sleep(float(v_zeit))
            
     print(servo1_pos,servo2_pos)
     return(servo1_pos,servo2_pos) #hiermit wollte ich Variable zurück in die rufende Funktion geben



def schliessen(): 
     for i in range(servo_anz):
            servo1_pos=int(servo1_pos-servo1_step)
            pwm.set_pwm(kanal1, 0, servo1_pos)
            time.sleep(v_zeit)
        
            servo2_pos=int(servo2_pos-servo2_step)
            pwm.set_pwm(kanal2, 0, servo2_pos)
            time.sleep(v_zeit)
     print(servo1_pos,servo2_pos)

def Grafik():
    rootWindow=Tk()
    rootWindow.wm_geometry("500x300")

    b1=Button(rootWindow,text="tor 1",command=tor1)

    b1.place(x=50, y=50, anchor="s")

    b2=Button(rootWindow,text="tor 2",command=tor2)

    b2.place(x=100, y=50, anchor="s")


def read_data():
    result={}
    with open("parameter.dat") as lines:
        for line in lines:
            name, _, value = line.partition('=')
            result[name.strip()] = value.strip()
    return result
    close("parameter.dat")  # muss ich das File schliessen?
    
    


def main():
     read_data()
     daten1=read_data()
     test=float(daten1['s1_min'])
     print(test)
     Grafik()
     


def ende():
    sys.exit(0)

if __name__ == '__main__':
     main()
die Datei

Code: Alles auswählen

servo_anz=20
v_zeit=0.06

s1_min=198
s1_max=456
k_s1=0

s2_min=202
s2_max=440
k_s2=1

s3_min=190
s3_max=400
k_s3=2

s4_min=195
s4_max=460
k_s4=3
Wie ihr euch denken könnt, brauche ich mal wieder einen Tip, wie ich aus einer Funktion, Variablen zurück an das rufende Unterprogramm zurückgeben kann. Ist aber nicht so wichtig, denn ich würde sonnst Merker einbauen, die in eine Datei zurück geschrieben werden.
Dieses Projekt soll meine Drehscheibe und meine Lokschuppen(20) steuern.
Macht mir RICHTIG viel Spass das programmieren und öffnet den Kopf.
Ich bin 57 Jahre jung und befasse mich mit dem Raspberry Pi und Python(Objektorientiert)
WernerSch
User
Beiträge: 13
Registriert: Sonntag 25. Februar 2018, 19:50

Danke an euch vier
WernerSch
User
Beiträge: 13
Registriert: Sonntag 25. Februar 2018, 19:50

Guten Abend alle zusammen
Ich hab mal wieder das gleiche Problem

Das ist mein Programm

Code: Alles auswählen

def daten():
    
    filedict={}
    with open("tor1.dat","r") as para:
        for zeile in para.read().rsplit():
            print(zeile)
            splitted=zeile.split("=")
            key=splitted[0]
            filedict[key]=splitted[1]
            
    return filedict

daten()
s=servo1_max+servo2_max
print(s)
e.close()

Code: Alles auswählen

servo_anz=20    
v_zeit=0.06  
servo1_min=200
servo1_max=450 
kanal1=0
servo2_min=205
servo2_max=405
kanal2=1

und das sind die Fehler Meldungen

Code: Alles auswählen

>>> 
================ RESTART: /home/pi/lokschuppen/Datei_lesen.py ================
servo_anz=20
v_zeit=0.06
servo1_min=200
servo1_max=450
kanal_1=0
servo2_min=205
servo2_max=405
kanal_2=1
Traceback (most recent call last):
  File "/home/pi/lokschuppen/Datei_lesen.py", line 15, in <module>
    s=servo1_max+servo2_max
NameError: name 'servo1_max' is not defined
>>> 
Ich hatte alles was hier vorher in diesem Thread steht, ausprobiert. Nicht eins läuft
Nicht weiter schlimm, weil ich eine andere Lösung hatte, aber jetzt möchte ich eine Sicherungs Datei einlesen und das geht nicht. Da sitze ich mal wieder einige Abende drann. Ich würde mich über ein laufendes Beispiel sehr freuen
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@WernerSch: man muß mit Rückgabewerten einer Funktion auch etwas machen. Wenn man sie nur aufruft und das Ergebnis wegschmeißt, kann man es gleich sein lassen. Das Ergebnis ist dann ein Wörterbuch mit Strings, das heißt, um die Werte benutzen zu können, mußt Du sie aus dem Wörterbuch auslesen und in eine Zahl umwandeln. Ansonsten gilt immer noch das, was ich zu `read` und `rsplit` und deren falscher Verwendung geschrieben habe.
WernerSch
User
Beiträge: 13
Registriert: Sonntag 25. Februar 2018, 19:50

Ich habe ein Riesen Problem. Ich habe seit Jahren Python Bücher über Bücher,die ich auch immer wieder lese. Für meine Begriffe, befassen die sich nur mit einer neuen programmierung des Programmes Word. Ich versteh sie nicht. Hast du nicht einen Tip, welches Buch sich mit Python Geometrie,Zahlen und Berechnungen befasst, dann wird sicherlich auch mal mein Groschen fallen..
Ich bin ja auch bis jetzt ans Ziel gekommen mit Kraut und Rüben Programmierung. Nur das ist nicht mehr mein Ziel. Ich möchte schon gerne mehr Lernen und Wissen über die Sprache und ihre Struktur.
Warum habe ich soviele Bücher. Ich gehe immer in eine Buchhandlung und schaue mir das Buch an und rein, finde dann auch eine Sache die ich Verstehe und somit wurde es gekauft. Nur zur Struktur hab ich bis heute kein für mich verständliches gefunden. Struktur heisst für mich, Welche Variablen sind wo Aktiv.
Entschuldigt nochmal meine Einrückungen, das kommt vom Editor des Raspi´s. Wing läuft auf ihm leider nicht und auf meinem Hauptrechner , laufen die Python Programme des Raspi´s nicht, weil die Funktionen dessen nicht gefunden werden. Mega Mist, denn im Wing, sehe ich die Ergebnisse der Variablen sofort die ich in der normalen Python Umgebung nicht sehe. Eine Programm Entwicklung ist da schon sehr ZÄH
Ich bin ja auch 2 Schritte weiter gekommen

Code: Alles auswählen

#läuft, diese Version soll die Zustandsdatei lesen und weiter verarbeiten und neu schreiben
import sys,re, time, Adafruit_PCA9685, tkinter,shelve,os,subprocess
from tkinter import *

pwm = Adafruit_PCA9685.PCA9685()
pwm.set_pwm_freq(60)

    
def tor1():
     datei_n=tor1
     datei_name=(("tor1")+str(".dat"))
     daten=read_data(datei_name)
     servo1_min = float(daten['servo1_min'])
     servo1_max = float(daten['servo1_max'])
     kanal1=int(daten['kanal1'])
     servo2_min = float(daten['servo2_min'])
     servo2_max = float(daten['servo2_max'])
     kanal2=int(daten['kanal2'])
     servo_anz=int(daten['servo_anz'])
     v_zeit=float(daten['v_zeit'])
     
     bewegen(servo1_min,servo1_max,kanal1,servo2_min,servo2_max,kanal2,servo_anz,v_zeit,datei_name)

     s1=servo1_max
     s2=servo2_max
     servo1_max=int(servo1_min)
     servo2_max=int(servo2_min)
     servo1_min=int(s1)
     servo2_min=int(s2)
     
     datei_neu(servo1_min,servo1_max,kanal1,servo2_min,servo2_max,kanal2,servo_anz,v_zeit,datei_name)

def tor2():
     datei_name=(("tor2")+str(".dat"))
     daten=read_data(datei_name)
     servo1_min = float(daten['servo1_min'])
     servo1_max = float(daten['servo1_max'])
     kanal1=int(daten['kanal1'])
     servo2_min = float(daten['servo2_min'])
     servo2_max = float(daten['servo2_max'])
     kanal2=int(daten['kanal2'])
     servo_anz=int(daten['servo_anz'])
     v_zeit=float(daten['v_zeit'])

     bewegen(servo1_min,servo1_max,kanal1,servo2_min,servo2_max,kanal2,servo_anz,v_zeit,datei_name)

     s1=servo1_max
     s2=servo2_max
     servo1_max=int(servo1_min)
     servo2_max=int(servo2_min)
     servo1_min=int(s1)
     servo2_min=int(s2)
     
     datei_neu(servo1_min,servo1_max,kanal1,servo2_min,servo2_max,kanal2,servo_anz,v_zeit,datei_name)

     
def datei_neu(servo1_min,servo1_max,kanal1,servo2_min,servo2_max,kanal2,servo_anz,v_zeit,datei_name):
     f=open(datei_name,"w")
     f.write("servo1_min"+"="+str(servo1_min)+"\n")
     f.write("servo1_max"+"="+str(servo1_max)+"\n")
     f.write("servo2_min"+"="+str(servo2_min)+"\n")
     f.write("servo2_max"+"="+str(servo2_max)+"\n")
     f.write("servo_anz"+"="+str(servo_anz)+"\n")
     f.write("v_zeit"+"="+str(v_zeit)+"\n")
     f.write("kanal1"+"="+str(kanal1)+"\n")
     f.write("kanal2"+"="+str(kanal2)+"\n")     
     f.close()

  
def bewegen(servo1_min,servo1_max,kanal1,servo2_min,servo2_max,kanal2,servo_anz,v_zeit,datei_name):

     servo1_step=(servo1_max-servo1_min)/servo_anz 
     servo1_pos=servo1_min
     servo2_step=(servo2_max-servo2_min)/servo_anz
     servo2_pos=servo2_min

     for i in range(int(servo_anz)):
            servo1_pos=int(servo1_pos+servo1_step)
            pwm.set_pwm(kanal1, 0, servo1_pos) 
            time.sleep(float(v_zeit))
            
            servo2_pos=int(servo2_pos+servo2_step)
            pwm.set_pwm(kanal2, 0, servo2_pos)
            time.sleep(float(v_zeit))

     return()


def Grafik():
    rootWindow=Tk()
    rootWindow.wm_geometry("500x300")

    b1=Button(rootWindow,text="tor 1",command=tor1)

    b1.place(x=50, y=50, anchor="s")

    b2=Button(rootWindow,text="tor 2",command=tor2)

    b2.place(x=100, y=50, anchor="s")


def read_data(datei_name):
    result={}
    with open(datei_name) as lines:
        for line in lines:
            name, _, value = line.partition('=')
            result[name.strip()] = value.strip()
    return result
    
    


def main():
     Grafik()
     


def ende():
    sys.exit(0)

if __name__ == '__main__':
     main()
Tor1:

Code: Alles auswählen

servo1_min=450
servo1_max=200
servo2_min=210
servo2_max=405
servo_anz=20
v_zeit=0.06
kanal1=2
kanal2=3
tor2:

Code: Alles auswählen

servo1_min=210
servo1_max=420
servo2_min=425
servo2_max=225
servo_anz=20
v_zeit=0.06
kanal1=0
kanal2=1

Als nächstes möchte ich, das ich die Torflügel unabhängig steuern kann
Wird wieder ne Woche und viele viele Fragen hier brauchen

Viele Grüße und Danke für eure Hilfe
Antworten