2009-07-03 14 views
0

Ceci est mon code:bouton Tkinter lier et parent deatroy

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' 

erreur est:

>>> ================================ 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 
>>> 

C'est quand je commente line1

Il peut être becoz myapp est de ne pas trouver parent .

Mais le concept n'est pas clair.

Quelqu'un peut-il expliquer le concept en détail ....

Répondre

0

affecter le parent paramètre entrant self.parent?

def __init__(self,parent): 
    self.parent = parent 
2

Pourquoi avez-vous jamais en commentaire ces deux lignes mentionnant self.myparent et créer une nouvelle mention d'un mystérieux, jamais initialisé self.parent?! C'est le début de votre problème, bien sûr - ressemble à un sabotage délibéré et absurde du code.

0

Votre question n'est pas liée à tkinter, il s'agit plutôt de la conception orientée objet.

classe myApp a __init__ méthode (constructeur, la méthode qui est exécutée lorsque l'objet de cette classe est créée), ainsi que deux méthodes de clics de bouton. Dans la méthode button2Click, vous essayez de lire l'attribut self.parent (traduisant par myapp.parent), mais cette propriété n'est pas définie. Lorsque vous décommerez la ligne 1, l'erreur ne se produira pas. En effet, vous créez l'attribut myapp.parent et vous affectez le widget racine Tk à cet attribut. Ceci est nécessaire car tous les widgets que vous créez doivent recevoir leur widget parent.

0

Les autres réponses sont excellentes.
Cela peut également aider: Fredrik Lundh's intro to Tkinter.

a ajouté quelques commentaires à votre code, ainsi que les autres réponses, devrait aider à vous faire bouger à nouveau:

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) 
Questions connexes