Canvas polygon coords() using list comprehension

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • Dave Harris

    Canvas polygon coords() using list comprehension

    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_polygo n(outline1, fill='', outline='black' )
    p2 = c.create_polygo n(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\Li b\lib-tk\Tkinter.py", line 2039, in coords
    self.tk.splitli st(
    _tkinter.TclErr or: bad screen distance "170)]"

  • Peter Otten

    #2
    Re: Canvas polygon coords() using list comprehension

    Dave Harris wrote:
    [color=blue]
    > 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()?[/color]

    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_polygo n(outline1, fill='', outline='black' )
    p2 = c.create_polygo n(outline1, fill='', outline='red')

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

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

    Peter

    Comment

    Working...