Python 使用tkinter写的GUI界面计算器

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() 
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,826评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,968评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,234评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,562评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,611评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,482评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,271评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,166评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,608评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,814评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,926评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,644评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,249评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,866评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,991评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,063评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,871评论 2 354