gpt4 book ai didi

python - 从类中删除 Canvas 对象时出现问题

转载 作者:太空宇宙 更新时间:2023-11-03 19:07:56 25 4
gpt4 key购买 nike

我在从类中删除 Canvas 对象时遇到问题。

我创建了一个名为 fRectangle 类型的对象。然后我需要删除这个对象。 Python 删除 f,但不会删除 Frame 上的 Canvas 对象。我不知道问题出在哪里。

from tkinter import *


class Rectangle():

def __init__(self, coords, color):
self.coords = coords
self.color = color

def __del__(self):
print("In DELETE")
del self
print("Goodbye")

def draw(self, canvas):
"""Draw the rectangle on a Tk Canvas."""
print("In draw ")
print("Canvas = ",canvas)
print("self = ",self)
print("bild canvas = ",canvas.create_rectangle(*self.coords, fill=self.color))


root = Tk()
root.title('Basic Tkinter straight line')
w = Canvas(root, width=500, height=500)

f = []
f = Rectangle((0+30*10, 0+30*10, 100+30*10, 100+30*10), "yellow")
print("Draw object", f.draw(w), f)
f.__del__()
del f

w.pack()
mainloop()

最佳答案

好吧,您遇到的问题是您开始创建一个 Rectangle 对象供您自己使用,这看起来很合理,但您需要致力于其实现。

无论如何,简单地完成你想做的事情(没有你的对象):

# draws a rectangle and returns a integer
rectangle_id = c.create_rectangle(*(0, 0, 30, 30), fill="yellow")
c.delete(rectangle_id) # removes it from the canvas

为了使用 Rectangle 对象实现您想要的效果,我建议在绘制它时使用一个属性来存储 id,并实现一个可以删除它的方法。当不再有任何对您的对象的引用时,您可能希望使用 __del__ 方法将其删除。这是可以完成的,但您应该注意一些注意事项(超出了我的回答范围......请参阅: http://eli.thegreenplace.net/2009/06/12/safely-using-destructors-in-python/ )。我个人会选择显式调用一个方法来从 View 中删除对象表示,以避免所有这些废话:)。

这里有很多设计决策我忽略了,我建议你在这里对 OO 的使用进行一些思考,或者避免它,直到你更好地理解 tkinter。

关于python - 从类中删除 Canvas 对象时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14104461/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com