Hmmm... There are some problems.

From: "Jeppe Jakobsen" <jeppe88 / gmail.com>
Subject: Re: Q about tk buttons
Date: Thu, 13 Apr 2006 22:33:18 +0900
Message-ID: <99b4ad3b0604130633t48adb432n4417c3fd27f3b8f4 / mail.gmail.com>

> require "tk"
> #methods
> def guess
>     if (guess.value == right_guess.value)
>         status.value = "Correct!"
>     else
>         number_of_guess.numeric += 1
>         status.value = "Sorry, no luck"
>     end
> end

Probably, you'll want to refer local variables on main. 
But those variables are out of scope in the method.
If arguments bothers you, you can use a Proc object instead of a method.

Next, please see here.

> def guess
      ^^^^^
> guess = TkVariable.new()
  ^^^^^

There is conflict of names.
So, "proc{guess}" refers the local variable.
If you want to call "guess" method, you must use "proc{guess()}".

> root = Tk.mainloop

Probably, the return value is not useful.

If I were you, I may write such like as the following.
----------------------------------------------------
require 'tk'

right_guess = rand(21)
number_of_guess = TkVariable.new(0)

Tk.root.title('Number guess')

TkLabel.new(:textvariable=>number_of_guess).pack(:side=>:top,
:pady=>10)

status = TkLabel.new(:text=>"Entry your guess and press the button",
                     :width=>37).pack(:side=>:bottom, :pady=>10)

entry = TkEntry.new.pack(:side=>:top, :pady=>10)

guess_cmd = proc{
  value = entry.value
  if value.empty? || value.to_i != right_guess
    number_of_guess.numeric += 1
    status.text('Sorry, no luck')
  else
    status.text('Correct!')
  end
}

button = TkButton.new(:text=>'Guess',
:command=>guess_cmd).pack(:side=>:top, :p\ady=>10)

entry.bind('Return', proc{button.invoke})

Tk.mainloop
----------------------------------------------------
-- 
Hidetoshi NAGAI (nagai / ai.kyutech.ac.jp)