Mehrere Button in einem Frame verwenden.

Fragen zu Tkinter.
Antworten
Heli_Wien
User
Beiträge: 6
Registriert: Samstag 28. November 2020, 19:36

Hallo liebes Forum,

ich bin ein Quereinsteiger und möchte über den Rasperry Pi
einige Steuerungen um setzten.

Ich habe begonnen über die GUI tkinter einfache Programme zu gestalten.
Hier beginnt schon mein Problem das es anscheinend nicht möglich ist
mehrere Button in einen Frame zu verwenden.

Beispiel: Eine Led mit einen Schalter ein- bzw. zweiten Schalter aus zuschalten!
Ich komme hier einfach nicht weiter. Ich hänge das Script mal an, vielleicht kann
mir irgendwer qweiter helfen.

Herzlichen Dank.

Code: Alles auswählen

import tkinter as tk
import time
import RPi.GPIO as GPIO

#Pin Nummer wie auf dem Raspberry Board verwenden
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
GPIO.setup(4,GPIO.IN)
GPIO.setup(17,GPIO.OUT)


class View(tk.Tk):
    def __init__(self):
        tk.Tk.__init__(self)
        # Fenster
        self.title("LED - Blinken")
        self.geometry('500x400+1000+50')
        # Button
        self.my_butt_1 = tk.Button(self, width=10, fg="green")
        self.my_butt_1["text"] = "Start"
        self.my_butt_1["command"] = self.schalteEin
        self.my_butt_1.place(x=70,y=35)
        #
        self.my_butt_2 = tk.Button(self, width=10, fg="green")
        self.my_butt_2["text"] = "Pause"
        self.my_butt_2["command"] = self.schalteAus
        self.my_butt_2.place(x=70,y=70)
        #
        self.quit = tk.Button(self, width=10, fg="red")
        self.quit["text"] = "Ende"
        self.quit["command"]=self.destroy
        self.quit.place(x=70,y=105)

    def schalteEin(self):
        GPIO.output(17, GPIO.HIGH)
                
    def schalteAus(self):
 
view = View()
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

Ein schönes Beispiel, warum das mit den Abkürzungen keine gute Idee ist. Was man mit Deinem Allerwertesten alles Schalten kann, will ich gar nicht wissen.
as bei import ist zum Umbenennen da, GPIO wird aber gar nicht umbenannt.
time wird importiert aber nicht benutzt.
place sollte man nicht verwenden, weil es auf anderen Systemen zu unbenutzbaren Oberflächen führen kann. pack ist hier völlig ausreichend.
Bei schalteAus fehlt etwas, das kommt gar nicht am Compiler vorbei.
Der Aufruf von view.mainloop() fehlt auch.
Benutzeravatar
__blackjack__
User
Beiträge: 13111
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Wie sieht denn das anatomisch aus wenn man zwei Allerwerteste hat? 🤣

Warum sind da Kommentare ohne Text? Und warum werden direkt nach dem erstellen von Widgets einzelne Optionen gesetzt die man auch direkt beim erstellen schon hätte setzen können?

Wenn man `place()` nicht verwendet gibt es auch keinen Grund die Grösse des Fensters anzugeben. Die Position sollte man sowieso nicht angeben. Das ist nur ein Hinweis an die Fensterverwaltung, und die Fensterverwaltung hat einen besseren Überblick wo gerade Platz ist als der Programmierer der ja gar nicht weiss wie die aktuelle Situation aussieht wenn das Programm gestartet wird.

Auf Modulebene sollte nur Code stehen der Konstanten, Funktionen, und Klassen definiert. Das Hauptprogramm steht üblicherweise in einer Funktion die `main()` heisst.

Warnungen unterdrückt man nicht, sondern man beseitigt die Ursache. Man muss nur sicherstellen, dass die `GPIO.cleanup()`-Funktion aufgerufen wird wenn das Programm endet.

Namen werden in Python klein_mit_unterstrichen geschrieben. Ausnahmen sind Konstanten (KOMPLETT_GROSS) und Klassen (MixedCase).
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Heli_Wien
User
Beiträge: 6
Registriert: Samstag 28. November 2020, 19:36

Zuerst mal Danke für die schnellen Antworten und die zum Teil auch zum Schmunzeln sind.
Ich bin ja wie gesagt kein Programmierer und fange damit erst an.
Allerdings weis ich jetzt noch immer nicht warum der zweite Button nicht funktioniert.
Was fehlt bei schalteAus? Vielleicht kann mir jemand ja auch mein Script dementsprechend anpassen. Wäre auf jeden Fall sehr dankbar dafür.
Kommentare die nicht wirklich helfen sollte man am besten unterlassen.
Lg. aus Wien, wo es zur Zeit leider auch nicht zum besten bestellt ist.
Benutzeravatar
__blackjack__
User
Beiträge: 13111
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Heli_Wien: Was macht denn die `schalteAus()`-Methode? Also ich meine nicht was sie machen soll, sondern was sie im gezeigten Quelltext tatsächlich macht (oder machen würde wenn das kein Syntaxfehler wäre)?

