1

クラスからキャンバスオブジェクトを削除する際に問題が発生しました。

Rectangleというタイプのオブジェクトを作成しましたf。次に、このオブジェクトを削除する必要があります。Pythonfはを削除しますが、Frame上にあるキャンバスオブジェクトは削除しません。どこに問題があるのか​​わかりません。

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()
4

1 に答える 1

1

わかりました、あなたが抱えている問題は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/ )。私は個人的に、ビューからオブジェクト表現を削除するメソッドを明示的に呼び出して、そのナンセンスをすべて回避することを選択します:)。

ここでは無視している多くの設計上の決定があります。ここで OO の使用を検討するか、tkinter をよりよく理解するまでは使用しないことをお勧めします。

于 2012-12-31T18:25:04.257 に答える