tkinterGUI计算器
import tkinter as tk
from tkinter import font
from sys import exit
from datetime import datetime
#配色
color_dic = {
'win_bg':'#5D6D7E',#底板
'btn_equal':'#F5B041',#等于按钮
'btn_operator':'#AEB6BF',#运算按钮
'btn_number':'#EBEDEF',#数字按钮
'text_fg':'#CB4335',#显示器文字
'text_bg':'#17202A',#显示器背景
'author_fg':'#85929E'#作者信息
}
win = tk.Tk()
win.title('Teri的计算器')
win.geometry('320x466')
win.columnconfigure(1,weight=1)
win.resizable(False,False)
win.protocol('WM_DELETE_WINDOW',exit)
win['bg'] = color_dic['win_bg']
font_num = font.Font(family='微软雅黑',size=16)
font_op = font.Font(family='微软雅黑',size=20)
font_scr = font.Font(family='微软雅黑',size=20)
font_txt = font.Font(family='微软雅黑',size=8)
frame = tk.Frame(win)
frame['bg'] = color_dic['win_bg']
txtbox1=tk.Text(win,font=font_scr,height=3)
txtbox1.tag_configure('overstrike',overstrike=True)
txtbox1['bg'] = color_dic['text_bg']
txtbox1['fg'] = color_dic['text_fg']
txtbox1['insertbackground'] = color_dic['text_bg']
lab = tk.Label(win, text='© Teri 2019', font=font_txt)
lab['bg'] = color_dic['win_bg']
lab['fg'] = color_dic['author_fg']
txtbox1.grid(column=0,row=0,columnspan=2,rowspan=1,sticky='nsew',padx=6,pady=6)
frame.grid(column=0, row=3,columnspan=2,padx=6,pady=2)
lab.grid(column=0, row=4,columnspan=5, sticky='s',padx=6)
btn_gp=[]
calculated = False
cn_char = '加减乘除' \
'零。一二三四五六七八九' \
'()'
num_char = '+-×÷' \
'0.123456789' \
'()'
def set_button():
'''第1行'''
x,y = 0,0
for txt in ['c','÷','×']:
btn_gp.append(tk.Button(frame, text=txt, font=font_num))
btn_gp[-1].grid(column=x, row=y, sticky='nsew')
btn_gp[-1].bind('<Button-1>', widget_callback)
btn_gp[-1]['bg'] = color_dic['btn_operator']
x += 1
'''第4列'''
x,y = 3,0
for txt in ['-','+','=']:
btn_gp.append(tk.Button(frame, text=txt, font=font_op))
btn_gp[-1].grid(column=x, row=y*2, rowspan= 1 if txt=='-' else 2, sticky='nsew', ipadx=18)
btn_gp[-1].bind('<Button-1>', widget_callback)
btn_gp[-1]['bg'] = color_dic['btn_equal'] if txt=='=' else color_dic['btn_operator']
y += 1
'''9宫格'''
x,y = 0,2
for i in range(9):
if x == 3:
x = 0
y += 1
id = 9-i
btn_gp.append(tk.Button(frame, text=str(id),font=font_num))
btn_gp[-1].grid(column=2-x,row=y,sticky='nsew',ipadx=22,ipady=8)
btn_gp[-1].bind('<Button-1>',widget_callback)
btn_gp[-1]['bg'] = color_dic['btn_number']
x += 1
'''第6行'''
x,y = 0,5
for txt in ['0','.']:
btn_gp.append(tk.Button(frame, text=txt, font=font_num))
btn_gp[-1].grid(column=x*2, row=y, columnspan= 2 if txt=='0' else 1, sticky='nsew',ipadx=22,ipady=8)
btn_gp[-1].bind('<Button-1>', widget_callback)
btn_gp[-1]['bg'] = color_dic['btn_number']
x += 1
def break_Return(event): #替换按键的默认值
input_txt('=')
return 'break'
def break_KeyPress(event): #替换按键的默认值
txt=event.char
if txt:
if txt in '/*':
txt = txt.replace('/', '÷').replace('*', '×')
input_txt(txt)
return 'break'
def break_BackSpace(event):
pass
def widget_callback(event):
input_txt(event.widget['text'])
def input_txt(txt):
global calculated
get_txt = txtbox1.get(0.0, 'end')
if txt == '=':
if not get_txt == '\n':
result = calculation(get_txt)
edit_Text('c')
edit_Text('input', result)
calculated = True
elif txt == 'c':
edit_Text('c')
calculated = False
elif txt in '0.123456789':
if calculated:
if Result_C(txtbox1.get(0.0, 'end')):
edit_Text('c')
calculated = False
edit_Text('input', txt)
elif txt in '+-×÷':
txt = ' ' + txt + ' '
edit_Text('input', txt)
elif txt in cn_char+'()':
edit_Text('input', txt)
def edit_Text(type,txt=''):
if type == 'input':
txtbox1.insert('end', txt)
txtbox1.see('end')
elif type == 'c':
txtbox1.delete(0.0, 'end')
def calculation(get_txt):
for i in range(len(cn_char)):
get_txt = get_txt.replace(cn_char[i], num_char[i])
txt_list = get_txt.split('=')
t = txt_list[-1].strip().strip('\n')
x = False
for i in '+-×÷':
if i in t:
x = True
break
if x:
try:
if t.find('=') == -1:
t1 = t.replace('×', '*').replace('÷', '/')
t1 = t1.replace('* *','**')
t = t.replace('× ×','次方')
result = eval(t1)
t += '\n= {}'.format(round(result, 4))
#写入历史记录
#write_txt(t)
except:
pass
return t
def write_txt(txt):
log = datetime.now().strftime('#%Y/%m/%d-%H:%M:%S')+'\n'
log += txt + '\n\n'
with open('cal-History.txt', 'a') as file:
file.writelines(log)
file.close()
def Result_C(get_txt):
endline = get_txt.split('\n')[-2].strip().strip('\n')
if endline:
for i in '+-×÷':
if i in endline:
return False
return True
return False
set_button()
txtbox1.bind('<KeyPress>',break_KeyPress)
txtbox1.bind('<Return>',break_Return)
txtbox1.bind('<BackSpace>',break_BackSpace)
txtbox1.focus_set()
win.mainloop()
网友评论