【问题标题】:Delete an instance of a class删除一个类的实例
【发布时间】:2014-10-17 12:31:30
【问题描述】:

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

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

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)

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

【问题讨论】:

  • 我明白了。我应该将创建圆圈的方法替换为 OVAL 类吗?然后从 Application 类中引用它?
  • 我不明白你遵循什么逻辑。您创建自己的类 Oval 的实例,同时创建另一个 tkinter 对象。您从未将self.d 放在can1 上。你需要Oval 做什么?

标签: python class instance code-organization


【解决方案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 上创建一个完全不相关(除了具有相同的维度属性)的椭圆形分配给self.dOval 对象。相反,我认为你想要:

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

这保留了对Canvas 上的对象的引用,因此您将能够delete 它。请注意,Oval 或多或少完全没有意义,因为它所做的只是提供尺寸。

【讨论】:

  • 如果你猜对了 OP 的意图,我向你致敬。我仍然看不到椭圆形的用途,因为它几乎立即丢失了。至少它现在可以明显工作=)。可能最明智的做法是延长或包裹 tkinter 的椭圆形,但选择需要一个水晶球。
  • @luk32 是的,Oval 似乎完全存在以设置默认值(它们甚至不是默认参数),所以有点毫无意义。我会说得更清楚。
  • 谢谢,现在可以使用了。现在我确实意识到这是一个相当愚蠢的错误,因为函数创建的椭圆没有链接到任何变量,因此一旦创建了这个对象,它就基本上消失了。如果我想控制 OVAL 类的行为或实例,我应该总是有一个“对”对象吗?我的意思是像'o'和'self.d'。还是有办法避免它?我是这个面向对象逻辑的新手,抱歉。
  • 没有真正需要oOval 类。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-02-23
  • 1970-01-01
  • 2016-11-05
  • 1970-01-01
  • 2013-11-27
  • 2016-01-21
  • 1970-01-01
相关资源
最近更新 更多