Seite 1 von 1

Mit Radiobutton mehrere Checkboxen "aktivieren"

Verfasst: Mittwoch 17. Juni 2020, 08:33
von puckpuck
Hallo zusammen,

mein erster Post, ich hoffe ich mache alles richtig.
Ich habe ein Problem.
Ich möchte bei 3 Radiobuttons nur bei einem bestimmten Radiobutton 5 Checkboxen aktiv haben. Bei Auswahl der anderen Buttons sollen alle Checkboxen "inaktiv" sein.
Leider klappt das nicht so, wie ich mir das vorgestellt habe. Es wird immer nur die letzte Checkbox aktiviert/deaktiviert. Wie greife ich auf alle 5 Checkboxen zu?

mein Code bisher

Code: Alles auswählen

dienstleister = [("Alle", 1), ("DL1", 2), ("DL2", 3)]
dl = IntVar()
dl.set(1)
speditionen = [("Sped1", 1), ("Sped2", 2), ("Sped3", 3), ("Sped4", 4), ("Sped5", 5)]

    def speditionen_einblenden():
        	if (dl.get()== 2):
            		print("Speditionen an")
            		c.config(state="normal")
        	else:
            		print("Speditionen aus")
            		c.config(state="disabled")

    for txt, val in dienstleister:  # Radiobuttons inkl. setzen
        b = Radiobutton(fenster2, text=txt, bg="light green", indicatoron=0, variable=dl, value=val, command = speditionen_einblenden)
        b.place(x=10 + (val-1)*82, y=130, width=80, height=30)

    for txt, val in speditionen:  # Checkbuttons inkl. setzen
        var = IntVar()
        c = Checkbutton(fenster2, text=txt, bg="light blue", variable=var, state = "disabled")
        c.place(x=10 + (val-1)*102, y=180, width=100, height=30)
    
was mache ich falsch?

Mit freundlichen Grüßen

puckpuck

Re: Mit Radiobutton mehrere Checkboxen "aktivieren"

Verfasst: Mittwoch 17. Juni 2020, 09:27
von Sirius3
Eingerückt wird immer mit 4 Leerzeichen pro Ebene, nicht Tabs und Leerzeichen mischen!
Die Variablennamen sind schlecht, einbuchstabige Variablen sind nichtssagend. Alles was eine Funktion braucht, muß sie über ihre Argumente bekommen, bei `speditionen_einblenden` fehlen `d1` und `c`.
`place` sollte man nicht verwenden, sondern grid oder pack. Bei Dir wohl grid.
Warum benutzt Du für value nichtssagende Nummern, statt der (ebenso nichtssagenden) Texte?
Die TkInter-Objekte werden hoffentlich nicht per `from tkinter import *` importiert. Wenn doch, üblicherweise importiert man `import tkinter as tk` und spricht alle Namen über tk.xyz an.
Bei `fenster2` gibt es auch ein `fenster1`? Statt Namen durchzunummerieren, gib ihnen sprechende Namen.

Wenn Du auf alle Checkbuttons zugreifen willst, dann mußt Du sie alle in einer Liste speichern.

Code: Alles auswählen

import tkinter as tk
from functools import partial

DIENSTLEISTER = ["Alle", "DL1", "DL2"]
SPEDITIONEN = ["Sped1", "Sped2", "Sped3", "Sped4", "Sped5"]

def speditionen_einblenden(dienstleister, speditionen):
    state = "normal" if dienstleister.get() == "DL2" else "disabled"
    for spedition in speditionen:
        spedition['state'] = state


def main():
    fenster_auswahl = tk.Tk()
    dienstleister = tk.StringVar()
    speditionen = []
    for column, text in enumerate(SPEDITIONEN):
        c = tk.Checkbutton(fenster_auswahl, text=text, bg="light blue", state="disabled")
        c.grid(row=2, column=column)
        speditionen.append(c)

    for column, text in enumerate(DIENSTLEISTER):
        tk.Radiobutton(fenster_auswahl, text=text, bg="light green",
            indicatoron=0, variable=dienstleister, value=text,
            command=partial(speditionen_einblenden, dienstleister, speditionen)
        ).grid(row=1, column=column)
    fenster_auswahl.mainloop()

if __name__ == '__main__':
    main()

Re: Mit Radiobutton mehrere Checkboxen "aktivieren"

Verfasst: Mittwoch 17. Juni 2020, 09:39
von puckpuck
Sirius3 danke für die schnelle Antwort, ich werde Deinen Code mal bei mir einbauen.

Ich hatte nur den Ausschnitt rausgezogen, der meiner Ansicht nach für die Radiobuttons und Checkboxen notwendig ist.
und beim Einfügen hat das mit dem Einrücken nicht so ganz funktioniert.

import tkinter as tk, mache ich immer und schon oft gelesen :)

fenster2 öffnet sich aus fenster1 heraus, ist im restlichen Code mit drin.

Wie gesagt, ich probiere mal Deine Lösung einzubauen. Danke nochmal.

Gruß

puckpuck