Hallo zusammen.
Ich versuche einen Ausgang mithilfe von 3 Radiobuttons zu schalten. Ich möchte, dass wenn Radiobutton1 geschaltet ist und Radiobutton2 geschaltet wird Radiobutton1 zurückgesetzt wird und andersrum. Auf der GUI passiert das ja auch. Aber im Programm leider nicht.
Programmausschnitt:
mittel_status = 1
kurz_status = 1
def mittel():
global mittel_status
if mittel_status == 1:
mittel_status = 2
if kurz_status == 2:
mittel_status = 1
def kurz():
global kurz_status
if kurz_status == 1:
kurz_status = 2
if mittel_status == 2:
kurzl_status = 1
R1 = Radiobutton(buttonFrame, txt="60min", bg="#FFFF00", width=5, command=mittel, variable=var, value=1, indicatron=0)
R2 = Radiobutton(buttonFrame, txt="30min", bg="#FFFF00", width=5, command=kurzl, variable=var, value=2, indicatron=0)
Radiobuttons Zustände abfragen
Vergiss gleich wieder, dass es sowas wie global gibt. Für einigermaßen Komplexe GUI-Programme brauchst Du Klassendefinitionen, um Dir Zustand merken zu können.
Hier ist es aber viel einfacher, da Du die Variable var hast, die die von Dir gewünschte Information enthält. mittel_status und kurz_status sind also unnötig.
Hier ist es aber viel einfacher, da Du die Variable var hast, die die von Dir gewünschte Information enthält. mittel_status und kurz_status sind also unnötig.
Prinzipiell soll hier später eine Pumpe den Druck in einer Zelle erreichen, diesen dann kurz oder mittellange halten und dann in eine andere Kammer wechseln.
Den Drucksensor kann ich in einem anderen Programm auslesen und auch das Schalten von Ausgängen mit dem Druckwert funktioniert. Da meine Programmierkenntnisse allerdings noch begrenzt sind, wollte ich zuerst mal ohne Abhängigkeit vom Druckwert mit der GUI die Ausgänge schalten. Jetzt scheitere ich allerdings schon daran die Zustände der Buttons abzufragen. Das hier war mein bisheriges Programm. Hab natürlich schon einiges nach deinem Tipp versucht, weiß allerdings nicht wie ich var einbinde, sodass der Ausgang abhängig davon ist.
from tkinter import *
from MCP3008 import MCP3008
import time
import os
import spidev
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BM)
root = Tk()
root.wm_title("Raspberry Pi GUI")
root.config(backround = "#FFFFFF")
var = IntVar()
Settings = {
"PUMPE": 17,
}
rightFrame = Frame(root, width = 400, heigt = 400)
right.Frame.grid(row=0, column=0, padx=10, pady=3)
E1 = Entry(rightFrame, widht=50)
E1.grid(row=0, column=10, adx=10, pady=30
pumpen_status = 0
def start():
global pumpen_status
if pumpen_status == 1= and kurz_status == 1
GPIO.setup(SETTINGS["PUMPE"], GPIO.OUT, initial=GPIO.HIGH)
pumpen_status = 2
else:
pumpen_status = 1
def mittel():
global mittel_status
if mittel_status == 1:
mittel_status = 2
if kurz_status == 2:
mittel_status = 1
def kurz():
global kurz_status
if kurz_status == 1:
kurz_status = 2
if mittel_status == 2:
kurz_status = 1
B1 = Checkbutton(buttonFrame, text="Start", bg="#FFFF00", width= 20, command = start, indicatoron = 0)
R1 = Radiobutton(buttonFrame, txt="60min", bg="#FFFF00", width=5, command=mittel, variable=var, value=1, indicatoron=0)
R2 = Radiobutton(buttonFrame, txt="30min", bg="#FFFF00", width=5, command=kurzl, variable=var, value=2, indicatoron=0)
root.mainloop()
Den Drucksensor kann ich in einem anderen Programm auslesen und auch das Schalten von Ausgängen mit dem Druckwert funktioniert. Da meine Programmierkenntnisse allerdings noch begrenzt sind, wollte ich zuerst mal ohne Abhängigkeit vom Druckwert mit der GUI die Ausgänge schalten. Jetzt scheitere ich allerdings schon daran die Zustände der Buttons abzufragen. Das hier war mein bisheriges Programm. Hab natürlich schon einiges nach deinem Tipp versucht, weiß allerdings nicht wie ich var einbinde, sodass der Ausgang abhängig davon ist.
from tkinter import *
from MCP3008 import MCP3008
import time
import os
import spidev
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BM)
root = Tk()
root.wm_title("Raspberry Pi GUI")
root.config(backround = "#FFFFFF")
var = IntVar()
Settings = {
"PUMPE": 17,
}
rightFrame = Frame(root, width = 400, heigt = 400)
right.Frame.grid(row=0, column=0, padx=10, pady=3)
E1 = Entry(rightFrame, widht=50)
E1.grid(row=0, column=10, adx=10, pady=30
pumpen_status = 0
def start():
global pumpen_status
if pumpen_status == 1= and kurz_status == 1
GPIO.setup(SETTINGS["PUMPE"], GPIO.OUT, initial=GPIO.HIGH)
pumpen_status = 2
else:
pumpen_status = 1
def mittel():
global mittel_status
if mittel_status == 1:
mittel_status = 2
if kurz_status == 2:
mittel_status = 1
def kurz():
global kurz_status
if kurz_status == 1:
kurz_status = 2
if mittel_status == 2:
kurz_status = 1
B1 = Checkbutton(buttonFrame, text="Start", bg="#FFFF00", width= 20, command = start, indicatoron = 0)
R1 = Radiobutton(buttonFrame, txt="60min", bg="#FFFF00", width=5, command=mittel, variable=var, value=1, indicatoron=0)
R2 = Radiobutton(buttonFrame, txt="30min", bg="#FFFF00", width=5, command=kurzl, variable=var, value=2, indicatoron=0)
root.mainloop()
*-Importe sollte man nicht verwenden, damit holt man sich unkontrolliert Namen in den eigenen Namensraum, was Konflikte und Unübersichtlichkeit bedeutet.
MCP3008, time, os und spidev werden importiert aber nicht benutzt.
Das `as` ist zum Umbenennen da, GPIO wird aber gar nicht umbenannt, das zeigt, dass unreflektiertes Kopieren aus unzuverlässigen Quellen keine gute Idee ist.
Alles auf oberster Ebene sollte in Funktionen stehen, und `global` darf man nicht verwenden.
Variablennamen schreibt man grundsätzlich klein, und zwar aussagekräftig, also nicht nur ein Buchstabe und Nummern sind selten aussagekräftig.
`Settings` ist falsch geschrieben, das kann also nicht der Code sein, den Du ausgeführt hast.
In `start` ist dann auch noch ein Syntaxfehler. Beim Programmieren kommt es auf Sorgfältigkeit an, ein Computer verzeiht keinen Fehler.
Bei `right.Frame` ist noch ein Fehler. Und bei E1.grid fehlt eine Klammer.
`buttonFrame` existiert nicht. Die Buttons werden gar nicht angezeigt. Und ein Attribut txt gibt es nicht.
Warum benutzt Du einen CheckButton für Start?
MCP3008, time, os und spidev werden importiert aber nicht benutzt.
Das `as` ist zum Umbenennen da, GPIO wird aber gar nicht umbenannt, das zeigt, dass unreflektiertes Kopieren aus unzuverlässigen Quellen keine gute Idee ist.
Alles auf oberster Ebene sollte in Funktionen stehen, und `global` darf man nicht verwenden.
Variablennamen schreibt man grundsätzlich klein, und zwar aussagekräftig, also nicht nur ein Buchstabe und Nummern sind selten aussagekräftig.
`Settings` ist falsch geschrieben, das kann also nicht der Code sein, den Du ausgeführt hast.
In `start` ist dann auch noch ein Syntaxfehler. Beim Programmieren kommt es auf Sorgfältigkeit an, ein Computer verzeiht keinen Fehler.
Bei `right.Frame` ist noch ein Fehler. Und bei E1.grid fehlt eine Klammer.
`buttonFrame` existiert nicht. Die Buttons werden gar nicht angezeigt. Und ein Attribut txt gibt es nicht.
Warum benutzt Du einen CheckButton für Start?
Code: Alles auswählen
import tkinter as tk
from RPi import GPIO
from functools import partial
SETTINGS = {
"PUMPE": 17,
}
def start(var):
if var.get() == 1:
print('mittel')
else:
print('kurz')
def main():
GPIO.setmode(GPIO.BM)
GPIO.setup(SETTINGS["PUMPE"], GPIO.OUT, initial=GPIO.HIGH)
root = tk.Tk()
var = tk.IntVar(root, 2)
tk.Button(root, text="Start", bg="#FFFF00", width=20, command=partial(start, var), indicatoron=0).pack()
tk.Radiobutton(root, text="60min", bg="#FFFF00", width=5, variable=var, value=1, indicatoron=0).pack()
tk.Radiobutton(root, text="30min", bg="#FFFF00", width=5, variable=var, value=2, indicatoron=0).pack()
root.mainloop()
if __name__ == '__main__':
main()
Danke nochmal für die ausführliche und schnelle Antwort.
Ich programmiere auf einem Raspberry Pi und habe deswegen den Code abgeschrieben. Ich versuche künftig genauer auf die Richtigkeit zu achten.
Den Checkbutton habe ich genutzt, da dieser wie ein Hauptschalter wirken soll.
Generell möchte ich noch mehr Optionen in Form von Radiobuttons einbauen.
Dein Programm ist sehr interessant und ich werde es genauer unter die Lupe nehmen. Allerdings ruft es bei mir keine GUI auf.
Ich programmiere auf einem Raspberry Pi und habe deswegen den Code abgeschrieben. Ich versuche künftig genauer auf die Richtigkeit zu achten.
Den Checkbutton habe ich genutzt, da dieser wie ein Hauptschalter wirken soll.
Generell möchte ich noch mehr Optionen in Form von Radiobuttons einbauen.
Dein Programm ist sehr interessant und ich werde es genauer unter die Lupe nehmen. Allerdings ruft es bei mir keine GUI auf.
Soll heißen, dass sich keine Benutzeroberfläche mit den Buttons öffnet, wie das bei meinem Programm der Fall war.
Jetzt bin ich mit dem RPi über W-Lan auf die Seite gegangen um dein Code zu kopieren. Dann kommt als letzte Fehlermeldung _tkinter.TclError: unknown option "-indicatoron".
Leider ist der RPi im W-Lan so langsam, dass ich mich nicht einloggen kann um die Fehlermeldung zu kopieren.
Jetzt bin ich mit dem RPi über W-Lan auf die Seite gegangen um dein Code zu kopieren. Dann kommt als letzte Fehlermeldung _tkinter.TclError: unknown option "-indicatoron".
Leider ist der RPi im W-Lan so langsam, dass ich mich nicht einloggen kann um die Fehlermeldung zu kopieren.
Warum war das vorher Unfug, wenn eine Benutzeroberfläche ohne Fehler erschienen ist und ich nur die Tasten nicht den Aktionen zuordnen konnte. Wenn ich das richtig lese kennt er plötzlich die Option indicatoron nicht mehr. Diese sagt ja aber nur aus, dass der gesamte Schriftzug der Button ist und da kein Kreis daneben ist in dem man ein Haken setzten kann.
- __blackjack__
- User
- Beiträge: 14054
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
@moogipy: Du musst da halt `Button` wieder zu `Checkbutton` zurück ändern, denn ein `Button` kennt diese Option nicht. Dem `Checkbutton` fehlt dann auch noch beispielsweise ein `tk.BooleanVar` um den aktuellen Zustand abfragen zu können.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari