bad window path name

Fragen zu Tkinter.
Antworten
hypnoticum
User
Beiträge: 132
Registriert: Dienstag 15. März 2011, 15:43

Ich habe schon wieder ein Problem:
warum kann ich ein label erzeugen, aber kein Button?

Edit: habe gerade gemerkt, dass es an dem destroy liegt

Code: Alles auswählen

from Tkinter import *
import tkSimpleDialog

class ConfigDia(object):
    def __init__(self, master):
        self.top = Toplevel(master)
        self.__Init_widgets__()
    
    def __CB_OK_Btn__(self):
        self.top.destroy()
    
    def __Init_widgets__(self):
        int_var = IntVar()
        label = Label(master = self.top, text = 'taste')
        label.grid(sticky = W, row = 0, column = 0, columnspan = 1)
        
        btn = Button(master = self.top, text = 'taste', command = self.__CB_OK_Btn__())
        btn.grid(sticky = W, row = 1, column = 0, columnspan = 1)

class Main(Frame):
    def __init__(self, master):
        Frame.__init__(self, master)
        self.Init_widgets()   
    
    def Init_widgets(self):
        DevConfigBtn = Button(master = self,
                              text = 'Configure',
                              command = lambda: ConfigDia(self))
        DevConfigBtn.pack()
    

root = Tk()
main = Main(root)
main.grid()
root.mainloop()
BlackJack

@hypnoticum: Weil Du die `__CB_OK_Btn__`-Methode aufrufst(!) und deren Ergebnis als `command` übergibst, statt einfach die Methode zu übergeben. Bevor der `Button` erzeugt wird, hast Du selbst also schon sein Elternwidget zerstört.

Selber Namen mit zwei Unterstrichen am Ende erfinden ist übrigens nicht so gerne gesehen. Das Muster `__name__` ist eigentlich den Python-Entwicklern und für "magische" Sachen vorbehalten.
hypnoticum
User
Beiträge: 132
Registriert: Dienstag 15. März 2011, 15:43

so geht es dann:

Code: Alles auswählen

btn = Button(master = self.top, text = 'taste', command = lambda: self.CB_OK_Btn())
BlackJack

@hypnoticum: Du könntest auch einfach die Methode an der Stelle *nicht aufrufen*:

Code: Alles auswählen

button = tk.Button(master=self.toplevel, text='taste', command=self.cb_ok_button)
hypnoticum
User
Beiträge: 132
Registriert: Dienstag 15. März 2011, 15:43

OK, danke für den Hinweis. Ich habe es noch nicht ganz verstanden, werde mir das aber mal genauer ansehen.
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

Les mal nach was lambda macht, damit erzeugst du im Prinzip nur eine Funktion. Du erstellst in deinem Beipiel oben also eine Funktion um eine Funktion aufzurufen.
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
problembär

Xynon1 hat geschrieben:Les mal nach was lambda macht, damit erzeugst du im Prinzip nur eine Funktion. Du erstellst in deinem Beipiel oben also eine Funktion um eine Funktion aufzurufen.
Das ist (aber) dann notwendig, wenn Du der Funktion noch ein oder mehrere Argumente mitgeben willst.
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

Selbst dann ist es nicht *notwendig* man kann genauso gut "functools.partial" nutzen, obwohl ich dann meist auch lambdas gebrauche.
Zuletzt geändert von Xynon1 am Donnerstag 14. April 2011, 22:46, insgesamt 1-mal geändert.
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
lunar

@problembär: Von Argumenten hat niemand gesprochen. Es ging nur um den gezeigten Quelltext, und darin kommen keine Argumente vor.

Im Übrigen ist es sinnvoller, falls möglich "functools.partial()" zu verwenden. Mit "lambda" kann man schnell unbeabsichtigt Closures erzeugen, und mithin schwierig zu findende Fehler verursachen.
hypnoticum
User
Beiträge: 132
Registriert: Dienstag 15. März 2011, 15:43

kommt schon häufiger vor, dass ich Funktionen mit Argumenten aufrufe oder eine Klasse instanziiere und dann habe ich bisher auch lambda verwendet.
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

@hypnoticum
Kein Grund überall blindlings lambdas hinzuschreiben. :wink:

@lunar
Danke für den Tipp, hatte zwar bisher noch keine Probleme, aber das liegt warscheinlich daran, das die Programme in Tkinter doch eher klein ausfallen.
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
Antworten