Tkinter setzen einer Variable und mit dieser weiter arbeiten.

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
Antworten
nico.engel
User
Beiträge: 11
Registriert: Samstag 24. Februar 2018, 18:11

Hallo zusammen,

ich bin gerade dabei ein kleines Programm zu schreiben um einen Schiebetisch an acht verschiedene Positionen zu fahren. Dazu habe ich einen Raspberry, Touchdisplay und dem SilentStepStick Schrittmotortreiber.

Über Tkinter habe ich kleine Oberfläche erstellt, mit der über acht Buttons die verschiedenen Positionen angefahren werden sollen. Soweit so gut :lol:
Die Berechnung und Ausgabe der Werte zur Kontrolle klappt soweit, aber das geht doch auch sicher schlanker. Ich möchte die Berechnung, die ja immer gleich ist nicht jedes mal neu aufrufen.
Die Ansteuerung des SilentStepSticks über die GPIOs wird dann später implementiert.

Eigentlich möchte über die Buttons 1-8 die Variable Ziel auf das jeweilige Gleis setzen und anschließend den Fahrweg berechnen und an den Schrittmotortreiber übergeben. Dazu müsste die Berechnung doch "ausgelagert werden", aber ich stehe auf dem Schlauch wie ich das hinbekomme :K

Bild

Code: Alles auswählen

from tkinter import*
from gleise import*

UMKEHR = -100                #Umkehrspiel im Getriebe
ISTPOSITION = 0              #Setze ISTPOSITION auf null nach Referenzfahrt

def ziel_g1():
    global ZIEL
    global ISTPOSITION
    ZIEL = Gleis1
    FAHRWEG = ZIEL - ISTPOSITION
    if FAHRWEG>0:
        FAHRWEG = FAHRWEG
        ISTPOSITION = ZIEL
        print("CW", FAHRWEG, "neue Position = ", ISTPOSITION)
    elif FAHRWEG<0:
        FAHRWEG = FAHRWEG + UMKEHR
        ISTPOSITION = ZIEL
        print("CCW", FAHRWEG, "neue Postiion = ", ISTPOSITION)
    elif FAHRWEG==0:
        FAHRWEG = 0
        print("BIN AUF POSITION")

def ziel_g2():
    global ZIEL
    global ISTPOSITION
    ZIEL = Gleis2
    FAHRWEG = ZIEL - ISTPOSITION
    if FAHRWEG>0:
        FAHRWEG = FAHRWEG
        ISTPOSITION = ZIEL
        print("CW", FAHRWEG, "neue Position = ", ISTPOSITION)
    elif FAHRWEG<0:
        FAHRWEG = FAHRWEG + UMKEHR
        ISTPOSITION = ZIEL
        print("CCW", FAHRWEG, "neue Postiion = ", ISTPOSITION)
    elif FAHRWEG==0:
        FAHRWEG = 0
        print("BIN AUF POSITION")

def ziel_g3():
    ZIEL = Gleis3
def ziel_g4():
    ZIEL = Gleis4
def ziel_g5():
    ZIEL = Gleis5
def ziel_g6():
    ZIEL = Gleis6
def ziel_g7():
    ZIEL = Gleis7
def ziel_g8():
    ZIEL = Gleis8

#Fenster, Buttons und Label deklarieren
GUI = Tk()
GUI.title("Schiebebahn")
GUI.geometry("320x240")
#GUI.overrideredirect(True)
#GUI.geometry("{0}x{1}+0+0".format(GUI.winfo_screenwidth(), GUI.winfo_screenheight()))
label = Label(GUI, text="(c) by Nico Engel V1.0")
EXIT = Button(GUI, text ="EXIT", command=GUI.quit)
G1 = Button(GUI, text="Gleis 1", command=ziel_g1)
G2 = Button(GUI, text="Gleis 2", command=ziel_g2)
G3 = Button(GUI, text="Gleis 3", command=ziel_g3)
G4 = Button(GUI, text="Gleis 4", command=ziel_g4)
G5 = Button(GUI, text="Gleis 5", command=ziel_g5)
G6 = Button(GUI, text="Gleis 6", command=ziel_g6)
G7 = Button(GUI, text="Gleis 7", command=ziel_g7)
G8 = Button(GUI, text="Gleis 8", command=ziel_g8)

