The program in this chapter is quoted from [ruby-list:15294].
It is a program of the calculator, a combination of the button, the entry, and the table, all of which you already have been examined.
Program gtkcalc.rb:
#!/usr/bin/env ruby
require 'gtk'
class Calculator
MAX_DIGIT = 12
ADD = "add"; SUB = "sub"; MUL = "mul"; DIV = "div"
def initialize
num = ""; dot = false # the number what is putting together
erred = false # error, or not?
operation = nil # one of {nil, ADD, SUB, MUL, DIV}
operandl = 0.0 # operand(left)
window = Gtk::Window.new(Gtk::WINDOW_TOPLEVEL)
window.set_title('calculator')
window.signal_connect('destroy') {Gtk.main_quit}
window.border_width = 5
table = Gtk::Table.new(5, 5, true)
window.add(table)
table.show
disp = Gtk::Entry.new # display of the calculator
disp.set_editable(false)
table.attach(disp, 0, 5, 0, 1)
disp.show
digit_clicked = proc {|widget, digit|
unless erred
if disp.get_text.length < MAX_DIGIT
num = num + digit.to_s
disp.set_text(num)
end
end
}
dot_clicked = proc {
unless erred
if disp.get_text.length < MAX_DIGIT - 1 and not dot
dot = true
num = num + '.'
disp.set_text(num)
end
end
}
equ_clicked = proc {
unless erred
x = Float(disp.get_text)
case operation
when ADD
answer = operandl + x
when SUB
answer = operandl - x
when MUL
answer = operandl * x
when DIV
if x == 0.0
disp.set_text('Error')
erred = true
else
answer = operandl / x
end
end
unless erred
num = ''; dot = false
unless operation == nil
operation = nil
disp.set_text(answer.to_s)
end
end
end
}
sign_clicked = proc {
unless erred
x = Float(disp.get_text)
answer = -x
disp.set_text(answer.to_s)
num = ''; dot = false
end
}
op_clicked = proc {|widget, opcode|
unless num == '' then equ_clicked.call end
unless erred
operation = opcode
operandl = Float(disp.get_text)
num = ''; dot = false
end
}
cle_clicked = proc {
unless erred
if num == '' then operation = nil end
disp.set_text('0')
num = ''; dot = false
end
}
clr_clicked = proc {
erred = false
operation = nil
cle_clicked.call
}
[
["7", 0, 1, 1, 2, digit_clicked, 7],
["8", 1, 2, 1, 2, digit_clicked, 8],
["9", 2, 3, 1, 2, digit_clicked, 9],
["/", 3, 4, 1, 2, op_clicked, DIV],
["C", 4, 5, 1, 2, clr_clicked, nil],
["4", 0, 1, 2, 3, digit_clicked, 4],
["5", 1, 2, 2, 3, digit_clicked, 5],
["6", 2, 3, 2, 3, digit_clicked, 6],
["*", 3, 4, 2, 3, op_clicked, MUL],
["CE", 4, 5, 2, 3, cle_clicked, nil],
["1", 0, 1, 3, 4, digit_clicked, 1],
["2", 1, 2, 3, 4, digit_clicked, 2],
["3", 2, 3, 3, 4, digit_clicked, 3],
["-", 3, 4, 3, 4, op_clicked, SUB],
["=", 4, 5, 3, 5, equ_clicked, nil],
["0", 0, 1, 4, 5, digit_clicked, 0],
[".", 1, 2, 4, 5, dot_clicked, nil],
["+/-",2, 3, 4, 5, sign_clicked, nil],
["+", 3, 4, 4, 5, op_clicked, ADD]
].each {|label, la, ra, ta, ba, func, arg|
button = Gtk::Button.new(label)
table.attach(button, la, ra, ta, ba)
button.signal_connect('clicked', arg, &func)
button.show
}
window.show
cle_clicked.call
end
end
if __FILE__ == $0
Calculator.new
Gtk.main
end
[TOP]
Written by
akaishi@ruby.freak.ne.jp