2009-07-03 53 views
0

这是我的代码:Tkinter的按键绑定和家长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' 

错误是:

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

这是当我评论一号线

可能becoz MYAPP没有找到父母。

但这个概念并不清楚。

任何人能详细解释这一概念....

回答

0

指定传入的参数父母self.parent?

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

你究竟为什么你注释掉这两条线提self.myparent并创建一个新提一个神秘的,从来没有初始化self.parent?!当然,这就是你的问题的开始 - 看起来像荒谬的,蓄意破坏代码。

0

你的问题不是tkinter相关的,而是关于面向对象的设计。

对myApp具有__init__方法(构造器,创建该类的对象时执行所述方法),以及两种方法按钮点击。在button2Click方法中,您尝试读取属性self.parent(翻译为myapp.parent),但此属性未定义。

当您取消注释第1行时,您将不会收到错误消息。这是因为您正在创建属性myapp.parent,并且您正在将Tk根窗口小部件分配给此属性。这是必要的,因为您创建的所有窗口小部件都必须接收其父窗口小部件。

0

到目前为止的其他答案是伟大的。
这也可能有所帮助:Fredrik Lundh's intro to Tkinter

加入了一些意见,你的代码,与其他的答案一起,应该帮助你继续前行:

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)