美文网首页
Python 使用tkinter写的GUI界面计算器

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

作者: 徐Teri | 来源:发表于2019-08-06 13:26 被阅读0次
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() 

相关文章

网友评论

      本文标题:Python 使用tkinter写的GUI界面计算器

      本文链接:https://www.haomeiwen.com/subject/ewmidctx.html