Was genau meinst Du mit der zweite Button funktioniert nicht? Was passiert und was hättest Du stattdessen erwartet, und warum?
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Heli_Wien
User
Beiträge: 6
Registriert: Samstag 28. November 2020, 19:36

@blackjack: schaltAus soll die Led wieder ausschalten: GPIO.output(17, GPIO.LOW):

Ich habe aber den Fehler aber gefunden > Unter einer def muss eine Action sein sonst funktioniert es nicht!

Anbei das neue Script > Es funktioniert.
Aber vielleicht machst du dir die Mühe es so zu gestalten wie es korrekt sein soll.
Herzlichen Dank im vorraus. :wink:

import tkinter as tk
import RPi.GPIO as GPIO

#Pin Nummer wie auf dem Raspberry Board verwenden
GPIO.setmode(GPIO.BCM)
GPIO.setup(4,GPIO.IN)
GPIO.setup(17,GPIO.OUT)


class View(tk.Tk):
def __init__(self):
tk.Tk.__init__(self)
# Fenster
self.title("LED - Blinken")
self.geometry('500x400+1000+50')
# Ein
self.button_ein = tk.Button(self, width=10, fg="green")
self.button_ein["text"] = "LED-Ein"
self.button_ein["command"] = self.schalte_ein
self.button_ein.place(x=70,y=35)
# Aus
self.button_aus = tk.Button(self, width=10, fg="green")
self.button_aus["text"] = "LED-Aus"
self.button_aus["command"] = self.schalte_aus
self.button_aus.place(x=70,y=70)
# Beenden
self.quit = tk.Button(self, width=10, fg="red")
self.quit["text"] = "Ende"
self.quit["command"]=self.beenden
self.quit.place(x=70,y=105)

def schalte_ein(self):
GPIO.output(17, GPIO.HIGH)

def schalte_aus(self):
GPIO.output(17, GPIO.LOW)

def beenden(self):
GPIO.cleanup()
self.destroy()

view = View()
view.mainloop()
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

Du hast ja fast alle Anmerkungen umgesetzt. Es fehlt noch ein guter Name für die 17, eine main- Funktion und pack:

Code: Alles auswählen

import tkinter as tk
from RPi import GPIO

LED_STATUS = 17
PIN_WAS_AUCH_IMMER = 4

class View(tk.Tk):
    def __init__(self):
        tk.Tk.__init__(self)
        # Fenster
        self.title("LED - Blinken")
        tk.Button(self, width=10, fg="green", text="LED-Ein", command=self.schalte_ein).pack()
        tk.Button(self, width=10, fg="green", text="LED-Aus",command=self.schalte_aus).pack()
        tk.Button(self, width=10, fg="red", text="Ende", command=self.destroy).pack()

    def schalte_ein(self):
        GPIO.output(LED_STATUS, GPIO.HIGH)
                
    def schalte_aus(self):
        GPIO.output(LED_STATUS, GPIO.LOW)
        
def main():
    try:
        GPIO.setmode(GPIO.BCM)
        GPIO.setup(PIN_WAS_AUCH_IMMER, GPIO.IN)
        GPIO.setup(LED_STATUS, GPIO.OUT)
        view = View()
        view.mainloop()
    finally:
        GPIO.cleanup()

if __name__ == "__main__":
    main()[/quote]
Heli_Wien
User
Beiträge: 6
Registriert: Samstag 28. November 2020, 19:36

@Sirius2:
Herzlichen Dank, ich werde das mal probieren. Wenn ich den Aufbau aber richtig verstehe
wird beim starten zuerst die def main Ausgeführt und bleibt dann in der Schleife class View.
Danke und einen schönen Sonntag. :D
Heli_Wien
User
Beiträge: 6
Registriert: Samstag 28. November 2020, 19:36

@Sirius3:
Ich habe das Script getestet und es gibt einen Fehler bei "main()[/quote]"
T
raceback (most recent call last):
File "/media/pi/E2CF-FB4A/Python/tkinter_led_schalten_neu.py", line 33
main()[/quote]
^
SyntaxError: invalid syntax
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

Das [/quote] ein Rest aus dem Forumstext, den ich vergessen hatte zu löschen.
Heli_Wien
User
Beiträge: 6
Registriert: Samstag 28. November 2020, 19:36

Habe ich geändert.
Herzlichen Dank an euch beide.

Bleibt Gesund.....
Antworten