ruby tk实现简易计算器

后端开发   发布日期:2025年06月27日   浏览次数:101
  1. #encding:GBK
  2. require 'tk'
  3. module Const
  4. WIDTH_OF_PANEL = 370
  5. HEIGHT_OF_PANEL = 520
  6. SIZE_OF_BUTTON_H = 60
  7. SIZE_OF_BUTTON_W = 80
  8. HEIGHT_OF_DISPLAY_FRAME = 90
  9. HEIGHT_OF_VALUE_LABEL = 30
  10. HEIGHT_OF_OPERATION_LABEL = 20
  11. BORDER_WIDTH = 2
  12. PADX = 10
  13. PADY = 10
  14. OP_ARRAY = ["%","sqrt","x^2","1/x","CE","C","DEL","/","","","","*","","","","-","","","","+","+/-","",".","="]
  15. end
  16. include Const
  17. $value_tk_var = TkVariable.new(0)
  18. $operate_tk_var = TkVariable.new
  19. $Font = TkFont.new('arial 18')
  20. class ButtonInfor
  21. attr_accessor :x, :y
  22. protected :x=, :y=
  23. def initialize(x=0,y=0)
  24. @x , @y = x , y
  25. end
  26. end
  27. module Work
  28. def number(num)
  29. if $value_tk_var.value == ""
  30. $value_tk_var.value = num
  31. elsif $value_tk_var.value == '-0'
  32. $value_tk_var.value = $value_tk_var.value.chop + num
  33. puts "bbbb"
  34. elsif $value_tk_var.value != ""
  35. $value_tk_var.value += num
  36. end
  37. end
  38. def point
  39. unless /\./ =~ $value_tk_var.value
  40. $value_tk_var.value += "."
  41. end
  42. end
  43. def calcu( key )
  44. unless (/\+/ =~ $operate_tk_var.value || /-/ =~ $operate_tk_var.value || /\*/ =~ $operate_tk_var.value || /\// =~ $operate_tk_var.value)
  45. $operate_tk_var.value = $value_tk_var.value + " " + key
  46. $value_tk_var.value =else
  47. $operate_tk_var.value = $operate_tk_var.value.chop + key
  48. end
  49. end
  50. def equl
  51. operator_ = $operate_tk_var.value[$operate_tk_var.value.size-1]
  52. $operate_tk_var.value = $operate_tk_var.value.chop
  53. num2 = (/\./ =~ $value_tk_var.value) ? $value_tk_var.value.to_f : $value_tk_var.value.to_i
  54. num1 = (/\./ =~ $operate_tk_var.value) ? $operate_tk_var.value.to_f : $operate_tk_var.value.to_i
  55. case operator_
  56. when "+"
  57. $value_tk_var.value = ( num1 + num2 ).to_s
  58. when "-"
  59. $value_tk_var.value = ( num1 - num2 ).to_s
  60. when "*"
  61. $value_tk_var.value = ( num1 * num2 ).to_s
  62. when "/"
  63. if num2 == 0 || num2 == 0.0
  64. $value_tk_var.value = "CANNOT DEVIDED BY 0!"
  65. else
  66. $value_tk_var.value = ( num1 / num2 ).to_s
  67. end
  68. end
  69. $operate_tk_var.value = nil
  70. end
  71. def clear(op)
  72. $value_tk_var.value = 0
  73. $operate_tk_var.value = nil if (op == "C")
  74. end
  75. def del
  76. $value_tk_var.value = $value_tk_var.value.chop
  77. end
  78. def sqrt_
  79. $value_tk_var.value = Math.sqrt($value_tk_var.value.to_f)
  80. end
  81. def sq_
  82. $value_tk_var.value = $value_tk_var.value.to_f * $value_tk_var.value.to_f
  83. end
  84. def devide_one
  85. $value_tk_var.value = 1/($value_tk_var.value.to_f)
  86. end
  87. def negate
  88. if $value_tk_var.value[0] != '-'
  89. $value_tk_var.value = "-" + $value_tk_var.value
  90. else
  91. $value_tk_var.value = $value_tk_var.value.reverse.chop.reverse
  92. end
  93. end
  94. def get_pos_hash
  95. tmp = Hash.new
  96. (0..23).each do |i|
  97. tmp[OP_ARRAY[i]]=ButtonInfor.new((i%4)*(PADX+SIZE_OF_BUTTON_W),(i/4)*(PADY+SIZE_OF_BUTTON_H))
  98. end
  99. return tmp
  100. end
  101. module_function :number , :point , :clear , :calcu , :equl , :del , :sqrt_ , :sq_ , :devide_one , :get_pos_hash ,:negate
  102. end
  103. #创建主窗口
  104. root = TkRoot.new do
  105. title "SHH's Calculator";
  106. geometry WIDTH_OF_PANEL.to_s + "x" + HEIGHT_OF_PANEL.to_s;
  107. end
  108. operat_frame = TkFrame.new do
  109. relief 'groove'
  110. pack('fill' => 'x')
  111. borderwidth BORDER_WIDTH
  112. padx PADX
  113. pady PADY
  114. place:'height' => HEIGHT_OF_PANEL-HEIGHT_OF_DISPLAY_FRAME , 'width' => WIDTH_OF_PANEL , 'x' => 0 , 'y' => HEIGHT_OF_DISPLAY_FRAME
  115. background "LightCyan"
  116. end
  117. display_frame = TkFrame.new do
  118. relief 'groove'
  119. pack('fill' => 'x')
  120. borderwidth BORDER_WIDTH
  121. padx PADX
  122. pady PADY
  123. place:'height' => HEIGHT_OF_DISPLAY_FRAME , 'width' => WIDTH_OF_PANEL , 'x' => 0 , 'y' => 0
  124. background "lightblue"
  125. end
  126. value_label = TkLabel.new(display_frame) do
  127. relief 'groove'
  128. pack('fill' => 'x')
  129. borderwidth BORDER_WIDTH
  130. textvariable
  131. font $Font
  132. place:'height' => HEIGHT_OF_VALUE_LABEL , 'width' => WIDTH_OF_PANEL - PADX * 2 , 'x' => 0 , 'y' => 0
  133. end
  134. operation_label = TkLabel.new(display_frame) do
  135. relief 'groove'
  136. pack('fill' => 'x')
  137. borderwidth BORDER_WIDTH
  138. textvariable
  139. font TkFont.new('arial 10')
  140. place:'height' => HEIGHT_OF_OPERATION_LABEL , 'width' => WIDTH_OF_PANEL * 0.618 , 'x' => WIDTH_OF_PANEL * (1-0.618) - PADX * 2 , 'y' => HEIGHT_OF_VALUE_LABEL + PADY
  141. end
  142. value_label['textvariable'] = $value_tk_var
  143. operation_label['textvariable'] = $operate_tk_var
  144. Work.get_pos_hash().each do |key,value|
  145. TkButton.new(operat_frame) do
  146. font "Consolas 15"
  147. place:'height' => SIZE_OF_BUTTON_H , 'width' => SIZE_OF_BUTTON_W , 'x' => value.x , 'y' => value.y
  148. text key
  149. background (("".."") === key)? "Gainsboro" : "Gray"
  150. command do
  151. case key
  152. when ("".."")
  153. Work.number(key)
  154. when "."
  155. Work.point()
  156. when "+","-","*","/"
  157. Work.calcu(key)
  158. when "="
  159. Work.equl()
  160. when "CE","C"
  161. Work.clear(key)
  162. when "DEL"
  163. Work.del()
  164. when "sqrt"
  165. Work.sqrt_()
  166. when "x^2"
  167. Work.sq_()
  168. when "1/x"
  169. Work.devide_one()
  170. when "+/-"
  171. Work.negate()
  172. end
  173. end
  174. end
  175. end
  176. Tk.mainloop

 

以上就是ruby tk实现简易计算器的详细内容,更多关于ruby tk实现简易计算器的资料请关注九品源码其它相关文章!