#encding:GBK
require 'tk' module Const
WIDTH_OF_PANEL = 370
HEIGHT_OF_PANEL = 520
SIZE_OF_BUTTON_H = 60
SIZE_OF_BUTTON_W = 80
HEIGHT_OF_DISPLAY_FRAME = 90
HEIGHT_OF_VALUE_LABEL = 30
HEIGHT_OF_OPERATION_LABEL = 20
BORDER_WIDTH = 2
PADX = 10
PADY = 10
OP_ARRAY = ["%","sqrt","x^2","1/x","CE","C","DEL","/","","","","*","","","","-","","","","+","+/-","",".","="]
end include Const $value_tk_var = TkVariable.new(0)
$operate_tk_var = TkVariable.new
$Font = TkFont.new('arial 18') class ButtonInfor
attr_accessor :x, :y
protected :x=, :y=
def initialize(x=0,y=0)
@x , @y = x , y
end
end module Work
def number(num)
if $value_tk_var.value == ""
$value_tk_var.value = num
elsif $value_tk_var.value == '-0'
$value_tk_var.value = $value_tk_var.value.chop + num
puts "bbbb"
elsif $value_tk_var.value != ""
$value_tk_var.value += num
end
end def point
unless /\./ =~ $value_tk_var.value
$value_tk_var.value += "."
end
end def calcu( key )
unless (/\+/ =~ $operate_tk_var.value || /-/ =~ $operate_tk_var.value || /\*/ =~ $operate_tk_var.value || /\// =~ $operate_tk_var.value)
$operate_tk_var.value = $value_tk_var.value + " " + key
$value_tk_var.value = 0
else
$operate_tk_var.value = $operate_tk_var.value.chop + key
end
end def equl
operator_ = $operate_tk_var.value[$operate_tk_var.value.size-1]
$operate_tk_var.value = $operate_tk_var.value.chop
num2 = (/\./ =~ $value_tk_var.value) ? $value_tk_var.value.to_f : $value_tk_var.value.to_i
num1 = (/\./ =~ $operate_tk_var.value) ? $operate_tk_var.value.to_f : $operate_tk_var.value.to_i
case operator_
when "+"
$value_tk_var.value = ( num1 + num2 ).to_s
when "-"
$value_tk_var.value = ( num1 - num2 ).to_s
when "*"
$value_tk_var.value = ( num1 * num2 ).to_s
when "/"
if num2 == 0 || num2 == 0.0
$value_tk_var.value = "CANNOT DEVIDED BY 0!"
else
$value_tk_var.value = ( num1 / num2 ).to_s
end
end
$operate_tk_var.value = nil
end def clear(op)
$value_tk_var.value = 0
$operate_tk_var.value = nil if (op == "C")
end def del
$value_tk_var.value = $value_tk_var.value.chop
end def sqrt_
$value_tk_var.value = Math.sqrt($value_tk_var.value.to_f)
end def sq_
$value_tk_var.value = $value_tk_var.value.to_f * $value_tk_var.value.to_f
end def devide_one
$value_tk_var.value = 1/($value_tk_var.value.to_f)
end def negate
if $value_tk_var.value[0] != '-'
$value_tk_var.value = "-" + $value_tk_var.value
else
$value_tk_var.value = $value_tk_var.value.reverse.chop.reverse
end
end def get_pos_hash
tmp = Hash.new
(0..23).each do |i|
tmp[OP_ARRAY[i]]=ButtonInfor.new((i%4)*(PADX+SIZE_OF_BUTTON_W),(i/4)*(PADY+SIZE_OF_BUTTON_H))
end
return tmp
end module_function :number , :point , :clear , :calcu , :equl , :del , :sqrt_ , :sq_ , :devide_one , :get_pos_hash ,:negate
end #创建主窗口
root = TkRoot.new do
title "SHH's Calculator";
geometry WIDTH_OF_PANEL.to_s + "x" + HEIGHT_OF_PANEL.to_s;
end operat_frame = TkFrame.new do
relief 'groove'
pack('fill' => 'x')
borderwidth BORDER_WIDTH
padx PADX
pady PADY
place:'height' => HEIGHT_OF_PANEL-HEIGHT_OF_DISPLAY_FRAME , 'width' => WIDTH_OF_PANEL , 'x' => 0 , 'y' => HEIGHT_OF_DISPLAY_FRAME
background "LightCyan"
end display_frame = TkFrame.new do
relief 'groove'
pack('fill' => 'x')
borderwidth BORDER_WIDTH
padx PADX
pady PADY
place:'height' => HEIGHT_OF_DISPLAY_FRAME , 'width' => WIDTH_OF_PANEL , 'x' => 0 , 'y' => 0
background "lightblue"
end value_label = TkLabel.new(display_frame) do
relief 'groove'
pack('fill' => 'x')
borderwidth BORDER_WIDTH
textvariable
font $Font
place:'height' => HEIGHT_OF_VALUE_LABEL , 'width' => WIDTH_OF_PANEL - PADX * 2 , 'x' => 0 , 'y' => 0
end operation_label = TkLabel.new(display_frame) do
relief 'groove'
pack('fill' => 'x')
borderwidth BORDER_WIDTH
textvariable
font TkFont.new('arial 10')
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
end value_label['textvariable'] = $value_tk_var
operation_label['textvariable'] = $operate_tk_var Work.get_pos_hash().each do |key,value|
TkButton.new(operat_frame) do
font "Consolas 15"
place:'height' => SIZE_OF_BUTTON_H , 'width' => SIZE_OF_BUTTON_W , 'x' => value.x , 'y' => value.y
text key
background (("".."") === key)? "Gainsboro" : "Gray"
command do
case key
when ("".."")
Work.number(key)
when "."
Work.point()
when "+","-","*","/"
Work.calcu(key)
when "="
Work.equl()
when "CE","C"
Work.clear(key)
when "DEL"
Work.del()
when "sqrt"
Work.sqrt_()
when "x^2"
Work.sq_()
when "1/x"
Work.devide_one()
when "+/-"
Work.negate()
end
end
end
end Tk.mainloop

ruby tk实现简易计算器的更多相关文章

  1. 自制c#简易计算器

    这是一个课堂作业,我觉得作为一个简易的计算器不需要态度复杂的东西,可能还有一些bug,有空再慢慢加强. using System;using System.Collections.Generic;us ...

  2. 剖析简易计算器带你入门微信小程序开发

    写在前面,但是重点在后面 这是教程,也不是教程. 可以先看Demo的操作动图,看看是个什么玩意儿,GitHub地址(https://github.com/dunizb/wxapp-sCalc) 自从微 ...

  3. PHP学习笔记02——简易计算器

    <!DOCTYPE html> <html> <head> <title>PHP简易计算器</title> </head> &l ...

  4. JavaScript之简易计算器

    <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8&quo ...

  5. 菜鸟学习Struts——简易计算器

    这是学习Struts的一个简单的例子文件结构如下: 1.配置Struts环境 2.新建input.jsp,success.jsp,error.jsp input.jsp代码如下: <%@ pag ...

  6. Python之实现一个简易计算器

    自己动手写计算器 一.功能分析 用户输入一个类似这样 3*( 4+ 50 )-(( 100 + 40 )*5/2- 3*2* 2/4+9)*((( 3 + 4)-4)-4) 这样的表达式,假设表达式里 ...

  7. 使用HTML+CSS,jQuery编写的简易计算器

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...

  8. 使用HTML+CSS,jQuery编写的简易计算器后续(添加了键盘监听)

    之前发布了一款简易的计算器,今天做了一下修改,添加了键盘监听事件,不用再用鼠标点点点啦 JS代码: var yunSuan = 0;// 运算符号,0-无运算;1-加法;2-减法;3-乘法;4-除法 ...

  9. C#Windows Form简易计算器实现(中)

    昨天花了一天的时间弄计算器.也算是做出来了,还是简易的(怀疑猿生!!).在此先感谢昨天被我骚扰的朋友. 先贴一张界面看看 其实健壮性还是挺差的,用户体验也是极差的.比如说用户输入了不合理运算式子,我就 ...

随机推荐

  1. Mac 10.14.5系统偏好设置安全性与隐私不展示任何来源解决办法

    Mac新系统升级(10.14.5)后未从appstore下载的软件在安装时会提示安装包已损坏之类的东东,这是因为没有打开“设置”—“安全与隐私”中的“任何来源”造成的,可是升级后的10.14.5却没有 ...

  2. linux 查看某个进程内存占用情况命令

    1.先用ps查询进程号 ps -aux|grep 进程名字 2.查看更详细的内存占比 cat /proc/3664/status 返回结果:(其中VmRSS为进程所占用的内存)

  3. Hadoop优化 操作系统优化

    1.优化文件系统,修改/etc/fstab 在defaults后面添加noatime,表示不记录文件的访问时间. 修改为: 如果不想重新启动操作系统使配置生效,那么应该执行: # mount -o r ...

  4. python3 系统监控脚本(2) (监控CPU,内存等信息)

    #!/usr/bin/env python3 #create at 2018-12-04 'this is a system monitor scripts' __author__="yjt ...

  5. Hadoop(1)---运行Hadoop自带的wordcount出错问题。

    在hadoop2.9.0版本中,对namenode.yarn做了ha,随后在某一台namenode节点上运行自带的wordcount程序出现偶发性的错误(有时成功,有时失败),错误信息如下: // : ...

  6. Mac之Sublime Text使用Go

    安装Golang build 包 点击 Preferences > Package control 菜单(MAC快捷键 shift + command + p) 在弹出的输入框输入 instal ...

  7. linux 关机/重启命令总结

    linux下常用的关机命令有:shutdown.halt.poweroff.init:重启命令有:reboot.下面本文就主要介绍一些常用的关机命令以及各种关机命令之间的区别和具体用法. 首先来看一下 ...

  8. T-MAX—项目系统设计与数据库设计

    团队作业第四次-项目系统设计与数据库设计 这个作业属于哪个课程 2019秋福大软件工程实践Z班 这个作业要求在哪里 团队作业第四次-项目系统设计与数据库设计 团队名称 T-MAX 这个作业的目标 在开 ...

  9. boost 介绍

    简介: Boost库是一个可移植.提供源代码的C++库,作为标准库的后备,是C++标准化进程的开发引擎之一. Boost库由C++标准委员会库工作组成员发起,其中有些内容有望成为下一代C++标准库内容 ...

  10. Python自学笔记(九)

    #类 #类的创建 :class类名 + 冒号,后面语句要缩进 #类的属性创建:通过赋值语句(即定义“是怎样的”) #实例方法的创建:def + 方法名(self) #方法具体的执行过程,即定义“能做什 ...