tags:

views:

376

answers:

4

This is my code :

    print '1'
from Tkinter import *
print '2'
class myApp:

    print '3'
    def __init__(self,parent):
        print '4'

##        self.myparent = parent    line1
        print '11'

        self.myContainer1 = Frame(parent)
        print '12'
        self.myContainer1.pack()
        print '13'

        self.button1 = Button(self.myContainer1,text="OK",background="green")
        print '14'
        self.button1.pack(side=LEFT)
        print '15'
        self.button1.bind("<Button-1>",self.button1Click)
        print '16'

        self.button2 = Button(self.myContainer1,text="Cancel",background="cyan")
        print '17'
        self.button2.pack(side=RIGHT)
        print '18'
        self.button2.bind("<Button-1>",self.button2Click)
        print '19'


    def button1Click(self,event):

            print '5'

            if self.button1['background'] == 'green':
                print '20'
                self.button1['background'] ='tan'
                print '21'

            else:

                print '22'

                self.button1['background'] = 'yellow'

                print '23'

    def button2Click(self,event):

            print '6'

##            self.myparent.destroy()

            self.parent.destroy()

print '7'
root = Tk()
print '8'
myapp = myApp(root)
print '9'
root.mainloop()
print '10'

Error is :

    >>> ================================ RESTART ================================
>>> 
1
2
3
7
8
4
11
12
13
14
15
16
17
18
19
9
5
20
21
5
22
23
6
Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Python26\lib\lib-tk\Tkinter.py", line 1403, in __call__
    return self.func(*args)
  File "C:\Documents and Settings\he00044.HALEDGEWOOD\Desktop\TkinterExamples\buttonBind.py", line 56, in button2Click
    self.parent.destroy()
AttributeError: myApp instance has no attribute 'parent'
10
>>>

This is when i comment line1

It may be becoz myapp is not finding parent.

But the concept is not clear.

Can anybody explain the concept in detail....

A: 

Assign the incoming parameter parent to self.parent?

def __init__(self,parent):
    self.parent = parent
Scott
+2  A: 

Why ever did you comment out those two lines mentioning self.myparent and create a new one mentioning a mysterious, never-initialized self.parent?! That's the start of your problem, of course -- looks like absurd, deliberate sabotage of code.

Alex Martelli
A: 

Your question is not tkinter related, it's rather about object oriented design.

Class myApp has __init__ method (constructor, the method that executes when object of that class is created), as well as two methods for button clicks. In button2Click method, you attempt to read attribute self.parent (translating as myapp.parent), but this property is not defined.

When you uncomment line 1, you won't get the error. This is because you are creating attribute myapp.parent, and you are assigning the Tk root widget to this attribute. This is necessary as all widgets you create have to receive their parent widget.

Josip
A: 

The other answers so far are great.
This may also help: Fredrik Lundh's intro to Tkinter.

Added some comments to your code that, along with the other answers, should help get you moving again:

import Tkinter

class MyApp:
    def __init__(self, parent): # constructor
        self.parent = parent # the parent here is 'root'
        self.myContainer1 = Tkinter.Frame(self.parent) # create Frame w/ root as parent
        self.myContainer1.pack() # make Frame (myContainer1) visible
        self.button1 = Tkinter.Button(self.myContainer1, 
                        text="OK", background="green") # add button as child of Frame
        self.button1.pack(side=Tkinter.LEFT) # place button1 in Frame
        self.button1.bind("<Button-1>",self.button1Click) # bind left mouse button to button1Click method
        self.button2 = Tkinter.Button(self.myContainer1, text="Cancel", 
                        background="cyan")
        self.button2.pack(side=Tkinter.RIGHT)
        self.button2.bind("<Button-1>", self.button2Click)

    def button1Click(self, event):
        if self.button1['background'] == 'green':
            self.button1['background'] ='tan'
        else:
            self.button1['background'] = 'yellow'

    def button2Click(self, event):
        self.parent.destroy() # the parent here is 'root', so you're ending the event loop

root = Tkinter.Tk()     # create root widget (a window)
myapp = MyApp(root)     # create instance of MyApp with root as the parent
root.mainloop()         # create event loop (ends when window is closed)
Adam Bernier