Canvas polygon coords() using list comprehension

D

Dave Harris

I have written a reasonably clean way to perform coordinate transformations
on a polygon, but Tkinter Canvas is not being particularly cooperative. The
following program has been distilled down to a minimum and generates a
traceback (see below) when it runs.

It appears that the create_polygon() method is more versatile than the
coords() method.

Could someone can suggest a way to have the list comprehension not generate
tuples, that would probably create a coordinate list acceptable to coords()?

Thanks,
Dave Harris

# cantest.py - canvas test program
from Tkinter import *

class App:
def __init__(self, master):
frame = Frame(master)
frame.pack()
c = Canvas(frame, width=300, height=300)
c.pack()

outline1 = [(100, 0), (200, 50), (150, 150)]
p1 = c.create_polygon(outline1, fill='', outline='black')
p2 = c.create_polygon(outline1, fill='', outline='red')

outline2 = [(x+10, y+20) for (x, y) in outline1]
c.coords(p2, outline2)

root = Tk()
app = App(root)
root.mainloop()


Traceback (most recent call last):
File "cantest.py", line 24, in ?
app = App(root)
File "cantest.py", line 20, in __init__
c.coords(p2, outline2)
File "C:\PYTHON23\Lib\lib-tk\Tkinter.py", line 2039, in coords
self.tk.splitlist(
_tkinter.TclError: bad screen distance "170)]"
 
P

Peter Otten

Dave said:
I have written a reasonably clean way to perform coordinate
transformations on a polygon, but Tkinter Canvas is not being particularly
cooperative. The following program has been distilled down to a minimum
and generates a traceback (see below) when it runs.

It appears that the create_polygon() method is more versatile than the
coords() method.

Could someone can suggest a way to have the list comprehension not
generate tuples, that would probably create a coordinate list acceptable
to coords()?

You can explicitly flatten the list:

import Tkinter
from Tkinter import *

class App:
def __init__(self, master):
frame = Frame(master)
frame.pack()
c = Canvas(frame, width=300, height=300)
c.pack()

outline1 = [(100, 0), (200, 50), (150, 150)]
p1 = c.create_polygon(outline1, fill='', outline='black')
p2 = c.create_polygon(outline1, fill='', outline='red')

outline2 = [(x+10, y+20) for (x, y) in outline1]
c.coords(p2, Tkinter._flatten(outline2))

root = Tk()
app = App(root)
root.mainloop()

Peter
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,766
Messages
2,569,569
Members
45,042
Latest member
icassiem

Latest Threads

Top