Tkinter的按键绑定和家长deatroy
问题描述:
这是我的代码: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没有找到父母。
但这个概念并不清楚。
任何人能详细解释这一概念....
答
指定传入的参数父母self.parent?
def __init__(self,parent):
self.parent = parent
答
你究竟为什么你注释掉这两条线提self.myparent
并创建一个新提一个神秘的,从来没有初始化self.parent
?!当然,这就是你的问题的开始 - 看起来像荒谬的,蓄意破坏代码。
答
你的问题不是tkinter相关的,而是关于面向对象的设计。
类对myApp具有__init__方法(构造器,创建该类的对象时执行所述方法),以及两种方法按钮点击。在button2Click方法中,您尝试读取属性self.parent(翻译为myapp.parent),但此属性未定义。
当您取消注释第1行时,您将不会收到错误消息。这是因为您正在创建属性myapp.parent,并且您正在将Tk根窗口小部件分配给此属性。这是必要的,因为您创建的所有窗口小部件都必须接收其父窗口小部件。
答
到目前为止的其他答案是伟大的。
这也可能有所帮助: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)