[Tutor] OOP help needed

Jim Byrnes jf_byrnes at comcast.net
Tue Jul 26 23:44:42 EDT 2016

OOP has always driven me crazy.  I read the material and follow the 
examples until I feel I understand them, but when I try to implement it 
I end up with an error filled mess.

So I decided to give it another try.  When I got to the chapter on 
tkinter I decided to solve all the exercises using OOP even though the 
book solutions did not use OOP. The first one went fine:


import tkinter

class Goodbye:
   def __init__(self):

     self.frame = tkinter.Frame(window)

     self.goodbye_button = tkinter.Button(self.frame, text='Goodbye',
       command=lambda: quit() )

   def quit():

if __name__=='__main__':
   window = tkinter.Tk()
   myapp = Goodbye()

The second one was more trouble but I finally got it to work.

# exer2.py

import tkinter

class Count:

   def __init__(self):
     ''' Increment a button labeled 0, by 1 with each click '''
     self.frame = tkinter.Frame(window)
     self.label = tkinter.StringVar()
     self.count_btn = tkinter.Button(self.frame, textvariable=self.label,
       command=lambda: self.increment(self.label ))

   def increment(self, label):
     count = int(self.label.get())
     self.label.set(str(count + 1))

if __name__ == '__main__':
   window = tkinter.Tk()
   myapp = Count()

I am having trouble understanding the difference between the two lines 
that contain lambda: command= .In exer1.py I can do command=lambda: 
quit().  In exer2.py if I do command=lambda: increment(self.label) I get 
this error:

Exception in Tkinter callback
Traceback (most recent call last):
   File "/usr/lib/python3.4/tkinter/__init__.py", line 1536, in __call__
     return self.func(*args)
   File "exer2.py", line 14, in <lambda>
     command=lambda: increment(self.label ))
NameError: name 'increment' is not defined

Why do I get this error?  The situations look the same to me but they 
must be different somehow and I just don't see the difference.

Thanks,  Jim

More information about the Tutor mailing list