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
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
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
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
- 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
- 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
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
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