Radiobuttons Zustände abfragen

Fragen zu Tkinter.
Antworten
moogipy
User
Beiträge: 8
Registriert: Freitag 8. Januar 2021, 15:19

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)
Sirius3
User
Beiträge: 18274
Registriert: Sonntag 21. Oktober 2012, 17:20

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.
moogipy
User
Beiträge: 8
Registriert: Freitag 8. Januar 2021, 15:19

Danke für die schnelle Antwort. Wie wird die Variable var ausgegeben? Muss ich jedem Button eine eigene Zuordnen (also var1, var2,...)? Leider finde ich scheinbar nicht den entscheidenden Befehl um var zu verwenden.
Sirius3
User
Beiträge: 18274
Registriert: Sonntag 21. Oktober 2012, 17:20

Du verwendest in Deinem Code doch schon `var`. Da der unvollständig ist, kann ich natürlich nicht sagen, ob das so korrekt ist, dazu müßtest Du schon den gesamten Code hier posten.
moogipy
User
Beiträge: 8
Registriert: Freitag 8. Januar 2021, 15:19

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()
Sirius3
User
Beiträge: 18274
Registriert: Sonntag 21. Oktober 2012, 17:20

*-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?

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()
moogipy
User
Beiträge: 8
Registriert: Freitag 8. Januar 2021, 15:19

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.
Sirius3
User
Beiträge: 18274
Registriert: Sonntag 21. Oktober 2012, 17:20

Was meinst Du mit "ruft keine GUI auf"?
Statt etwas Abzutippen kann man auch Daten vom Raspberry kopieren.
moogipy
User
Beiträge: 8
Registriert: Freitag 8. Januar 2021, 15:19

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.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das ist aus deinem Code. Nur kopiert. Das war also auch schon vorher Unfug. Das musst du schon reparieren.
moogipy
User
Beiträge: 8
Registriert: Freitag 8. Januar 2021, 15:19

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.
Benutzeravatar
__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
Antworten