Ruby + Tk command binding - scope issue?

耗尽温柔 提交于 2019-12-01 06:19:43

If you put a

p self

into the do ... end block of your code, then you'll probably find out that the current scope is different than your Foo object.

Usually, passing blocks to Tk constructors is unnecessary. The resulting scope is confusing, so I think it should be discouraged.

Examples of same which contain only literal values are inflexible, and teach a bad habit.

Here, a minimal change to your program makes it work, while maintaining readability:

require 'tk'
class Foo
  def my_fancy_function
    puts "hello, world!"
  end

  def initialize
    @root = TkRoot.new{title "Hello, world!"}
    frame = TkFrame.new
    my_fancy_button = begin
      b = TkButton.new frame
      b.text "Press meee"
      b.command {my_fancy_function}
      b.pack
    end
    frame.pack
    Tk.mainloop
  end
end

bar = Foo.new

It works for me using Ruby 2.2.5 (with Tk 8.5.12) on Windows 7.

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!