Reputation: 159261
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....
Upvotes: 0
Views: 2140
Reputation: 881497
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.
Upvotes: 2
Reputation: 169274
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)
Upvotes: 0
Reputation: 6735
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.
Upvotes: 0
Reputation: 5263
Assign the incoming parameter parent to self.parent?
def __init__(self,parent):
self.parent = parent
Upvotes: 0