easiest way to plot x,y graphically during run-time?

Scott David Daniels Scott.Daniels at Acm.Org
Wed Jun 3 16:29:35 EDT 2009


Esmail wrote:
> ... Tk seems a bit more complex .. but I really don't know much about
> it and its interface with Python to make any sort of judgments as
> to which option would be better.

This should look pretty easy:


     import Tkinter as tk

     class Mover(object):
         def __init__(self, canvas, tag_or_id):
             self.canvas = canvas
             self.ident = tag_or_id
             self.x = self.y = 0

         def start(self, event):
             self.x = event.x
             self.y = event.y

         def move(self, event):
             if event.x != self.x or event.y != self.y:
                 dx = event.x - self.x
                 dy = event.y - self.y
                 self.x = event.x
                 self.y = event.y
                 self.canvas.move(self.ident, dx, dy)

     def setup(root=None):
         if root is None:
             root = tk.Tk()
         root.geometry('400x400+5+5')  # experiment: -- place and size
         canvas = tk.Canvas(root)
         canvas.pack(expand=1, fill=tk.BOTH)
         # ovals are x1, y1, x2, y2
         a = canvas.create_oval((50, 100, 70, 140), fill='red')
         b = canvas.create_oval((100, 200, 140, 290), fill='blue')
         c = canvas.create_oval((300, 300, 390, 330), fill='green')

         canvas.itemconfig(a, fill='#55AADD') # using internet colors
         canvas.move(a, 5, 5) # move a down right 5 pixels
         mover = [Mover(canvas, ident) for ident in (a, b, c)]
         canvas.bind("<B1-Motion>", mover[0].move)
         canvas.bind("<Button-1>", mover[0].start)
         canvas.bind("<B2-Motion>", mover[1].move)
         canvas.bind("<Button-2>", mover[1].start)
         canvas.bind("<B3-Motion>", mover[2].move)
         canvas.bind("<Button-3>", mover[2].start)
         return canvas, mover

     if __name__ == '__main__':
         c, m = setup()
         tk.mainloop()


If you want to experiment, use something like:
     python -m idlelib.idle -n
or
     $ python <wherever python is>/Lib/idlelib/idle.py -n
or
     C:\> C:\Python25\python C:\Python25\Lib\idlelib\idle.py -n

To get an idle window with the -n switch on (so you are using the idle
"in-process") to see the effects of each Tkinter operation as you go.
You can then run these operations in place, seeing results and effects.

--Scott David Daniels
Scott.Daniels at Acm.Org



More information about the Python-list mailing list