[Tutor] how do i access object

Ketan Maheshwari kmaheshw at science.uva.nl
Thu Jan 4 14:51:09 CET 2007


Hi
As suggested by Alan, I wrote a method getcenter as follows
***
def getcenter(self):
        xy=self.canvas.coords(self.id)
        xcenter=(xy[2]-xy[0])/2
        ycenter=(xy[3]-xy[1])/2
        return xcenter, ycenter
***
However, when I call this method from the instance of Circle class I get 
error:
call ...
print items[1].getcenter()
error ...
AttributeError: 'function' object has no attribute 'getcenter'

What is happening here?

Thanks
ketan.

PS> full code follows ...

from Tkinter import *
import time
import random
class Circle:

    def __init__(self, canvas, xy, ink, delta):
        self.canvas = canvas
        self.id = self.canvas.create_oval(
            -15, -15,
            15, 15,
            fill=ink
            )
       
        self.canvas.move(self.id, xy[0], xy[1])
        self.delta = delta
        self.start = self.move
       
       
    def __call__(self):
            return self.start # get things going
    def move(self):
        rand=random.randint(1,4)
       
        if rand==1:
            xy = self.canvas.coords(self.id)
            #print xy
            if xy[2] >= self.canvas.winfo_width():
                self.canvas.move(self.id,-self.delta,0)
            self.canvas.move(self.id,self.delta,0)
        elif rand==2:
            xy = self.canvas.coords(self.id)
            if xy[0] <= 0:
                self.canvas.move(self.id,self.delta,0)
            self.canvas.move(self.id,-self.delta,0)
        elif rand==3:
            xy = self.canvas.coords(self.id)
            if xy[1] <= 0:
                self.canvas.move(self.id,0,self.delta)
            self.canvas.move(self.id,0,-self.delta)
        else:
            xy = self.canvas.coords(self.id)
            if xy[3] >= self.canvas.winfo_height():
                self.canvas.move(self.id,0,-self.delta)
            self.canvas.move(self.id,0,self.delta)
        return self.move
   
    def getcenter(self):
        xy=self.canvas.coords(self.id)
        xcenter=(xy[2]-xy[0])/2
        ycenter=(xy[3]-xy[1])/2
        return xcenter, ycenter
       
   
root = Tk()
root.title("Circles")
root.resizable(0, 0)

frame = Frame(root, bd=5, relief=SUNKEN)
frame.pack()

canvas = Canvas(frame, width=200, height=200, bd=0, highlightthickness=0)
canvas.pack()

items = [
    Circle(canvas, (60, 70), "blue", 1),
    Circle(canvas, (100, 120), "green", 1),
    ]

root.update() # fix geometry

# loop over items

try:
    while 1:
        for i in range(len(items)):
            items[i] = items[i]()
            root.update_idletasks() # redraw
        root.update() # process events
        print items[1].getcenter()
        time.sleep(0.02)
except TclError:
    pass # to avoid errors when the window is closed



More information about the Tutor mailing list