D
David Bailey
How do I get the same (x,y) coordinate for a given relative location in
the Ruby/tk application regardless of which widget I'm clicking on?
Background:
This has to do with a sudoku program I'm writing wherein I use the (x,y)
coordinates from mouse clicks to determine which sudoku cell I am in.
The cells are TkcRectangles and the numbers in (actually 'on') them are
TkLabels. Note that both the TkcRectangles and the TkLabels have the
same TkCanvas as their parent widget.
When I click in a cell (TkcRectangle) with no number (TkLabel) displayed
within it, I get an (x,y) coordinate relative to the canvas (TkCanvas),
but
when I click in the same rectangle after I display a number within it
(placed
over the TkcRectangle as a TkLabel) - and I click on that number, then
the (x,y) coordinate reported back to me is relative to the TkLabel's
origin, not the TkCanvas'.
This breaks my cell lookup scheme!
Again, since both the rectangles and labels have the canvas a parent, I
don't
see why the (x,y) coordinates shouldn't be relative to the canvas in
both
cases. That is what I want anyway. Is there a way to make this this
happen?
Does Ruby/Tk implement Tk's Virtual Desktop Coordinates (vrootx and
vrooty) that give coordinates relative to the virtual desktop?
Or does Ruby/Tk implement accessing the rootx and rooty coordinates
which would be the same regardless of which widget is under the mouse
click?
Or can I use a 'lower' method on the the TkLabel widget to put it below
the
TkcRectangles (without, of course, covering it up)?
Alas, and alack, I've browsed around the docs quite a bit. I also tried
a bunch
of stuff, but I just keep breaking the code that I had running fine!
I'm stuck!!!
The relevant code is straightforward.
I’ve got a root and a canvas:
@root = TkRoot.new
title=>"David's Sudoku Treasury",
:geometry=>"650x650")
@canvas = TkCanvas.new(@root, :width=> @canvasWidth, :height=>
@canvasHeight)
A callback proc bind'ed to the mouse button:
@root.bind('Button', proc{|b,x,y| mainCellClickedProc(b, x, y)}, \
"%b %x %y")
A method that is called inside of the bind callback proc to report the
button clicked and the (x,y) coordinate of the clicked location:
def tell_it(btn, x, y)
puts "tell_it: Mouse button #{btn} clicked at coordinates
(#{x},#{y})"
end
A set of 81 rectangles:
def createAndDrawCells()
# Sizing and Location Variables
@cellSize = 40 if @cellSize == 0 # Cell size
@xr1c1 = 10 if @xr1c1 == 0 # Cell R1C1 X Upper Left Position
@yr1c1 = 10 if @yr1c1 == 0 # Cell R1C1 Y Upper Left Position
@color = @bgColor
# Cell Rows
9.times do |i|
xul = @xr1c1
yul = @yr1c1 + (i * @cellSize)
xlr = xul + @cellSize
ylr = yul + @cellSize
# Cell Columns
9.times do |j|
@boardRects [ (i * 9) + j ] = TkcRectangle.new(@canvas, xul,
yul, xlr, ylr, \
:fill=>@color)
xul = xul + @cellSize
xlr = xlr + @cellSize
end
end
end
A set of 81 labels:
def createEntryNumberLabels()
81.times do |i|
@entryNumberLabels = TkLabel.new(@canvas)
end
end
the Ruby/tk application regardless of which widget I'm clicking on?
Background:
This has to do with a sudoku program I'm writing wherein I use the (x,y)
coordinates from mouse clicks to determine which sudoku cell I am in.
The cells are TkcRectangles and the numbers in (actually 'on') them are
TkLabels. Note that both the TkcRectangles and the TkLabels have the
same TkCanvas as their parent widget.
When I click in a cell (TkcRectangle) with no number (TkLabel) displayed
within it, I get an (x,y) coordinate relative to the canvas (TkCanvas),
but
when I click in the same rectangle after I display a number within it
(placed
over the TkcRectangle as a TkLabel) - and I click on that number, then
the (x,y) coordinate reported back to me is relative to the TkLabel's
origin, not the TkCanvas'.
This breaks my cell lookup scheme!
Again, since both the rectangles and labels have the canvas a parent, I
don't
see why the (x,y) coordinates shouldn't be relative to the canvas in
both
cases. That is what I want anyway. Is there a way to make this this
happen?
Does Ruby/Tk implement Tk's Virtual Desktop Coordinates (vrootx and
vrooty) that give coordinates relative to the virtual desktop?
Or does Ruby/Tk implement accessing the rootx and rooty coordinates
which would be the same regardless of which widget is under the mouse
click?
Or can I use a 'lower' method on the the TkLabel widget to put it below
the
TkcRectangles (without, of course, covering it up)?
Alas, and alack, I've browsed around the docs quite a bit. I also tried
a bunch
of stuff, but I just keep breaking the code that I had running fine!
I'm stuck!!!
The relevant code is straightforward.
I’ve got a root and a canvas:
@root = TkRoot.new
:geometry=>"650x650")
@canvas = TkCanvas.new(@root, :width=> @canvasWidth, :height=>
@canvasHeight)
A callback proc bind'ed to the mouse button:
@root.bind('Button', proc{|b,x,y| mainCellClickedProc(b, x, y)}, \
"%b %x %y")
A method that is called inside of the bind callback proc to report the
button clicked and the (x,y) coordinate of the clicked location:
def tell_it(btn, x, y)
puts "tell_it: Mouse button #{btn} clicked at coordinates
(#{x},#{y})"
end
A set of 81 rectangles:
def createAndDrawCells()
# Sizing and Location Variables
@cellSize = 40 if @cellSize == 0 # Cell size
@xr1c1 = 10 if @xr1c1 == 0 # Cell R1C1 X Upper Left Position
@yr1c1 = 10 if @yr1c1 == 0 # Cell R1C1 Y Upper Left Position
@color = @bgColor
# Cell Rows
9.times do |i|
xul = @xr1c1
yul = @yr1c1 + (i * @cellSize)
xlr = xul + @cellSize
ylr = yul + @cellSize
# Cell Columns
9.times do |j|
@boardRects [ (i * 9) + j ] = TkcRectangle.new(@canvas, xul,
yul, xlr, ylr, \
:fill=>@color)
xul = xul + @cellSize
xlr = xlr + @cellSize
end
end
end
A set of 81 labels:
def createEntryNumberLabels()
81.times do |i|
@entryNumberLabels = TkLabel.new(@canvas)
end
end