Tk radiobutton Problem

Fragen zu Tkinter.
Antworten
Pa5tA
User
Beiträge: 21
Registriert: Sonntag 1. August 2010, 16:37

Ich habe die Klasse DeleteDialog:

Code: Alles auswählen

import tkinter
import Backup

class DeleteDialog(tkinter.Frame):
    def __init__(self, list, master = None):
        tkinter.Frame.__init__(self, master)
        self.Backup = Backup.Backup()
        self.pack()
        self.master = master
        self.List = list
        self.var = tkinter.StringVar(value = "")
        self.createWidgets()
    def createWidgets(self):
        self.LabelFrame = tkinter.LabelFrame(self, text = "Folders")
        for i in self.List:
            Value = tkinter.StringVar(value = i)
            radiobutton = tkinter.Radiobutton(self.LabelFrame, text = i, value = Value,
                                              variable = self.var, command = self.RadioHandler)
            radiobutton.pack(anchor = "w")
        
        self.LabelFrame.pack()
        
        self.deleteButton = tkinter.Button(master = self,text = "Delete", 
                                           command = self.delete)
        self.deleteButton.pack()
    
    def RadioHandler(self):
        print("RadioHandler")
        print(self.var.get())
Mein Problem ist nun, dass die Variable nicht beschrieben wird. Bei jeden aufruf von RadioHandler ist die Variable "". Ich hab auch schon normale Python Strings ausprobiert und das Ergebnis war nicht anders. Ich sehe den Fehler iregentwie nicht ... :(
BlackJack

@Pa5tA: Das kann ich hier, zwar mit Python 2.x, nicht nachvollziehen. Hier kommt wie erwartet 'PY_VARx' als Ausgabe. Der Code ist so wie er da steht aber auch nicht ohne Änderungen ausführbar. Mach mal ein lauffähiges Minimalbeispiel.
Pa5tA
User
Beiträge: 21
Registriert: Sonntag 1. August 2010, 16:37

Mhh ich bin grad ein wenig verwirrt. Ich hab mal schnell ein Beispiel geschrieben:

Code: Alles auswählen

#!/usr/bin/env python3
import tkinter
#import Backup

class DeleteDialog(tkinter.Frame):
    def __init__(self, list, master = None):
        tkinter.Frame.__init__(self, master)
        #self.Backup = Backup.Backup()
        self.pack()
        self.master = master
        self.List = list
        self.var = tkinter.StringVar(value = "")
        self.createWidgets()
    def createWidgets(self):
        self.LabelFrame = tkinter.LabelFrame(self, text = "Folders")
        for i in self.List:
            print (i)
            Value = i
            radiobutton = tkinter.Radiobutton(self.LabelFrame, text = i, value = Value,
                                              variable = self.var, command = self.RadioHandler)
            radiobutton.pack(anchor = "w")
        
        self.LabelFrame.pack()
        
        self.deleteButton = tkinter.Button(master = self,text = "Delete", 
                                           command = self.delete)
        self.deleteButton.pack()
    
    def RadioHandler(self):
        print("RadioHandler")
        print(self.var.get())
    
    def delete(self):
        print (self.var.get())
        #self.Backup.delSource(self.var.get())
        self.master.destroy()
        
if __name__ == "__main__":
    root = tkinter.Tk()
    app = DeleteDialog(["a", "b", "c"],root)
    app.mainloop()
Wenn ich dieses Beispiel ausfuehre, funktioniert das ganze ohne Probleme. Das 'print (self.var.get()) zeigt wie gewuenscht die Variable an (in dem Fall z.B. 'a').Wenn ich die Klasse aber vom Hauptprogramm aufrufe ueber die folgenden Funktion:

Code: Alles auswählen

    def deleteFolder(self, event):
        List = self.Backup.Sources
        print (List)
        newRoot = tkinter.Tk()
        DeleteWidget = DeleteDialog.DeleteDialog(list = List,master = newRoot)
        DeleteWidget.mainloop()
aufrufe funktioniert es nicht. Ich bekomme eine leere Zeile. In dem Fall ist List zum Beispiel ['/home', '/media/Backup'].
BlackJack

@Pa5tA: Es darf nur ein Exemplar von `Tk` geben. Das ist das Hauptfenster, das kann es nur einmal geben. Wenn Du mehrere davon erstellst, dann können die interessantesten Sachen passieren, weil zwei Hauptschleifen versuchen die Kontrolle über die GUI zu behalten und Ereignisse zu verarbeiten.

Für zusätzliche Fenster gibt es `tkinter.Toplevel`.
Pa5tA
User
Beiträge: 21
Registriert: Sonntag 1. August 2010, 16:37

Ahh danke werd ich gleich mal ausprobieren.
Edit:
Jetzt bekomme ich eine Fehlermeldung:

Code: Alles auswählen

    self.title(root.title())
TypeError: 'str' object is not callable
So sieht mein Aufruf jetzt aus:

Code: Alles auswählen

    def deleteFolder(self, event):
        List = self.Backup.Sources
        print (List)
        top = tkinter.Toplevel(self.master)
        top.title = ("Delete Folder")
        DeleteWidget = DeleteDialog.DeleteDialog(list = List,master = top)
        DeleteWidget.mainloop()
Hab auch schon gegoogled, ich finde auch genuegend Beispiele, aber net die Loesung...
BlackJack

@Pa5tA: Du weist dem Attribut `title` eine Zeichenkette zu und ersetzt damit die Methode `title` und beim Versuch die Zeichenkette aufzurufen kommt dann natürlich dieser Fehler.

Warum hast Du denn die Klammern um die Zeichenkette gesetzt? Du hattest da vielleicht schon das richtige vor, aber dann das falsche gemacht.
Pa5tA
User
Beiträge: 21
Registriert: Sonntag 1. August 2010, 16:37

Danke hab es zum laufen bekommen :)
Antworten