Tkinter Python

Drawing in Tkinter

last modified January 30, 2024

In this article we do some drawing. Drawing in Tkinter is done on the Canvas widget. Canvas is a high-level facility for doing graphics in Tkinter.

It can be used to create charts, custom widgets, or create games.

Tkinter canvas

A canvas widget manages a 2D collection of graphical objects — lines, circles, images, or other widgets. It is suitable for drawing or building more complex widgets.

Tkinter draw lines

A line is a simple geometric primitive. The create_line method creates a line item on the Canvas.

lines.py
#!/usr/bin/python

from tkinter import Tk, Canvas, Frame, BOTH

class Example(Frame):

    def __init__(self):
        super().__init__()

        self.initUI()


    def initUI(self):

        self.master.title("Lines")
        self.pack(fill=BOTH, expand=1)

        canvas = Canvas(self)
        canvas.create_line(15, 25, 200, 25)
        canvas.create_line(300, 35, 300, 200, dash=(4, 2))
        canvas.create_line(55, 85, 155, 85, 105, 180, 55, 85)

        canvas.pack(fill=BOTH, expand=1)


def main():

    root = Tk()
    ex = Example()
    root.geometry("400x250+300+300")
    root.mainloop()


if __name__ == '__main__':
    main()

In the code example, we draw simple lines.

canvas.create_line(15, 25, 200, 25)

The parameters of the create_line method are the x and y coordinates of the start and end points of the line.

canvas.create_line(300, 35, 300, 200, dash=(4, 2))

A vertical line is drawn. The dash option specifies the dash pattern of the line. We have a line consisting of alternating segments of 4 px dash and 2 px space.

canvas.create_line(55, 85, 155, 85, 105, 180, 55, 85)

The create_line method can take multiple points. This line draws a triangle.

Lines
Figure: Lines

Tkinter colours

A colour is an object representing a combination of Red, Green, and Blue (RGB) intensity values.

colours.py
#!/usr/bin/python

from tkinter import Tk, Canvas, Frame, BOTH


class Example(Frame):

    def __init__(self):
        super().__init__()

        self.initUI()


    def initUI(self):

        self.master.title("Colours")
        self.pack(fill=BOTH, expand=1)

        canvas = Canvas(self)
        canvas.create_rectangle(30, 10, 120, 80,
            outline="#fb0", fill="#fb0")
        canvas.create_rectangle(150, 10, 240, 80,
            outline="#f50", fill="#f50")
        canvas.create_rectangle(270, 10, 370, 80,
            outline="#05f", fill="#05f")
        canvas.pack(fill=BOTH, expand=1)


def main():

    root = Tk()
    ex = Example()
    root.geometry("400x100+300+300")
    root.mainloop()


if __name__ == '__main__':
    main()

In the code example, we draw three rectangles and fill them with different colour values.

canvas = Canvas(self)

We create the Canvas widget.

canvas.create_rectangle(30, 10, 120, 80,
    outline="#fb0", fill="#fb0")

The create_rectangle creates a rectangle item on the canvas. The first four parameters are the x and y coordinates of the two bounding points: the top-left and bottom-right points. With the outline parameter we control the colour of the outline of the rectangle. Likewise, the fill parameter provides a colour for the inside of the rectangle.

Colours
Figure: Colours

Tkinter geometric shapes

We can draw various shapes on the Canvas. The following code example will show some of them.

shapes.py
#!/usr/bin/python

from tkinter import Tk, Canvas, Frame, BOTH

class Example(Frame):

    def __init__(self):
        super().__init__()

        self.initUI()


    def initUI(self):

        self.master.title("Shapes")
        self.pack(fill=BOTH, expand=1)

        canvas = Canvas(self)
        canvas.create_oval(10, 10, 80, 80, outline="#f11",
            fill="#1f1", width=2)
        canvas.create_oval(110, 10, 210, 80, outline="#f11",
            fill="#1f1", width=2)
        canvas.create_rectangle(230, 10, 290, 60,
            outline="#f11", fill="#1f1", width=2)
        canvas.create_arc(30, 200, 90, 100, start=0,
            extent=210, outline="#f11", fill="#1f1", width=2)

        points = [150, 100, 200, 120, 240, 180, 210,
            200, 150, 150, 100, 200]
        canvas.create_polygon(points, outline='#f11',
            fill='#1f1', width=2)

        canvas.pack(fill=BOTH, expand=1)


def main():

    root = Tk()
    ex = Example()
    root.geometry("330x220+300+300")
    root.mainloop()


if __name__ == '__main__':
    main()

