You could try "%X %Y" to get coordinates relative to the top left corner of the program. There is also a "%W" that might be useful. If I remember correctly, it returns the id of the widget the mouse clicked, but it might return the reference. > David Bailey wrote: >> >> >> 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[i] = TkLabel.new(@canvas) >> end >> end > > And the method to write the numbers (TkLabels) is: > > def writeEntryNumber(num, x, y, fgCol, bgCol) > if @cellValues[calcCellFromXYCoords(x,y)] == nil > entryNumText = " " > else > entryNumText = num.to_s > end > @entryNumberLabels[calcCellFromXYCoords(x, y)].configure( > :text=> entryNumText, > :font=> 'arial 16 bold', > :foreground=> fgCol, > :background=> bgCol > ).place( > :x=>x + 15, > :y=>y + 25, > :width=>20, > :height=>20 > ) > end > > > -- > Posted via http://www.ruby-forum.com/. > >