これでいいんじゃ?

require 'tk'
num = 0
while num < 3
 TkButton.new {
  text 'button'
num2 = num
  command { p num2 }
 }.pack
 num += 1
end
Tk.mainloop


つうか
>numのスコープの問題
というRubyのスコープに問題があるかのような書き方すな。
他の言語でも大抵同じ動作だ。