Introduction edit
This is a small 4-function-calculator. It uses expr directly to calculate the results, so you may need to append ".0" to numbers to do calculations in floating point.E.g. "3/2" will be done on integers: "3/2=1", so you might want to do "3/2.0" instead.Also, you cannot use the result of a calculation for further calculations, i.e. if you have "17/4.0=4.25" in the display and you continue to type "*3=" you get an error.Program 1 edit
# Small calculator
package require Tk
button .quit -text "Off" -fg red -command exit
label .readout -textvariable result -bg white
set result " "
button .key0 -text "0" -width 3 -command {append result 0}
button .key1 -text "1" -width 3 -command {append result 1}
button .key2 -text "2" -width 3 -command {append result 2}
button .key3 -text "3" -width 3 -command {append result 3}
button .key4 -text "4" -width 3 -command {append result 4}
button .key5 -text "5" -width 3 -command {append result 5}
button .key6 -text "6" -width 3 -command {append result 6}
button .key7 -text "7" -width 3 -command {append result 7}
button .key8 -text "8" -width 3 -command {append result 8}
button .key9 -text "9" -width 3 -command {append result 9}
button .point -text "." -width 3 -command {append result .}
button .plus -text "+" -width 3 -command {append result +}
button .minus -text "-" -width 3 -command {append result -}
button .times -text "*" -width 3 -command {append result *}
button .div -text "/" -width 3 -command {append result /}
button .equal -text "=" -width 3 -command {append result = [expr $result]}
button .sign -text "+/-" -width 3 -command {set result [expr $result*-1]}
button .clear -text "C/CE" -width 3 -command {set result ""}
grid .quit .readout -sticky nsew
grid .key7 .key8 .key9 .times .clear -sticky nsew
grid .key4 .key5 .key6 .minus .div -sticky nsew
grid .key1 .key2 .key3 .plus .equal -sticky nsew
grid .key0 .sign .point -sticky nsew
#More than 4 columns:
#grid configure .sbar -columnspan 4 -padx 4
grid configure .readout -columnspan 4 -padx 4
grid configure .plus -rowspan 2
grid configure .equal -rowspan 2
#bind . <1> {append result 1}
#bind . <2> {append result 2}
#bind . <3> {append result 3}
bind . <4> {append result 4}
bind . <r> {append result 5}
focus -force .HJG 2006-11-12 - Changed "aufgabe" --> "result".HJG 2014-03-28 - Here is a slightly revised version: Extending the "clear"-button, we can re-use the result for further calculations:- if the result contains a "=", the first part of the text is removed,
i.e "17/4.0=4.25" --> "4.25", ready for more operations. - otherwise, the last char is removed ("backspace")
- if the result contains a "=", the text from there to end of text is removed, and ".0" appended,
i.e "17/4=4" --> "17/4.0", ready to retry on real numbers.
Program 2 edit
# Small calculator v2
package require Tk
global result
set result " "
proc Sign {} {
set p [string first "=" $::result]
if {$p>=0} {
set ::result [string range $::result 0 $p-1]
append ::result ".0"
} else {
set ::result [expr $::result*-1]
}
}
proc C_CE {} {
set p [string first "=" $::result]
if {$p>=0} { ;# clear result: remove text upto "="
incr p 1
set ::result [string range $::result $p end]
} else { ;# Backspace: remove last char
set ::result [string range $::result 0 end-1]
}
}
button .quit -text "Off" -fg red -command exit
label .readout -textvariable result -bg white
foreach k { 0 1 2 3 4 5 6 7 8 9 + - * / } {
button .key$k -text "$k" -width 3 -command "append result $k"
}
button .point -text "." -width 3 -command {append result .}
button .equal -text "=" -width 3 -command { append result = [expr $result]}
button .sign -text "+/-" -width 3 -command { Sign }
button .clear -text "C/CE" -width 3 -command { C_CE }
grid .quit .readout -sticky nsew
grid .key7 .key8 .key9 .key* .clear -sticky nsew
grid .key4 .key5 .key6 .key- .key/ -sticky nsew
grid .key1 .key2 .key3 .key+ .equal -sticky nsew
grid .key0 .sign .point -sticky nsew
grid configure .readout -columnspan 4 -padx 4
grid configure .key+ -rowspan 2
grid configure .equal -rowspan 2
focus -force .See also: A little calculator - A fancier little calculator

