ruby - 你如何在 Ruby/Tk 中制作箭头键事件处理程序

标签 ruby event-handling tk-toolkit

在 Ruby/Tk 中,我目前正在制作一个长度转换器,但我希望能够允许用户按向上或向下箭头键,它将增加或减少用户输入到输入框中的数字.

require "tk"
require "tkextlib/tile"


root = TkRoot.new {title "Length converter"}
content = Tk::Tile::Frame.new(root){padding "50 15 50 15"}.grid


$input_variable = TkVariable.new
$output_variable = TkVariable.new
input_frame = Tk::Tile::Labelframe.new(content) {text 'Input'; borderwidth 5; relief "sunken"; width 300; height 200; padding "5 0 5 5"}
output_frame = Tk::Tile::Labelframe.new(content) {text 'Conversion'; borderwidth 5; relief "sunken"; width 300; height 200; padding "5 0 5 5"}
go_button = Tk::Tile::Button.new(content) {text 'Calculate'command {func1}}
input_box = Tk::Tile::Entry.new(content) {width 10; textvariable $input_variable}
output_text = Tk::Tile::Label.new(content) {textvariable $output_variablefont TkFont.new('sans 12')}
underbutton_text = Tk::Tile::Label.new(content) {text 'is equivalent to'}
unit_label = Tk::Tile::Label.new(content) {textvariable $unitfont TkFont.new('sans 12')}

$input_dom = TkVariable.new
$unit = TkVariable.new
feet = Tk::Tile::RadioButton.new(input_frame){
    text 'Feet' 
    variable $input_dom 
    value 1
    pack('fill'=>'x')

}
meters = Tk::Tile::RadioButton.new(input_frame){
    text 'Meters'
    variable $input_dom
    value 2
    pack('fill'=>'x')
}
inches = Tk::Tile::RadioButton.new(input_frame){
    text 'Inches'
    variable $input_dom
    value 3
    pack('fill'=>'x')
}
centi = Tk::Tile::RadioButton.new(input_frame){
    text 'Centimeters'
    variable $input_dom
    value 4
    pack('fill'=>'x')
}
miles = Tk::Tile::RadioButton.new(input_frame){
    text 'Miles'
    variable $input_dom
    value 5
    pack('fill'=>'x')
}
kilometers = Tk::Tile::RadioButton.new(input_frame){
    text 'Kilometers'
    variable $input_dom
    value 6
    pack('fill'=>'x')
}



$output_dom = TkVariable.new
feet = Tk::Tile::RadioButton.new(output_frame){
    text 'Feet'
    variable $output_dom
    value 1
    pack('fill'=>'x')
}
meters = Tk::Tile::RadioButton.new(output_frame){
    text 'Meters' 
    variable $output_dom 
    value 2
    pack('fill'=>'x')
}
inches = Tk::Tile::RadioButton.new(output_frame){
    text 'Inches'
    variable $output_dom
    value 3
    pack('fill'=>'x')
}
centi = Tk::Tile::RadioButton.new(output_frame){

    text 'Centimeters'
    variable $output_dom
    value 4
    pack('fill'=>'x')
}
miles = Tk::Tile::RadioButton.new(output_frame){
    text 'Miles'
    variable $output_dom
    value 5
    pack('fill'=>'x')
}
kilometers = Tk::Tile::RadioButton.new(output_frame){
    text 'Kilometers'
    variable $output_dom
    value 6
    pack('fill'=>'x')
}



content.grid(:column => 0, :row => 0)
input_frame.grid(:column => 0, :row => 0, :columnspan => 5, :rowspan =>6)
output_frame.grid(:column => 9, :row => 0, :columnspan => 5, :rowspan =>6)
input_box.grid(:column => 0, :row => 7)
go_button.grid( :column => 7, :row => 7)
output_text.grid(:column => 9, :row => 7)
underbutton_text.grid( :column => 7, :row => 9)
unit_label.grid(:column => 10, :row => 7)


def func1
    calculate()
    unit()
end


