Re: Lines on a tkinter.Canvas

2014-06-12 Thread Peter Otten
Pedro Izecksohn wrote:

 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. How should I do this? Canvas has
 no method create_pixel or create_point.

 #!/usr/bin/python3
 
 import tkinter as tk
 
 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)
   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):
 self.canvas.create_line (p.x, p.y, p.x, p.y, fill = color)
 
 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()

I just tried your script, and over here the line drawn with

   def drawLine (self, pa, pb, color):
 self.canvas.create_line (pa.x, pa.y, pb.x, pb.y, fill = color)

has a width of 1 pixel and does not include the end point. Therefore the 
line drawn with

   def drawPoint (self, p, color):
 self.canvas.create_line (p.x, p.y, p.x, p.y, fill = color)

does not show up at all. You could try to specify the line width explicitly:

   def drawPoint (self, p, color):
 self.canvas.create_line (p.x, p.y, p.x+1, p.y, fill=color, width=1)

If that doesn't work (or there's too much overhead) use pillow to prepare an 
image and show that.

Another random idea: if you have a high resolution display your OS might 
blow up everything. In that case there would be no fix on the application 
level.

-- 
https://mail.python.org/mailman/listinfo/python-list


Re: Lines on a tkinter.Canvas

2014-06-12 Thread Gregory Ewing

Pedro Izecksohn wrote:

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.

--
Greg
--
https://mail.python.org/mailman/listinfo/python-list


Re: Lines on a tkinter.Canvas

2014-06-12 Thread Terry Reedy

On 6/12/2014 7:38 AM, Gregory Ewing wrote:

Pedro Izecksohn wrote:

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.


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



In that case, you might want to use a different approach,
such as creating an image and telling the canvas to display
the image.


--
Terry Jan Reedy

--
https://mail.python.org/mailman/listinfo/python-list


Re: Lines on a tkinter.Canvas

2014-06-12 Thread Pedro Izecksohn
  As Peter Otten did not see the same result that I saw, I prepared an image 
that shows the result on my notebook:
http://izecksohn.com/pedro/python/canvas/tk_window.xcf
  For those that might not know: xcf is the Gimp's file format.


- Original Message -
 From: Peter Otten
 To: python-list@python.org
 Sent: Thursday, June 12, 2014 4:02 AM
 Subject: Re: Lines on a tkinter.Canvas
 
 Pedro Izecksohn wrote:
 
  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. How should I do this? Canvas has
  no method create_pixel or create_point.
 
  #!/usr/bin/python3
 
  import tkinter as tk
 
  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)
    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):
      self.canvas.create_line (p.x, p.y, p.x, p.y, fill = color)
 
  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()
 
 I just tried your script, and over here the line drawn with
 
    def drawLine (self, pa, pb, color):
      self.canvas.create_line (pa.x, pa.y, pb.x, pb.y, fill = color)
 
 has a width of 1 pixel and does not include the end point. Therefore the 
 line drawn with
 
    def drawPoint (self, p, color):
      self.canvas.create_line (p.x, p.y, p.x, p.y, fill = color)
 
 does not show up at all. You could try to specify the line width explicitly:
 
    def drawPoint (self, p, color):
      self.canvas.create_line (p.x, p.y, p.x+1, p.y, fill=color, width=1)
 
 If that doesn't work (or there's too much overhead) use pillow to 
 prepare an 
 image and show that.
 
 Another random idea: if you have a high resolution display your OS might 
 blow up everything. In that case there would be no fix on the application 
 level.
 
-- 
https://mail.python.org/mailman/listinfo/python-list


Re: Lines on a tkinter.Canvas

2014-06-12 Thread Pedro Izecksohn
- Original Message -

 From: Gregory Ewing
 To: python-list@python.org
 Sent: Thursday, June 12, 2014 8:38 AM
 Subject: Re: Lines on a tkinter.Canvas
 
 Pedro Izecksohn wrote:
  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.

pedro@microboard:~/programming/python/tk/canvas$ diff old/testing.001.py 
testing.py
19c19
 self.canvas.create_line (p.x, p.y, p.x, p.y, fill = color)
---
 self.canvas.create_rectangle (p.x, p.y, p.x, p.y, fill = color)

  The result that I got is: The line drawn by it is not shown.

 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.

  I did not try this yet.
-- 
https://mail.python.org/mailman/listinfo/python-list


Re: Lines on a tkinter.Canvas

2014-06-12 Thread Pedro Izecksohn
- Original Message -

 From: Gregory Ewing
 To: python-list@python.org
 Cc: 
 Sent: Thursday, June 12, 2014 8:38 AM
 Subject: Re: Lines on a tkinter.Canvas
 
 Pedro Izecksohn wrote:
  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.

  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()
-- 
https://mail.python.org/mailman/listinfo/python-list


Re: Lines on a tkinter.Canvas

2014-06-12 Thread Gregory Ewing

Pedro Izecksohn wrote:

  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.

--
Greg
--
https://mail.python.org/mailman/listinfo/python-list


Lines on a tkinter.Canvas

2014-06-11 Thread 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. How should I do this? Canvas has no method 
create_pixel or create_point.
-- 
https://mail.python.org/mailman/listinfo/python-list