Seite 1 von 1

Tk radiobutton Problem

Verfasst: Freitag 8. Oktober 2010, 18:12
von Pa5tA
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 ... :(

Re: Tk radiobutton Problem

Verfasst: Freitag 8. Oktober 2010, 19:14
von 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.

Re: Tk radiobutton Problem

Verfasst: Samstag 9. Oktober 2010, 12:48
von Pa5tA
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'].

Re: Tk radiobutton Problem

Verfasst: Samstag 9. Oktober 2010, 13:24
von 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`.

Re: Tk radiobutton Problem

Verfasst: Samstag 9. Oktober 2010, 13:36
von Pa5tA
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...

Re: Tk radiobutton Problem

Verfasst: Samstag 9. Oktober 2010, 15:00
von 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.

Re: Tk radiobutton Problem

Verfasst: Samstag 9. Oktober 2010, 15:43
von Pa5tA
Danke hab es zum laufen bekommen :)