2014-02-07 1 views
0

У меня есть рубиновая программа, в которой используется пакет TK gui, и у меня возникают проблемы с TkButton, в частности с частью команды. Я пытаюсь запустить метод, который находится в том же классе, когда нажимается кнопка. Мой код ниже. Я очень новичок в Ruby, но не в программировании вообще. Когда кнопка нажата в gui, я получаю сообщение об ошибке «Error: NameError: unknown option ...», где он идентифицирует вызов метода в кнопке в качестве причины ошибки. Может кто-нибудь объяснить, что я делаю неправильно? Я использую RubyMine для разработки.Ruby TkButton не запускает proc

Код:

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. Благодарю.

ответ

0

Вы определили метод экземпляра на классе под названием test_add, но в том контексте, в котором ваши кнопки «Добавить» определяется, self относится к классу CalcUIK.Edit - теперь, когда я думаю об этом, я думаю, так как self происходит в блоке заданного для TkButton.new, self относится к новому экземпляру TkButton, который пытается получить метод test_add, но не признает его в качестве действительный вариант. Определите proc как proc { CalcUIK.new.test_add }, чтобы сгенерировать новый экземпляр, который будет запускать этот метод.

Я также рекомендовал бы двигаться все TkRoot, TkButton и т.д. вызывает либо вне класса полностью или переместить их в initialize метод на CalcUIK. Прямо сейчас они запускаются по мере оценки класса, но очень необычно иметь код, который не связан с классом, выполняемым в контексте определения класса.