Abfrage Checkbutton

Fragen zu Tkinter.
Antworten
polyworks
User
Beiträge: 14
Registriert: Montag 7. April 2014, 08:24

Hallo leute!

ich habe mir ein Fenster mit einem Menü erstellt, worunter ich "Einstellung" klicken kann und sich darauf durch die Funktion "einstellung"ein Fenster als Toplevel von dem parent öffnet.
Hier habe ich ein Eingabe-Feld, mit welchem ich in einer anderen Funktion namens "widget_verschieben" abfragen möchte, ob die Variable der Checkbox True ist und dann einen Text ausgeben. Das ganze sieht wie folgt aus:

Code: Alles auswählen

    def einstellung(self):
        einstellungWin = self.einstellungWin= tk.Toplevel(self)
        einstellungWin.title("Einstellungen")
        einstellungWin.geometry("600x400")
        self.eingabe=tk.Entry(einstellungWin)
        self.eingabe.place( x=0, y=40)
        var1=BooleanVar(einstellungWin)
     
        cb=tk.Checkbutton(einstellungWin, text="Verschieben", variable=var1).pack(side="bottom")
        tk.Button(einstellungWin,text="Ist Checkbutton geklickt?", command=self.widget_verschieben).pack(side="right")
        sendebutton =tk.Button(einstellungWin,text="Senden", command= self.einstellung_sendtext, font=("Arial", 10)).place()
        
      
    def einstellung_sendtext(self):
        self.eingabe1 = self.eingabe.get() #<-- Hier bekomm ich ohne Weiteres die Eingabe über get()
        self.text.insert("end", self.eingabe1+"\n")
        
    def widget_verschieben(self):
            val = var1.get()                      #<-- Hier ist mein Problem
            if val:
                print("Checkbutton ist geklickt!")
            else:
                print ("Checkbutton ist nicht geklickt...")
Mein Problem ist die Variable aus der Funktion "einstellung" zu erhalten. Habe auch schon mit return herumprobiert, aber komme einfach nicht ran. Mit self.eingabe.get() funktioniert es aber. Kann mir das bitte jemand erklären? Wäre sehr dankbar :)
Der Hintergrund von dem Ganzen ist, dass ich mir einen "placer" basteln möchte, welcher bei Aktivierung der Checkbox das Verschieben von widgets mit der Maus zulässt und die Position dann in einer txt-Datei speichert und ich diese bei jedem Programmstart lade
BlackJack

@polyworks: Natürlich funktioniert das nicht, denn `var1` ist in der `widget_verschieben()`-Methode gar nicht definiert. Wenn ich mir den Quelltext so anschaue möchtest Du wohl am besten erst einmal objektorientierte Programmierung verstehen und danach erst mit dem Wissen bewaffnet GUIs programmieren.

Mal ganz grob: Man muss nicht jeden Wert an das Objekt binden, allerdings die die den Zustand des Objekts ausmachen *muss* man an das Objekt binden, und man sollte neue Attribute sowieso nur in der `__init__()` einführen.

Grundsätzlich ist das nummerieren von Namen ein „code smell” und nur selten wirklich das was man machen möchte. Meistens ist es ein Hinweis das man eine passende Datenstruktur verwenden möchte. Oft Listen. Im gezeigten Quelltext erscheint das mit den Nummern aber einfach nur sinnfrei zu sein.

Bei Tk wäre dann noch anzumerken, dass man immer nur ein `Tk`-Exemplar im Programm haben darf, das ist das *Haupt*fenster. Wenn man davon mehr als ein Exemplar erstellt, ist das GUI-Toolkit in einem undefinierten Zustand und es können alle möglichen komischen Dinge passieren.

`place()` sollte man nicht verwenden denn dann passt sich die GUI nicht den tatsächlichen Begebenheiten wie Bildschirmgrösse, Auflösung, Schriftgrössen, und so weiter, an.
polyworks
User
Beiträge: 14
Registriert: Montag 7. April 2014, 08:24

Habe was gefunden: Man kann mit "global var1" die Variable für alle Funktionen zugänglich machen, das Problem wäre damit also gelöst.
Ja habe bisher immer nur wild drauf los programmiert, aber ich versuche deine Ratschläge umzusetzen und Danke Dir vielmals für die Tips!
Außerdem versuche ich mich dann mal an grid() statt place. Wenn ich etwas hinbekommen habe, poste ich hier den Quellcode :)
BlackJack

@polyworks: Bitte vergiss ``global`` sofort wieder. Das ist die schlechteste aller Lösungen, wenn man es denn überhaupt als Lösung bezeichnen möchte.
Antworten