GIPO über einen Button auf dem Display ein und ausschalten Raspberry Pi

Python in C/C++ embedden, C-Module, ctypes, Cython, SWIG, SIP etc sind hier richtig.
Antworten
TMTwo
User
Beiträge: 2
Registriert: Freitag 8. Januar 2021, 17:37

Hallo Zusammen,
ich bin erst neu bei dem Programmieren über python und wollte gerne die Schalter (GPIO) über einen Button auf dem Display ein und wieder ausschalten.
Ich habe es soweit hin bekommen, dass ich über den einen Button einschalte und über den anderen ausschalte.
Wollte es dann mit einer if / else Funktion machen komme aber da mit den Abfragen nicht weiter.
Vielleicht kann mir da jemand helfen, oder es gibt dazu einen Beitrag.

Beste Grüße TMTwo
--------------------------------------------------------------
from tkinter import *

import RPi.GPIO as GPIO
import time
from time import sleep
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
GPIO.setup(14, GPIO.OUT)

root = Tk() # Fenster erstellen
root.wm_title("Raspberry Pi GUI") # Fenster Titel
root.config(background = "#FFFFFF") # Hintergrundfarbe des Fensters

# Hier kommen die Elemente hin
leftFrame = Frame(root, width=200, height = 400)
leftFrame.grid(row=0, column=0, padx=10, pady=3)

leftLabel1 = Label(leftFrame, text="Platzhalter Text")
leftLabel1.grid(row=0, column=0, padx=10, pady=3)
leftLabel2 = Label(leftFrame, text="Dies ist ein Text\nmit mehreren Zeilen.")
leftLabel2.grid(row=1, column=0, padx=10, pady=3)

imageEx = PhotoImage(file = '200x200')
Label(leftFrame, image=imageEx).grid(row=2, column=0, padx=10, pady=3)


rightFrame = Frame(root, width=400, height = 400)
rightFrame.grid(row=0, column=1, padx=10, pady=3)

E1 = Entry(rightFrame, width=50)
E1.grid(row=0, column=0, padx=10, pady=3)

def an():
GPIO.output(14,0)
def aus():
GPIO.output(14,1)

buttonFrame = Frame(rightFrame)
buttonFrame.grid(row=1, column=0, padx=10, pady=3)

B1 = Button(buttonFrame, text="Button 1", bg="#FF0000", width=15, command=an)
B1.grid(row=0, column=0, padx=10, pady=3)

B2 = Button(buttonFrame, text="Button 2", bg="#FFFF00", width=15, command=aus)
B2.grid(row=0, column=1, padx=10, pady=3)

root.mainloop()
Sirius3
User
Beiträge: 17703
Registriert: Sonntag 21. Oktober 2012, 17:20

Benutze keine *-Importe, da das die Herkunft der verwendeten Namen verschleiert und zu Kollisionen führen kann.
`as` bei Import ist dazu da, etwas umzubenennen, GPIO wird aber gar nicht umbenannt.
time und sleep werden importiert aber nicht benutzt. sleep kann man bei GUI-Programmen eh nicht verwenden.
Warnungen sind dazu da, dass man sie behebt, nicht dass man sie ignoriert. Dazu muß GPIO.cleanup aber verlässlich aufgerufen werden.
Aller Code gehört in Funktionen.
Für Pins definiert man am besten Konstanten.
Variablennamen werden komplett klein geschrieben.

Code: Alles auswählen

import tkinter as tk
from RPi import GPIO

LED_PIN = 14

def an():
    GPIO.output(14,0)

def aus():
    GPIO.output(14,1)

def main():
    try:
        GPIO.setmode(GPIO.BCM)
        GPIO.setup(LED_PIN, GPIO.OUT)

        root = tk.Tk() # Fenster erstellen
        root.wm_title("Raspberry Pi GUI") # Fenster Titel
        root.config(background = "#FFFFFF") # Hintergrundfarbe des Fensters
     
        # Hier kommen die Elemente hin
        left_frame = Frame(root, width=200, height = 400)
        left_frame.grid(row=0, column=0, padx=10, pady=3)
     
        left_label1 = Label(leftFrame, text="Platzhalter Text")
        left_label1.grid(row=0, column=0, padx=10, pady=3)
        left_label2 = Label(leftFrame, text="Dies ist ein Text\nmit mehreren Zeilen.")
        left_label2.grid(row=1, column=0, padx=10, pady=3)
     
        image = PhotoImage(file='200x200')
        Label(left_frame, image=image).grid(row=2, column=0, padx=10, pady=3)
     
     
        right_frame = Frame(root, width=400, height = 400)
        right_frame.grid(row=0, column=1, padx=10, pady=3)
        entry = Entry(right_frame, width=50)
        entry.grid(row=0, column=0, padx=10, pady=3)
     
        button_frame = Frame(right_frame)
        button_frame.grid(row=1, column=0, padx=10, pady=3)
        button = Button(button_frame, text="Button 1", bg="#FF0000", width=15, command=an)
        button.grid(row=0, column=0, padx=10, pady=3)
        button = Button(buttonFrame, text="Button 2", bg="#FFFF00", width=15, command=aus)
        button.grid(row=0, column=1, padx=10, pady=3) 
        root.mainloop()
    finally:
        GPIO.cleanup()

if __name__ == '__main__':
    main()
Wenn Du einen An/Aus-Button haben willst, mußt Du Dir den Zustand des Buttons merken, dazu brauchst Du Klassendefinitionen, weil alle Information sonst nach dem Ende der Funktion verlorengeht. Klassendefinitionen brauchst Du bei einigermaßen komplexen GUI-Programmen eh.
TMTwo
User
Beiträge: 2
Registriert: Freitag 8. Januar 2021, 17:37

Vielen Dank für die schnelle Antwort.
Ich werde mich damit gleich mal auseinandersetzen.
Da das mein erstes Projekt ist und ich auch schon sehr lange nicht mehr programmiert habe muss ich erst wieder lernen damit zum zu gehen.

Beste Grüße TMTwo
Antworten