使用Python Tkinter编写计算机功能

  • Post author:
  • Post category:python


本文主要使用python tkinter下的Gride编写一个计算器(标准和科学计算器),自测没有发现问题,如果有哪位网友发现bug可以给我留言或私信,我来修改。代码如下:

import tkinter
from tkinter import *
from tkinter import messagebox,ttk

win = Tk()
win.title('Grid 科学计算器')

c=str()
def add(i):
    global c
    a = ['*', '/', '-', '+', '.']
    if mode.get()=='科学':

        if str(c) in a and i in a:    #判断本次输入和前一次输入的是非数字,删除前一次输入的非数字
            qq = res.get()[:-1]
            res.set(qq)
        # elif str(c) in a and i==0:
        #     print('00',res.get())
        #     res.set(res.get())
        if res.get():      #重新把输入的i复制到后面展示

            qq = str(res.get())
            qq1 = qq + str(i)
            # print(len(qq1))
            if len(qq1) >=3:
                # print(qq1[-3],type(qq1[-2]))
                if qq1[-3] in ['*', '/', '-', '+'] and qq1[-2] == '0' and qq1[-1] not in '.': #eval无法识别x+0xxxx或0x+x
                    qq = str(res.get()[:-1]) + str(i)
                    res.set(qq)
                    print('qq', qq)
                else:
                    res.set(qq1)
            else:
                res.set(qq1)

        else:
            res.set(i)
    else:   #mode='标准'

        if str(c) in a and i in a:  # 判断本次输入和前一次输入的是非数字,删除前一次输入的非数字
            qq = res.get()[:-1]
            res.set(qq)
        elif str(i) in ['*', '/', '-', '+'] and res.get()[:-1]:
            print(res.get())
            qq=str(round(eval(res.get()),10))

            res.set(qq)
        if res.get():  # 重新把输入的i复制到后面展示

            qq = str(res.get())
            qq1 = qq + str(i)
            # print(len(qq1))
            if len(qq1) >= 3:
                # print(qq1[-3],type(qq1[-2]))
                if qq1[-3] in ['*', '/', '-', '+'] and qq1[-2] == '0' and qq1[-1] not in '.':  # eval无法识别x+0xxxx或0x+x
                    qq = str(res.get()[:-1]) + str(i)
                    res.set(qq)
                    print('qq', qq)
                else:
                    res.set(qq1)
            else:
                res.set(qq1)

        else:
            res.set(i)

    c=i
def calc():

    try:
        if res.get()[0]=='0':
            if res.get()[1] in ['*', '/', '-', '+', '.']:    #eval无法识别x+0xxxx或0x+x

                res.set(round(eval(res.get()),10))
            else:
                print('fail',res.get()[1:])



                res.set(eval(res.get()[1:]))
        else:
            print('daol')
            res.set(round(eval(res.get()),10))
    except:
        # print(res.get())
        if res.get():
            tkinter.messagebox.showerror('message info','在瞎输入,40m长的大刀等着你')
        else:
            res.set('')
            print('empty')
            pass
def AC():   #AC为了给按钮用,AC1给bind用,一个要带参数
    global c
    c='0'
    res.set('')

def AC1(self):

    res.set('')
def dele():
    # global c
    i=res.get()
    # try:
    #     c=i[-2]
    # except:
    #     print('可忽略')

    i=i[:-1]
    res.set(i)


# for i in range(1,10):
#     # i-1表示从第一行开始,+2(-1+3)表示从第二行开始,这相法比较666,缺点是点击任意一个按钮都只能调用一个函数,且i永远是最后一个数字
#     #目前没有找到解决办法,故废弃,用土鳖办法,这段代码可以忽略,如果有解决方法也可以留言
#     Li = tkinter.Button(win, text=str(i), width=10,command=add).grid(row=(i +2) // 3, column=(i +2) % 3)


Button(win, text="AC",command=AC,width =10,fg='red').grid(row=1, column=0, sticky=W)
Button(win, text="Del",command=dele,width =10).grid(row=1, column=1, sticky=W)



mode=ttk.Combobox(win,values=["科学","标准"],width =8,state='readonly',background='red')
mode.grid(row=1, column=2, columnspan=1, sticky=W)
mode.current(0)
mode.bind('<<ComboboxSelected>>',AC1)
Button(win, text="/",command=lambda :add('/'),width =10).grid(row=1, column=3, sticky=W)
Button(win, text="*",command=lambda :add('*'),width =10).grid(row=4, column=3, sticky=W)
Button(win, text="0",command=lambda :add(0),width =10).grid(row=5, column=0, columnspan=2,sticky=E+W)
Button(win, text=".",command=lambda :add('.'),width =10).grid(row=5, column=2, sticky=W)
Button(win, text="1",command=lambda:add(1),width =10,).grid(row=2, column=0, sticky=W)
Button(win, text="2",command=lambda :add(2),width =10).grid(row=2, column=1, sticky=W)  #,state=DISABLED--禁用按钮状态
Button(win, text="3",command=lambda :add(3),width =10).grid(row=2, column=2, sticky=W)
Button(win, text="4",command=lambda :add(4),width =10).grid(row=3, column=0, sticky=W)
Button(win, text="5",command=lambda :add(5),width =10).grid(row=3, column=1, sticky=W)
Button(win, text="6",command=lambda :add(6),width =10).grid(row=3, column=2, sticky=W)  #,state=DISABLED--禁用按钮状态
Button(win, text="7",command=lambda :add(7),width =10).grid(row=4, column=0, sticky=W)
Button(win, text="8",command=lambda :add(8),width =10).grid(row=4, column=1, sticky=W)
Button(win, text="9",command=lambda :add(9),width =10).grid(row=4, column=2, sticky=W)
Button(win, text="+",command=lambda :add('+'),width =10).grid(row=2, column=3, sticky=W)
Button(win, text="-",command=lambda :add("-"),width =10).grid(row=3, column=3, sticky=W)
Button(win, text="=",command=calc,bg='blue',height =1,width =10).grid(row=5, column=3, sticky=W)

win.mainloop()

PS:通过下拉框切换标准或科学输入法,来解决先算输入运行还是统一从左到右进行计算。目前也支持复制粘贴数据进行继续(按从左到右计算)



版权声明:本文为mongo2020原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。