title: tkinter is very slow - how to speed it up or use a different library?
body: <p>I am generating 2D morphogenic plots using tkinter. I find it incredibly slow. For example, this script takes almost 10 seconds on my 8-core Xeon:</p>
  
  <pre><code>#!/usr/bin/env python3
  
  import random
  import tkinter as tk
  
  A = 3.419384662527591
  B = 2.0158889752347022
  C = 19.479697084985673
  D = 61.006212908774614
  F = 1.3449991745874286
  G = 1.9590223710983992
  H = 5.129501734860241
  WIDTH = 800
  HEIGHT = 600
  
  
  class Morphogenic(tk.Frame):
  
      def __init__(self, root):
          tk.Frame.__init__(self, root)
          self.canvas = tk.Canvas(width=WIDTH, height=HEIGHT, borderwidth=1)
          self.canvas.pack(side="top", fill="both", expand=True)
  
      def rand(self):
          A = 3 + random.random() * 10
          B = 1 + random.random() * 5
          C = 1 + random.random() * 20
          D = 1 + random.random() * 200
          F = 1 + random.random() * 2
          G = 1 + random.random() * 20
          H = 1 + random.random() * 20
  
      def draw(self):
          points = [0] * HEIGHT
          points_space = [0] * HEIGHT
          points_energy = [0] * HEIGHT
          w = WIDTH
          h = HEIGHT
          min_x = 0
  
          last_x = 0
          last_y = 0
  
          while min_x &lt; w:
              min_x = w
              lrand = 0
  
              for y in range(1, h):
                  points_space[y] = points_space[y] + \
                      (points_space[y - 1] - points_space[y]) / F
  
              for y in range(0, h):
                  lrand = lrand + (random.random() - 0.5) / C
                  new_point = points[y] + points_space[y] + lrand
                  points_space[y] = (new_point - points[y]) + \
                      points_energy[y] / G
                  points_space[y] = points_space[y] + (A - points_space[y]) / D
                  points_energy[y] = points_energy[y] / H
  
                  if (points_space[y] &lt; B):
                      points_energy[y] = points_space[y] - B
                      points_space[y] = B
  
                  points[y] = points[y] + points_space[y]
  
                  if (min_x &gt; points[y]):
                      min_x = points[y]
  
                  self.canvas.create_line(last_x, last_y, points[y], y)
                  last_x = points[y]
                  last_y = y
  
  
  if __name__ == "__main__":
      root = tk.Tk()
      m = Morphogenic(root)
      m.pack(fill="both", expand=True)
      m.rand()
      m.draw()
      root.mainloop()
  </code></pre>
  
  <p>Is tkinter just too weak for this kind of work? Should I be looking at a different 2D library?</p>