Lines on a tkinter.Canvas

Pedro Izecksohn izecksohn at yahoo.com
Thu Jun 12 16:17:48 EDT 2014


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



More information about the Python-list mailing list