2014-10-17 79 views
0

我已经在这里问过类似的问题,我收到了很有帮助的回复。 但是从那以后我修改了我的代码,现在它更加优化了,我想它应该更灵活,但同样的问题仍然存在。我无法删除该类的一个实例。删除类的一个实例

我想要做的是创建一个圆(左键单击),然后我希望程序删除该圆(右键单击)。

My code: 

from tkinter import * 

class Application: 
    def __init__(self): 
     self.fen = Tk() 
     self.fen.title('Rom-rom-roooooom') 
     self.butt1 = Button(self.fen, text = ' Quit ', command = self.fen.quit) 
     self.can1 = Canvas(self.fen, width = 300, height = 300, bg = 'ivory') 
     self.can1.grid(row = 1) 
     self.butt1.grid(row = 2) 
     self.fen.bind("<Button-1>", self.create_obj) 
     self.fen.bind("<Button-3>", self.delete_obj) 
     self.fen.mainloop() 
    def create_obj(self, event): 
     self.d = Oval() 
     self.can1.create_oval(self.d.x1, self.d.y1, self.d.x2, self.d.y2, fill='red', width = 2) 
    def delete_obj(self, event): 
     self.can1.delete(self.d) 


class Oval: 

    def __init__(self): 
     self.x1 = 50 
     self.y1 = 50 
     self.x2 = 70 
     self.y2 = 70 



appp = Application() 

所以,再一次,问题是,在这里我不能删除对象:

def delete_obj(self, event): 
     self.can1.delete(self.d) 

一个问题。鉴于我只是一个成员,我不知道我是否就班级组织而言选择了正确的方法。它看起来像是一个组织良好的代码,还是应该在这个阶段改变任何东西?

+0

我明白了。我应该将创建圆的方法替换为OVAL类吗?然后从Application类引用它? – 2014-10-17 12:38:47

+0

我不明白你遵循什么逻辑。您可以创建自己的类“Oval”的实例,并行地创建另一个tkinter对象。你从来没有在'can1'上放置'self.d'。你需要什么“椭圆形”? – luk32 2014-10-17 12:38:53

回答

1

这两条线:

self.d = Oval() 
self.can1.create_oval(self.d.x1, self.d.y1, self.d.x2, self.d.y2, fill='red', width = 2) 

创建新Oval对象,该对象分配给名self.d,然后在self.can1创建椭圆即完全无关(除了具有相同的尺寸属性)从Oval对象分配到self.d。相反,我想你想:

o = Oval() 
self.d = self.can1.create_oval(o.x1, o.y1, o.x2, o.y2, fill='red', width = 2) 

这将保留在Canvas一个参考对象,所以你就能delete它。请注意0​​或多或少是完全没有意义的,因为它所做的只是提供尺寸。

+0

如果你猜对了OP的意图,我向你致敬。我仍然没有看到椭圆形的目的,因为它几乎立即丢失了。至少它会明显地工作=)。可能最明智的是延长或包裹tkinter的椭圆形,但选择需要一个水晶球。 – luk32 2014-10-17 12:48:09

+0

@ luk32是的,'Oval'似乎完全存在以设置默认值(它们甚至不是默认参数),所以有点没有意义。我会做得更清楚。 – jonrsharpe 2014-10-17 12:50:10

+0

谢谢,它现在有效。 现在我意识到这是一个相当不错的错,因为函数创建的椭圆并没有链接到任何变量,因此只要创建了这个对象,它就基本消失了。 如果我想控制行为或类OVAL的实例,我应该总是有一个'对'对象?我的意思是像'o'和'self.d'。或者有办法避免它? 我不熟悉这种面向对象的逻辑。 – 2014-10-19 20:47:58