Tkinter canvas updating speed reduces during the course of a program
performance, python, tkinter
Solution
You create new items at each updates. The canvas display all the rectangles you have previously added and thus go slower and slower (each update create 900 rectangles, after 30 you have 27,000 objects in your scene...)
To avoid this, you may create your rectangles once, and then only update their colors.
You could have at toplevel:
rectangles = [ [ canvas.create_rectangle (CELL_SIZE*x, CELL_SIZE*y,
CELL_SIZE*x+CELL_SIZE, CELL_SIZE*y+CELL_SIZE,
fill="#000000",outline="#000000", width=1)
for x in range(nCols)] for y in range(nRows)]
and in drawbox:
canvas.itemconfig(rectangles[y][x], fill=color)
Problem
The following python program creates a Tkinter `Canvas` object and draws random matrix on it. It also measures the time it takes to make 10 subsequent updates. As you may see from the output below, this time grows continiously and substantially during the course of the program. What is the reason for this behavior and how can I fix it? ``` from Tkinter import Tk, Canvas import time import numpy as np window = Tk() nRows = 30 nCols = 30 CELL_SIZE = 10 canvas = Canvas(window, width=CELL_SIZE*nRows, height=CELL_SIZE*nCols) canvas.pack() def drawbox(m): for y in range(nRows): for x in range(nCols): if m[y][x]: color = '#00FF00' else: color = '#000000' canvas.create_rectangle(CELL_SIZE*x, CELL_SIZE*y, CELL_SIZE*x+CELL_SIZE, CELL_SIZE*y+CELL_SIZE, fill=color, outline="#000000", width=1) count = 0 timeStart = time.time() while(True): board = np.random.rand(nRows, nCols) > 0.5 if count % 10 == 0: print '%.1f seconds'%(time.time() - timeStart) timeStart = time.time() count = 0 count += 1 drawbox(board) canvas.after(5) canvas.update() ``` Here is the output ``` 0.0 seconds 1.7 seconds 4.1 seconds 6.3 seconds 8.7 seconds ```