python计算器gui设计_Python 使用tkinter写的GUI界面计算器

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('', 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('', 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('',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('', 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('',break_KeyPress)

txtbox1.bind('',break_Return)

txtbox1.bind('',break_BackSpace)

txtbox1.focus_set()

win.mainloop()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值