Ruby TkButton不会运行proc

时间:2014-02-07 19:53:39

标签: ruby tk rubymine

我有一个使用TK gui包的ruby程序,我遇到了TkButton的问题,特别是命令部分。我试图在单击按钮时运行同一类中的方法。我的代码如下。我是Ruby的新手,但不是一般的编程。当在gui中单击该按钮时,我得到一个应用程序错误,该错误显示“Error:NameError:unknown option ...”,其中它将按钮中的方法调用标识为错误原因。谁能解释我做错了什么?我正在使用RubyMine开发。

代码:

    require 'tk'
    require 'test/unit'
    require_relative 'calc'
    require_relative 'calcTest'

    class CalcUIK


      def test_add
        calc = Calc.new
        expected = Calc.add tk6.get().to_i,tk6.get().to_i
        tk8['textvariable'] = 'Result: ' + expected
      end

      hello = TkRoot.new do
        title "Hello World"
        # the min size of window
        minsize(400,400)
      end
      tk1 = TkLabel.new(hello) do
        text 'Super Calculator'
        foreground 'red'
        pack { padx 15; pady 15; side 'left'}
      end

      tk5 = TkLabel.new(hello) do
        text 'Enter two numbers to math'
        foreground 'blue'
        pack { padx 15; pady 15; side 'left'}
      end

      tk6 = TkEntry.new(hello) do
        foreground 'blue'
        pack { padx 15; pady 15; side 'left'}
      end

      tk7 = TkEntry.new(hello) do
        foreground 'blue'
        pack { padx 15; pady 15; side 'left'}
      end

      tk8 = TkLabel.new(hello) do
        textvariable
        foreground 'blue'
        pack { padx 15; pady 15; side 'left'}
      end

      tk2 = TkButton.new(hello){
        text 'Add'
        command (proc {self.test_add})
        pack('padx'=>'20')
        pack('side'=>'left')
      }
    end
       Tk.mainloop

PS我知道这段代码有点笨,但它只是一个虚拟程序来设置一些更重要的东西。我需要解决的问题是按钮单击不执行test_add方法的原因。感谢。

1 个答案:

答案 0 :(得分:0)

您已在类test_add上定义了一个实例方法,但在定义“添加”按钮的上下文中,self引用了类CalcUIK }。 编辑 - 现在我想到了,我认为,因为self发生在TkButton.new的一个区块内,self指的是TkButton的新实例,它尝试接收test_add方法,但不将其识别为有效选项。将proc定义为proc { CalcUIK.new.test_add }以生成将运行该方法的新实例。

我还建议完全移出课堂外的所有TkRootTkButton等来电,或者将它们移到initialize上的CalcUIK方法中。现在,它们在类被评估时运行,但是在类定义的上下文中执行的类与代码无关是非常罕见的。