在一本书中发现这个练习用Python 3学习编程...我必须创建一个派生自Frame的新App类。它必须显示一个面部和2个按钮,一个用于绘制一个张开的嘴,另一个用于绘制一条线(打开和关闭嘴 - noob练习)。
下面是我做的,它几乎像它应该的工作:打开的按钮工作正常,如果有一条线(闭口),它删除它,但闭嘴按钮绘制线而不删除张开的嘴,虽然它看起来像我使用完全相同的删除方法来处理... 我的问题:为什么它适用于一个按钮而不是另一个按钮?你得到同样的结果吗?
class Application(Frame):
"main canvas and buttons"
def __init__(self, boss =None):
Frame.__init__(self)
self.can = Canvas(self, width=400, height =400, bg ='ivory')
self.can.pack(side =TOP, padx =5, pady =5)
self.face=Visage(self.can, 50, 50)
self.bouche=2
Button(self, text ="Ouvrir", command =self.ouvrirBouche).pack(side =LEFT)
Button(self, text ="Fermer", command =self.fermerBouche).pack(side =LEFT)
def ouvrirBouche(self):
"draws the open mouth and delete the closed one if any"
if (self.bouche != 0):
self.ouvre=cercle(self.can, 200, 260, 35)
if (self.bouche ==1):
print(self.bouche)
self.can.delete(self.ferme)
self.bouche=0
def fermerBouche(self):
"draws the closed mouth and delete the open one if any"
if (self.bouche != 1):
self.ferme= self.can.create_line(170, 260, 230, 260)
if (self.bouche ==0):
print(self.bouche)
self.can.delete(self.ouvre)
self.bouche=1
class Visage(object):
"drawing a face in canvas canv"
def __init__(self, canv, x, y):
self.canv, self.x, self.y = canv, x, y
cercle(canv, x+150, y+150, 130)
cercle(canv, x+100, y+100, 20)
cercle(canv, x+200, y+100, 20)
if __name__ == '__main__':
root=Tk()
app=Application(root)
app.pack(side=TOP)
root.mainloop()
答案 0 :(得分:3)
你可能定义了一个吸引法国圈子的函数cercle
该函数应如下所示:
def cercle(canv, x, y, rad):
return canv.create_oval(x-rad, y-rad, x+rad, y+rad, width=2)
请注意,该功能必须 返回 圆圈对象。否则self.ouvre
为无,然后您无法删除它,因为您没有self.can.delete(self.ouvre)
中对象的引用。
在Windows 7 64位
中使用python 3.2进行测试