Hi, 

From: MENON Jean-Francois <Jean-Francois.MENON / meteo.fr>
Subject: tk question and tk solution
Date: Thu, 20 Jun 2002 00:33:33 +0900
Message-ID: <3D10A43F.B9A3325B / meteo.fr>
> - the question: 
> I don't remember how to change (or hide) the mouse cursor with tk. (and
> what other cursors I can use)
> 
> - the solution:
> 
> in a recent question about tix balloons, I had an answer that works
> well, if there is tk-ext installed on my host.(thx Mr Nagai)
> But  I realise that I could do the same with pure tk code, wich is more
> portable. 
> So I send you an example code in the hope it could be useful for someone

How about the following BalloonHelp class? 
It's a part of a sample script which I wrote for a book 
"Ruby Application Programming". 
(http://www.amazon.co.jp/exec/obidos/ASIN/4274064611/qid=1024543390/sr=1-1/ref=sr_1_2_1/250-8255844-6093833)
A test script of BalloonHelp class is 

===================================================
require 'tkballoonhelp'
b = TkButton.new(nil, 'text'=>'QUIT', 'command'=>proc{exit}).pack
h = BalloonHelp.new(b, 'text'=>'exit this script', 'interval'=>250)
Tk.mainloop
===================================================

Move the mouse cursor to the 'QUIT' button, 
and wait 250ms without moving the mouse. 
Then the mouse cursor will be changed to 'crosshair' and 
the balloonhelp message 'exit this script' will be displayed. 
It is a subclass of TkLabel. 
So, a BalloonHelp object has the same properties as a TkLabel object
('foreground', 'background', and so on). 

Here is tkballoonhelp.rb. 
The original script has some Japanese comments. 
But I remove them for this ML. Sorry.

# You can get this and some other sample scripts 
# from the suppliment CD-ROM of "Ruby Application Programming". :-)

===================================================
#
# tkballoonhelp.rb : 
#                       2000/05/01  Hidetoshi NAGAI (nagai / ai.kyutech.ac.jp)
#
require 'tk'

class BalloonHelp<TkLabel
  def _balloon_binding(interval)
    @timer = TkAfter.new(interval, 1, proc{show})
    @bindtag = TkBindTag.new
    @bindtag.bind('Enter',  proc{@timer.start})
    @bindtag.bind('Motion', proc{@timer.restart; erase})
    @bindtag.bind('Any-ButtonPress', proc{@timer.restart; erase})
    @bindtag.bind('Leave',  proc{@timer.stop; erase})
    tags = @parent.bindtags
    idx = tags.index(@parent)
    tags[idx,0] = @bindtag
    @parent.bindtags(tags)
  end
  private :_balloon_binding

  def initialize(parent=nil, keys=nil)
    @parent = parent

    @frame = TkToplevel.new(@parent)
    @frame.withdraw
    @frame.overrideredirect(true)
    @frame.transient(TkWinfo.toplevel(@parent))
    @epath = @frame.path 

    @message = keys['text']

    interval = keys.delete('interval'){2000}
    _balloon_binding(interval)

    @label = TkLabel.new(@frame, 'background'=>'yellow').pack
    @label.configure(keys) if keys
    @path = @label
  end

  def epath
    @epath
  end

  def message
    @message
  end

  def show
    x = TkWinfo.pointerx(@parent)
    y = TkWinfo.pointery(@parent)
    @label.text(message)
    @frame.geometry("+#{x+1}+#{y+1}")
    @frame.deiconify
    @frame.raise

    @org_cursor = @parent['cursor']
    @parent.cursor('crosshair') 
  end

  def erase
    @parent.cursor(@org_cursor) 
    @frame.withdraw
  end

  def destroy
    @frame.destroy
  end
end
===================================================
-- 
                                  Hidetoshi NAGAI (nagai / ai.kyutech.ac.jp)