def calculate
  begin
    if $input_dom == $output_dom
        $output_variable.value = $input_variable

    #Feet to ...
    elsif $input_dom == 1 && $output_dom == 2
        $output_variable.value = (($input_variable/3.2808)*10000000.0).round()/10000000.0
    elsif $input_dom == 1 && $output_dom == 3
        $output_variable.value = (($input_variable*12.000)*10000000.0).round()/10000000.0
    elsif $input_dom == 1 && $output_dom == 4
        $output_variable.value = (($input_variable/0.032808)*10000000.0).round()/10000000.0
    elsif $input_dom == 1 && $output_dom == 5
        $output_variable.value = (($input_variable/0.00018939)*10000000.0).round()/10000000.0
    elsif $input_dom == 1 && $output_dom == 6
        $output_variable.value = (($input_variable/3280.8)*10000000.0).round()/10000000.0

    #Meters to ...
    elsif $input_dom == 2 && $output_dom == 1
        $output_variable.value = (($input_variable*3.2808)*10000000.0).round()/10000000.0
    elsif $input_dom == 2 && $output_dom == 3
        $output_variable.value = (($input_variable*39.370)*10000000.0).round()/10000000.0
    elsif $input_dom == 2 && $output_dom == 4
        $output_variable.value = (($input_variable/0.010000)*10000000.0).round()/10000000.0
    elsif $input_dom == 2 && $output_dom == 5
        $output_variable.value = (($input_variable*0.00062137)*10000000.0).round()/10000000.0
    elsif $input_dom == 2 && $output_dom == 6
        $output_variable.value = (($input_variable/1000.000)*10000000.0).round()/10000000.0

    #Inches to ...
    elsif $input_dom == 3 && $output_dom == 1
        $output_variable.value = (($input_variable*0.083333)*10000000.0).round()/10000000.0
    elsif $input_dom == 3 && $output_dom == 2
        $output_variable.value = (($input_variable/39.370)*10000000.0).round()/10000000.0
    elsif $input_dom == 3 && $output_dom == 4
        $output_variable.value = (($input_variable/0.39370)*10000000.0).round()/10000000.0
    elsif $input_dom == 3 && $output_dom == 5
        $output_variable.value = (($input_variable*0.0000157828281218333)*10000000.0).round()/10000000.0
    elsif $input_dom == 3 && $output_dom == 6
        $output_variable.value = (($input_variable/39370.0)*10000000.0).round()/10000000.0

    #Centimeters to ...
    elsif $input_dom == 4 && $output_dom == 1
        $output_variable.value = (($input_variable*0.032808)*10000000.0).round()/10000000.0
    elsif $input_dom == 4 && $output_dom == 2
        $output_variable.value = (($input_variable/100.000)*10000000.0).round()/10000000.0
    elsif $input_dom == 4 && $output_dom == 3
        $output_variable.value = (($input_variable*0.39370)*10000000.0).round()/10000000.0
    elsif $input_dom == 4 && $output_dom == 5
        $output_variable.value = (($input_variable*0.0000062137119)*10000000.0).round()/10000000.0
    elsif $input_dom == 4 && $output_dom == 6
        $output_variable.value = (($input_variable/100000.000)*10000000.0).round()/10000000.0

    #miles to...
    elsif $input_dom == 5 && $output_dom == 1
        $output_variable.value = (($input_variable*5280.0)*10000000.0).round()/10000000.0
    elsif $input_dom == 5 && $output_dom == 2
        $output_variable.value = (($input_variable/0.00062137)*10000000.0).round()/10000000.0
    elsif $input_dom == 5 && $output_dom == 3
        $output_variable.value = (($input_variable*63360.000)*10000000.0).round()/10000000.0
    elsif $input_dom == 5 && $output_dom == 4
        $output_variable.value = (($input_variable/0.0000062137119)*10000000.0).round()/10000000.0
    elsif $input_dom == 5 && $output_dom == 6
        $output_variable.value = (($input_variable/0.62137)*10000000.0).round()/10000000.0

    #kilometers to...
    elsif $input_dom == 6 && $output_dom == 1
        $output_variable.value = (($input_variable*3280.8)*10000000.0).round()/10000000.0
    elsif $input_dom == 6 && $output_dom == 2
        $output_variable.value = (($input_variable/0.0010000)*10000000.0).round()/10000000.0
    elsif $input_dom == 6 && $output_dom == 3
        $output_variable.value = (($input_variable*39370.000)*10000000.0).round()/10000000.0
    elsif $input_dom == 6 && $output_dom == 4
        $output_variable.value = (($input_variable/0.00001)*10000000.0).round()/10000000.0
    elsif $input_dom == 6 && $output_dom == 5
        $output_variable.value = (($input_variable*0.62137)*10000000.0).round()/10000000.0
    end

  rescue
     $output_variable.value = ''
  end
end

def unit
    begin
        if $output_dom == 1
            $unit.value = 'ft'
        elsif $output_dom == 2
            $unit.value = 'm'
        elsif $output_dom == 3
            $unit.value = 'in'
        elsif $output_dom == 4
            $unit.value = 'cm'
        elsif $output_dom == 5
            $unit.value = 'mi'
        elsif $output_dom == 6
            $unit.value = 'km'
        end
    rescue
     $unit.value = ''
    end
end


Tk.mainloop

最佳答案

添加这一行(在定义 $input_variable 之后):

$input_variable.value = 0.0

以及添加以下行(在定义 input_box 之后):

input_box.bind 'Down', lambda {$input_variable.value = $input_variable - 1.0}
input_box.bind 'Up',   lambda {$input_variable.value = $input_variable + 1.0}

应该让您更接近于看到它的工作。

另见 this question 关于确定 DownUp 之类的事情。

关于ruby - 你如何在 Ruby/Tk 中制作箭头键事件处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37556666/

相关文章:

javascript - 单击元素时如何执行外部函数?

c - 在一个应用程序中注册回调以在另一个应用程序中检索

python - Mac OS X 中的绑定(bind)键 - Tkinter

javascript - React js - 如何从子组件到父组件获取Click事件值?

python-3.x - tkinter canvas - 从事件中提取对象 ID?

tcl - 在 Windows 平台上创建 Tcl Starkit 的步骤

ruby-on-rails - 如何更改现有表单布局以在 Rails 中使用 simple_form 布局?

ruby - 了解从 Ruby 中的过程返回

ruby-on-rails - 如何使用 xml 作为输入测试 Rails RESTful API 发布请求?

ruby - Nokogiri XPath 找不到某些节点