# Ruby tk drawing a line

**URL:** <https://rubytalk.org/t/ruby-tk-drawing-a-line/41332>\
**Category:** ruby-talk\
**Created:** [12 October 2007 03:50 UTC](https://rubytalk.org/t/ruby-tk-drawing-a-line/41332 "2007-10-12T03:50:10Z")\
**Posts on this page:** 3\
**Page:** 1

<div class="post-metadata">

**Author:** ![Ed\_Redman1](https://avatars.discourse-cdn.com/v4/letter/e/ecae2f/32.png) [@Ed\_Redman1](https://rubytalk.org/u/Ed_Redman1)\
**Post date:** [12 October 2007 03:50 UTC](https://rubytalk.org/t/ruby-tk-drawing-a-line/41332/1 "2007-10-12T03:50:10Z")

</div>

I have a question concerning ruby/tk and drawing lines on a canvas.  
I tried to convert from a tcl program.  
Everything works fine except that the line when its thickness is large  
appears to be a series of short line segments rather than a solid line.

I have binded the "1" mouse button to start the line with the following

canvas.bind( '1', proc { |e|  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$startx = e.x  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$starty = e.y  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;})

and the motion of the mouse

canvas.bind('B1-Motion', proc { |e|  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$endx = e.x  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$endy = e.y  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$a = TkcLine.new(canvas, $startx, $starty, $endx, $endy)  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$a.width option.value  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$a.fill "#{color}"  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;})

Can anyone see why this does not give me a solid line

> **···**
>
> --  
> Ed Redman  
> [redman@accesswave.ca](mailto:redman@accesswave.ca)

---

<div class="post-metadata">

**Author:** ![Joel\_VanderWerf1](https://avatars.discourse-cdn.com/v4/letter/j/94ad74/32.png) [@Joel\_VanderWerf1](https://rubytalk.org/u/Joel_VanderWerf1)\
**Post date:** [12 October 2007 04:31 UTC](https://rubytalk.org/t/ruby-tk-drawing-a-line/41332/2 "2007-10-12T04:31:32Z")

</div>

Ed Redman wrote:

> I have a question concerning ruby/tk and drawing lines on a canvas.  
> I tried to convert from a tcl program. Everything works fine except that the line when its thickness is large appears to be a series of short line segments rather than a solid line.
> 
> I have binded the "1" mouse button to start the line with the following
> 
> canvas.bind( '1', proc { |e|  
> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$startx = e.x  
> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$starty = e.y  
> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;})
> 
> and the motion of the mouse
> 
> canvas.bind('B1-Motion', proc { |e| $endx = e.x  
> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$endy = e.y  
> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$a = TkcLine.new(canvas, $startx, $starty, $endx, $endy)  
> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$a.width option.value  
> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$a.fill "#{color}"  
> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;})
> 
> Can anyone see why this does not give me a solid line

Does the same thing happen without the fill param?

A TkcLine has a "dash" parameter, and that might be causing this. But it would be surprising if the default is a dashed line. Anyway, you could try

&nbsp;&nbsp;&nbsp;$a.dash ""

or

&nbsp;&nbsp;&nbsp;$a.dash nil

See

&nbsp;&nbsp;&nbsp;[Tk Built-In Commands - canvas manual page](http://www.tcl.tk/man/tcl8.4/TkCmd/canvas.htm#M27)

for details.

> **···**
>
> --  
> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vjoel : Joel VanderWerf : path berkeley edu : 510 665 3407

---

<div class="post-metadata">

**Author:** ![Hidetoshi\_NAGAI](https://avatars.discourse-cdn.com/v4/letter/h/49beb7/32.png) [@Hidetoshi\_NAGAI](https://rubytalk.org/u/Hidetoshi_NAGAI)\
**Post date:** [12 October 2007 04:42 UTC](https://rubytalk.org/t/ruby-tk-drawing-a-line/41332/3 "2007-10-12T04:42:49Z")

</div>

Message-ID: \<k7CPi.10981$G25.2545@edtnps89\>

> canvas.bind('B1-Motion', proc { |e|  
> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$endx = e.x  
> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$endy = e.y  
> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  
> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$a = TkcLine.new(canvas, $startx, $starty, $endx, $endy)

You write so many new lines at here.  
Each short line is made at each 'B1-Motion' callback.

The following may be an example which you want.

> **···**
>
> From: Ed Redman \<redman@accesswave.ca\>  
> Subject: ruby tk drawing a line  
> Date: Fri, 12 Oct 2007 12:50:10 +0900  
> -----------------------------------------------------------------  
> require 'tk'
> 
> line = nil  
> first = nil  
> last = nil
> 
> canvas = TkCanvas.new(:relief=\>:ridge, :borderwidth=\>3).pack
> 
> f = TkFrame.new.pack(:fill=\>:x)
> 
> color = 'black'  
> TkButton.new(f, :text=\>'color', :command=\>proc{  
> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;color = Tk.chooseColor(:initialcolor=\>color)  
> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}).pack(:side=\>:right, :padx=\>[10,3])
> 
> option = TkSpinbox.new(f, :from=\>1, :to=\>1000,  
> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:width=\>4).pack(:side=\>:right, :padx=\>0)  
> TkLabel.new(f, :text=\>'width').pack(:side=\>:right, :padx=\>[10,0])
> 
> canvas.bind('1', '%x', '%y'){|\*first|  
> &nbsp;&nbsp;line = TkcLine.new(canvas, first, first,  
> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:width=\>option.value, :fill=\>color)  
> }
> 
> canvas.bind('B1-Motion', '%x', '%y'){|\*last| line.coords(first, last)}
> 
> Tk.mainloop  
> -----------------------------------------------------------------
> 
> Ruby/Tk accepts all of the following coords pattern for a canvas item.
> 
> (1) x1, y1, x2, y2, x3, y3, ...
> 
> (2) [x1, y1], [x2, y2], [x3, y3], ...
> 
> (3) [[x1, y1], [x2, y2], [x3, y3], ... ]
> 
> In my example, I use the pattern (2).  
> --  
> Hidetoshi NAGAI (nagai@ai.kyutech.ac.jp)
