Seite 1 von 1

bad window path name

Verfasst: Donnerstag 14. April 2011, 13:50
von hypnoticum
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()

Re: bad window path name

Verfasst: Donnerstag 14. April 2011, 13:57
von 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.

Re: bad window path name

Verfasst: Donnerstag 14. April 2011, 14:01
von hypnoticum
so geht es dann:

Code: Alles auswählen

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

Re: bad window path name

Verfasst: Donnerstag 14. April 2011, 14:09
von 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)

Re: bad window path name

Verfasst: Donnerstag 14. April 2011, 14:22
von hypnoticum
OK, danke für den Hinweis. Ich habe es noch nicht ganz verstanden, werde mir das aber mal genauer ansehen.

Re: bad window path name

Verfasst: Donnerstag 14. April 2011, 14:50
von Xynon1
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.

Re: bad window path name

Verfasst: Donnerstag 14. April 2011, 20:09
von 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.

Re: bad window path name

Verfasst: Donnerstag 14. April 2011, 22:41
von Xynon1
Selbst dann ist es nicht *notwendig* man kann genauso gut "functools.partial" nutzen, obwohl ich dann meist auch lambdas gebrauche.

Re: bad window path name

Verfasst: Donnerstag 14. April 2011, 22:43
von 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.

Re: bad window path name

Verfasst: Freitag 15. April 2011, 08:42
von hypnoticum
kommt schon häufiger vor, dass ich Funktionen mit Argumenten aufrufe oder eine Klasse instanziiere und dann habe ich bisher auch lambda verwendet.

Re: bad window path name

Verfasst: Freitag 15. April 2011, 08:49
von Xynon1
@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.