删除方法出现意外结果

时间:2012-01-30 15:24:36

标签: python tkinter

在一本书中发现这个练习用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()

1 个答案:

答案 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进行测试