Lines on a tkinter.Canvas

P

Pedro Izecksohn

  The code available from:
http://izecksohn.com/pedro/python/canvas/testing.py
  draws 2 horizontal lines on a Canvas. Why the 2 lines differ on thickness and length?

  The Canvas' method create_line turns on at least 2 pixels. But I want to turn on many single pixels on a Canvas. Howshould I do this? Canvas has no method create_pixel or create_point.
 
G

Gregory Ewing

Pedro said:
The Canvas' method create_line turns on at least 2 pixels. But I want to turn
on many single pixels on a Canvas.

You could try using a 1x1 rectangle instead.

However, be aware that either of these will use quite a
lot of memory per pixel. If you are drawing a very large
number of pixels, this could cause performance problems.
In that case, you might want to use a different approach,
such as creating an image and telling the canvas to display
the image.
 
T

Terry Reedy

You could try using a 1x1 rectangle instead.

However, be aware that either of these will use quite a
lot of memory per pixel. If you are drawing a very large
number of pixels, this could cause performance problems.

Pedro, the tkinter canvas is a vector graphics canvas, not a bitmap
image canvas as in paint programs.
 
P

Pedro Izecksohn

----- Original Message -----
From: Gregory Ewing
To: (e-mail address removed)
Cc:
Sent: Thursday, June 12, 2014 8:38 AM
Subject:Re: Lines on a tkinter.Canvas



You could try using a 1x1 rectangle instead.

However, be aware that either of these will use quite a
lot of memory per pixel. If you are drawing a very large
number of pixels, this could cause performance problems.
In that case, you might want to use a different approach,
such as creating an imageand telling the canvas to display
the image.

  Thank you Greg. Your second approach works and the script became:

#!/usr/bin/python3

import tkinter as tk

BITMAP = '''
#define im_width 1
#define im_height 1
static char im_bits[] = {
0xff
};
'''

class Point ():
  def __init__ (self, x, y):
    self.x = x
    self.y = y

class Board (tk.Frame):
  def __init__ (self, bg,dimensions):
    tk.Frame.__init__ (self, tk.Tk())
    self.pack()
    self.canvas = tk.Canvas (self, bd = 0, bg = bg, width = dimensions.x, height = dimensions.y)
    self.canvas.pack (side = "top")
    self.objects_drawn = []
  def drawLine (self, pa, pb, color):
    self.canvas.create_line (pa.x, pa.y, pb.x, pb.y, fill = color)
  def drawPoint (self, p, color):
    bitmap = tk.BitmapImage (data=BITMAP, foreground = color)
    self.objects_drawn.append (bitmap)
    self.canvas.create_image (p.x, p.y, image = bitmap)

dimensions = Point (500, 500)
board = Board ('black', dimensions)
color = 'red'
p = Point (0, 250)
while (p.x < dimensions.x):
  board.drawPoint (p, color)
  p.x += 1
pa = Point (0, 350)
pb = Point (499, 350)
board.drawLine (pa, pb, color)
board.mainloop()
 
G

Gregory Ewing

Pedro said:
Thank you Greg. Your second approach works and the script became:

That's not really what I meant; doing it that way,
you're still incurring the overhead of a tk canvas
object for each point that you draw. However, if
there are only 250 points or so, it might not matter.
 

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

No members online now.

Forum statistics

Threads
473,755
Messages
2,569,536
Members
45,007
Latest member
obedient dusk

Latest Threads

Top