We draw five different shapes on the window: a circle, an ellipse, a rectangle, an arc, and a polygon. Outlines are drawn in red and insides in green. The width of the outline is 2px.

canvas.create_oval(10, 10, 80, 80, outline="#f11",
    fill="#1f1", width=2)

Here the create_oval method is used to create a circle item. The first four parameters are the bounding box coordinates of the circle. In other words, they are x and y coordinates of the top-left and bottom-right points of the box, in which the circle is drawn.

canvas.create_rectangle(230, 10, 290, 60,
    outline="#f11", fill="#1f1", width=2)

We create a rectangle item. The coordinates are again the bounding box of the rectangle to be drawn.

canvas.create_arc(30, 200, 90, 100, start=0,
    extent=210, outline="#f11", fill="#1f1", width=2)

This code line creates an arc. An arc is a part of the circumference of the circle. We provide the bounding box. The start parameter is the start angle of the arc. The extent is the angle size.

points = [150, 100, 200, 120, 240, 180, 210,
    200, 150, 150, 100, 200]
canvas.create_polygon(points, outline='#f11',
    fill='#1f1', width=2)

A polygon is created. It is a shape with multiple corners. To create a polygon in Tkinter, we provide the list of polygon coordinates to the create_polygon method.

Shapes
Figure: Shapes

Tkinter draw image

In the following example we draw an image item on the canvas.

draw_image.py
#!/usr/bin/python

from tkinter import Tk, Canvas, Frame, BOTH, NW
from PIL import Image, ImageTk

class Example(Frame):

    def __init__(self):
        super().__init__()

        self.initUI()


    def initUI(self):

        self.master.title("High Tatras")
        self.pack(fill=BOTH, expand=1)

        self.img = Image.open("tatras.jpg")
        self.tatras = ImageTk.PhotoImage(self.img)

        canvas = Canvas(self, width=self.img.size[0]+20,
           height=self.img.size[1]+20)
        canvas.create_image(10, 10, anchor=NW, image=self.tatras)
        canvas.pack(fill=BOTH, expand=1)


def main():

    root = Tk()
    ex = Example()
    root.mainloop()


if __name__ == '__main__':
    main()

The example displays an image on the canvas.

from PIL import Image, ImageTk

From the PIL (Python Imaging Library) module, we import the Image and ImageTk modules.

self.img = Image.open("tatras.jpg")
self.tatras = ImageTk.PhotoImage(self.img)

Tkinter does not support JPG images internally. As a workaround, we use the Image and ImageTk modules.

canvas = Canvas(self, width=self.img.size[0]+20,
    height=self.img.size[1]+20)

We create the Canvas widget. It takes the size of the image into account. It is 20px wider and 20px higher than the actual image size.

canvas.create_image(10, 10, anchor=NW, image=self.tatras)

We use the create_image method to create an image item on the canvas. To show the whole image, it is anchored to the north and to the west. The image parameter provides the photo image to display.

Tkinter draw text

In the last example, we are going to draw text on the window.

draw_text.py
#!/usr/bin/python


from tkinter import Tk, Canvas, Frame, BOTH, W

class Example(Frame):

    def __init__(self):
        super().__init__()

        self.initUI()


    def initUI(self):

        self.master.title("Lyrics")
        self.pack(fill=BOTH, expand=1)

        canvas = Canvas(self)
        canvas.create_text(20, 30, anchor=W, font="Purisa",
            text="Most relationships seem so transitory")
        canvas.create_text(20, 60, anchor=W, font="Purisa",
            text="They're good but not the permanent one")
        canvas.create_text(20, 130, anchor=W, font="Purisa",
            text="Who doesn't long for someone to hold")
        canvas.create_text(20, 160, anchor=W, font="Purisa",
            text="Who knows how to love without being told")
        canvas.create_text(20, 190, anchor=W, font="Purisa",
            text="Somebody tell me why I'm on my own")
        canvas.create_text(20, 220, anchor=W, font="Purisa",
            text="If there's a soulmate for everyone")
        canvas.pack(fill=BOTH, expand=1)


def main():

    root = Tk()
    ex = Example()
    root.geometry("420x250+300+300")
    root.mainloop()


if __name__ == '__main__':
    main()

We draw lyrics of a song on the window.

canvas.create_text(20, 30, anchor=W, font="Purisa",
    text="Most relationships seem so transitory")

The first two parameters are the x and y coordinates of the center point of the text. If we anchor the text item to the west, the text starts from this position. The font parameter provides the font of the text and the text parameter is the text to be displayed.

Drawing text
Figure: Drawing text

Source

Tkinter documentation

In this article we did some drawing.