使用tkinter模块制作的一个简单的计算器
由于刚学这个模块,所以做的不是很好
截图:
点击计算后算式区的值会改成结果,可自行在数字触发的函数中添加数字输入就进行计算回显的功能
代码如下:
import tkinter as tk
import tkinter.messagebox as message
window = tk.Tk()
window.title('不成熟的计算器')
# 宽280,高350
# 不设置宽高,大小自动跟随内部控件
# window.geometry('250x280')
window['background'] = 'blue'
# 窗体禁止缩放
window.resizable(width=False, height=False)
# 计算公式
show_formula = tk.StringVar()
# 计算结果
show_result = tk.StringVar()
# 创建显示算数栏
# 需要指定宽度 否者 会随着输入的字符增多被拉长
# 用来显示要计算的算式
formulaLabel = tk.Label(window, height=1, width=4, textvariable=show_formula,
justify=tk.LEFT, anchor='se', font=('正楷', 12))
formulaLabel.grid(row=0, column=0, columnspan=4, sticky=tk.W + tk.E)
# 用来展示结果
calculationResultsLabel = tk.Label(window, height=2, width=4, textvariable=show_result,
justify=tk.LEFT, anchor='se', font=('正楷', 19))
calculationResultsLabel.grid(row=1, column=0, columnspan=4, sticky=tk.W + tk.E)
# 用来创建按钮
# row 行
# column 列
# operator 操作符(例如:+)
# text 控件名称
# columnspan 占几列
# width 宽度
def createButton(row, column, operator, text, columnspan=None, width=5):
button = tk.Button(window, command=lambda: cal(operator),
width=width, text=text, font=('正楷', 15))
if columnspan is None:
button.grid(row=row, column=column, padx=2, pady=4)
else:
button.grid(row=row, column=column, columnspan=columnspan, padx=2, pady=4)
# 第一行按钮
createButton(2, 0, '1', '1')
createButton(2, 1, '2', '2')
createButton(2, 2, '3', '3')
createButton(2, 3, '+', '+')
# 第二行按钮
createButton(3, 0, '4', '4')
createButton(3, 1, '5', '5')
createButton(3, 2, '6', '6')
createButton(3, 3, '-', '-')
# 第三行按钮
createButton(4, 0, '7', '7')
createButton(4, 1, '8', '8')
createButton(4, 2, '9', '9')
createButton(4, 3, '*', '*')
# 第四行按钮
createButton(5, 0, '0', '0')
createButton(5, 1, '.', '.')
createButton(5, 2, 'back', 'back')
createButton(5, 3, '/', '/')
# 第五行按钮
createButton(6, 0, 'clear', '清 空', columnspan=2, width=12)
createButton(6, 2, '=', '计 算', columnspan=2, width=12)
# 用来保存结果
formula = ''
# 点击按钮调用的函数
def cal(key):
global formula
# 已经有的前一个key 例如1+2+ already_key为+
already_key = ''
# 截取算式最后一位,后面需要判断最后一位是否是运算符
if len(formula) > 0:
already_key = formula[-1]
# 下面的* /处理代码是类似的 为了便于理解分开了
# 加
if key == '+':
if formula != '':
# 如果前面是*或者/就将其改成+
if already_key == '*' or already_key == '/' or already_key == '.':
formula = formula[0:-1] + key
elif already_key != '+' and already_key != '-' and already_key != '':
formula += key
elif key == '-':
if already_key == '-':
formula = formula[0:-1] + '+'
elif already_key == '+' or already_key == '.':
formula = formula[0:-1] + '-'
else:
formula += key
# 除法和乘法还要判断倒数第二个是不是* /号
elif key == '*':
if formula != '':
# 如果最后一个为+ - / .的话
if already_key == '+' or already_key == '-' or already_key == '/' or already_key == '.':
# 如果算式长于大于等于2位
if len(formula) >= 2:
# 如果倒数第二个字符不是*或者/ 防止出现* /之后再输入*的事件 跟后面减法(-)处理有关联
if formula[-2] != '*' and formula[-2] != '/':
formula = formula[0:-1] + key
else:
formula = formula[0:-1] + key
# 如果前面是数字就可以直接添加到最后
elif already_key != key:
formula += key
elif key == '/':
if formula != '':
if already_key == '+' or already_key == '-' or already_key == '*' or already_key == '.':
if len(formula) >= 2:
if formula[-2] != '*' and formula[-2] != '/':
formula = formula[0:-1] + key
else:
formula = formula[0:-1] + key
elif already_key != key:
formula += key
# 输入点的时候
elif key == '.':
# 如果最后一个不是运算符和.则添加到最后一个
if formula != '' and already_key != '+' and already_key != '-' \
and already_key != '*' and already_key != '/' and already_key != '.':
formula += key
elif key == '=':
# 进行计算 计算要做出错处理 要判断最后一个是不是运算符号
if len(formula) < 1:
pass
elif already_key != '*' and already_key != '/' and already_key != '+' \
and already_key != '-':
try:
# 通过eval函数计算
v = eval(formula)
show_result.set(v)
# 如果计算之后,讲算式改成结果 eval返回值是int类型 所以要转为字符型复制给暂存
formula = str(v)
show_formula.set(v)
except ZeroDivisionError:
message.showerror(title='警告', message='除数不能为0')
else:
message.showinfo(title='温馨提示', message='请检查您的公式,最后一个不能为运算符!')
elif key == 'clear':
# 清空显示区
show_formula.set('')
show_result.set('')
# 清空暂存区
formula = ''
elif key == 'back':
# 删除
if len(formula) >= 1:
formula = formula[0:-1]
else:
# 这里输入的全是数字
formula += key
show_formula.set(formula)
window.mainloop()