我知道这不是 tk 特有的,而是 ruby DSL 和 instance_eval 的一个更普遍的问题,但这是我的问题,如果我想将 DSL 用于 tk,我不知道如何使某些事情起作用。例如,如果我想通过按下按钮来调用实例方法,这将不起作用,因为它认为我正在尝试在 Tk 父类(即 Tk::Button)中调用具有相同名称的方法,如下面的代码:
require 'tk'
class MyApp
def initialize
@root = TkRoot.new
TkFrame.new {|f|
TkButton.new(f) {
text "Press Me"
command proc {do_something()}
pack
}
pack
}
end
def do_something
puts "Hello!"
end
def run
Tk.mainloop
end
end
MyApp.new.run
如果我不使用 DSL 重写它,我可以避免这个问题,但出于各种原因,我更喜欢 DSL:
class MyApp
def initialize
@root = TkRoot.new
f = TkFrame.new
TkButton.new(f, text: "Press Me", command: proc {do_something()}).pack
f.pack
end
def do_something
puts "Hello!"
end
def run
Tk.mainloop
end
end
MyApp.new.run
MyApp 类的实例变量也是如此。有什么办法解决这个问题吗?