[Tkinter-discuss] Calling functions outside the class

Michael O'Donnell michael.odonnell at uam.es
Fri Dec 17 09:03:28 CET 2010


Hi Cristian,

  The problem is, self is only defined within the class definition.
Basically, the function are not part of the class, just called by the class.
We use a lambda to get the class passed to the function.
So, to correct your code:

from Tkinter import *

class MyApp:
   def __init__(self, parent):
       self.myParent = parent  ### (7) remember my parent, the root
       self.myContainer1 = Frame(parent)
       self.myContainer1.pack()

       self.button1 = Button(self.myContainer1)
       self.button1.configure(text="OK", background= "green")
       self.button1.pack(side=LEFT)
       self.button1.bind("<Button-1>", lambda e, win=self:
button1Click(win)) ### (1)

       self.button2 = Button(self.myContainer1)
       self.button2.configure(text="Cancel", background="red")
       self.button2.pack(side=RIGHT)
       self.button2.bind("<Button-1>", lambda e, win=self:
button2Click(win)) ### (2)

def button1Click(win):
   if win.button1["background"] == "green": ### (4)
       win.button1["background"] = "yellow"
   else:
       win.button2["background"] = "green"

def button2Click(win):
       win.myParent.destroy()     ### (6)


root = Tk()
myapp = MyApp(root)
root.mainloop()


root = Tk()
myapp = MyApp(root)
root.mainloop()




On Fri, Dec 17, 2010 at 4:35 AM, craf <prog at vtr.net> wrote:
> Hi.
>
> I'm testing this code:
>
> -------------------------------------------------------------------
> from Tkinter import *
>
> class MyApp:
>    def __init__(self, parent):
>        self.myParent = parent  ### (7) remember my parent, the root
>        self.myContainer1 = Frame(parent)
>        self.myContainer1.pack()
>
>        self.button1 = Button(self.myContainer1)
>        self.button1.configure(text="OK", background= "green")
>        self.button1.pack(side=LEFT)
>        self.button1.bind("<Button-1>", self.button1Click) ### (1)
>
>        self.button2 = Button(self.myContainer1)
>        self.button2.configure(text="Cancel", background="red")
>        self.button2.pack(side=RIGHT)
>        self.button2.bind("<Button-1>", self.button2Click) ### (2)
>
>    def button1Click(self, event):    ### (3)
>        if self.button1["background"] == "green": ### (4)
>            self.button1["background"] = "yellow"
>        else:
>            self.button2["background"] = "green"
>
>    def button2Click(self, event):  ### (5)
>        self.myParent.destroy()     ### (6)
>
>
> root = Tk()
> myapp = MyApp(root)
> root.mainloop()
>
> ---------------------------------------------------------------------
>
> Works without problems, but if I want to get the functions of the class,
> then the problems begin.
>
> from Tkinter import *
>
> class MyApp:
>    def __init__(self, parent):
>        self.myParent = parent  ### (7) remember my parent, the root
>        self.myContainer1 = Frame(parent)
>        self.myContainer1.pack()
>
>        self.button1 = Button(self.myContainer1)
>        self.button1.configure(text="OK", background= "green")
>        self.button1.pack(side=LEFT)
>        self.button1.bind("<Button-1>", self.button1Click) ### (1)
>
>        self.button2 = Button(self.myContainer1)
>        self.button2.configure(text="Cancel", background="red")
>        self.button2.pack(side=RIGHT)
>        self.button2.bind("<Button-1>", self.button2Click) ### (2)
>
> def button1Click(self, event):    ¡¡¡FUNCTION OUTSIDE THE CLASS!!!
>    if self.button1["background"] == "green": ### (4)
>        self.button1["background"] = "yellow"
>    else:
>        self.button2["background"] = "green"
>
> def button2Click(self, event): ¡¡¡FUNCTION OUTSIDE THE CLASS!!!
>        self.myParent.destroy()     ### (6)
>
>
> root = Tk()
> myapp = MyApp(root)
> root.mainloop()
>
> What would be the correct way to call them?
>
> Thanks in advance
>
> Regards
>
> Cristian Abarzua F
>
> _______________________________________________
> Tkinter-discuss mailing list
> Tkinter-discuss at python.org
> http://mail.python.org/mailman/listinfo/tkinter-discuss
>


More information about the Tkinter-discuss mailing list