#Butons und Label platzieren
label.pack()
label.place(x=30, y=210)
EXIT.pack()
EXIT.place(height=20, width=40, x=250, y=210)
G1.pack()
G1.place(height=40, width=110, x=30, y=20)
G2.pack()
G2.place(height=40, width=110, x=180, y=20)
G3.pack()
G3.place(height=40, width=110, x=30, y=70)
G4.pack()
G4.place(height=40, width=110, x=180, y=70)
G5.pack()
G5.place(height=40, width=110, x=30, y=120)
G6.pack()
G6.place(height=40, width=110, x=180, y=120)
G7.pack()
G7.place(height=40, width=110, x=30, y=170)
G8.pack()
G8.place(height=40, width=110, x=180, y=170)

GUI.mainloop()

Code: Alles auswählen

#Hier werden die Positionen der einzelnen Gleise angepasst.
#1000 STEPS entsprechen 1mm
Gleis1 = 1000                   #Position Gleis 1 in STEPS
Gleis2 = 2000                   #Position Gleis 2 in STEPS
Gleis3 = 3000                   #Position Gleis 3 in STEPS
Gleis4 = 4000                   #Position Gleis 4 in STEPS
Gleis5 = 5000                   #Position Gleis 5 in STEPS
Gleis6 = 6000                   #Position Gleis 6 in STEPS
Gleis7 = 7000                   #Position Gleis 7 in STEPS
Gleis8 = 8000                   #Position Gleis 8 in STEPS
Benutzeravatar
noisefloor
User
Beiträge: 3843
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

du übergibst das Gleis einfach als Argument an die Funktion anstatt es fest pro Funktion zu hinterlegen. Dann kannst du das mit einer Funktion abbilden.

Wenn man `global` benutzt kann man zu 99% sicher sein, dass man was falsch gemacht hat beim Programmieren weil man `global` normalerweise nicht braucht. Hier auch nicht. Du könntest alles in eine Klasse packen und ISTPOSITION zu einem Attribut der Klasse machen.
In GROSSSCHREIBUNG schreibt man per Konvention nur Konstanten, Variablen werden klein geschrieben.
*-Importe sollte man nicht nutzen, weil man dann nicht weiß, was man sich in den globalen Namensraum holt. Im Falle von Tkinter sind das ca. 140 Namen - das kann zu Fehler im Programm führen, die schwer zu finden sind.

Gruß, noisefloor
nico.engel
User
Beiträge: 11
Registriert: Samstag 24. Februar 2018, 18:11

So habe ich es nun auch gelöst, war wohl schon zu spät :) Danke für den Tip mit der Konvention, so tief bin ich in der Programmierung nicht drin, bin da eher der Hardwaremensch.

Aber nur mit "global" funktioniert mein Code bisher :oops:

Code: Alles auswählen

def berechne_fahrweg():
    global istposition
    global ziel
    global fahrweg
    set_enable_on()
    fahrweg = ziel - istposition
    if fahrweg == 0:
        fahrweg = 0
    elif fahrweg >= 0:
        set_cw()
        istposition = ziel
        while (fahrweg >= 1):
            set_stepper_on()
            fahrweg = fahrweg -1
    elif fahrweg < 0:
        set_ccw()
        istposition = ziel
        while (fahrweg < 0):
            set_stepper_on()
            fahrweg = fahrweg + 1
    set_enable_off()

def ziel_g1():
    global ziel
    ziel = gleis1
    berechne_fahrweg()
def ziel_g2():
    global ziel
    ziel = gleis2
    berechne_fahrweg()
Benutzeravatar
noisefloor
User
Beiträge: 3843
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

das `global ziel` ist doch einfach zu eliminieren:

Code: Alles auswählen

def berechne_fahrweg(ziel):
    ....
    fahrweg = ziel - istposition
    ....

def ziel_g1():
    ziel = gleis1
    berechne_fahrweg(ziel)
Da `ziel_g1()`, `ziel_g2()`, ... aber auch komplett redundanten Code enthalten, kannst du das wohl noch weiter vereinfachen...
Die anderen beiden `global` kannst du auch eliminieren, Wie gesagt, pack' die GUI in eine Klasse (wie z.B. hier gezeigt), mache `istposition` und `fahrweg` zu Attributen der Klasse, dann hast du's.

Gruß, noisefloor
Antworten