Python 使用 Tkinter 写一个计算器 (与windows自带的类似)

成品展示如下(代码在最下面):

输入数字 当摁下运算符号后写入上面的屏幕中
Python 使用 Tkinter 写一个计算器 (与windows自带的类似)_第1张图片
点击等号后输出结果
Python 使用 Tkinter 写一个计算器 (与windows自带的类似)_第2张图片 Python 使用 Tkinter 写一个计算器 (与windows自带的类似)_第3张图片
按正负取反,取反后如果点击运算符号则可以将取反后的数字进行运算
Python 使用 Tkinter 写一个计算器 (与windows自带的类似)_第4张图片 Python 使用 Tkinter 写一个计算器 (与windows自带的类似)_第5张图片
篇幅问题不一 一展示,欢迎各位提出修改意见,补充使其更加完美

完整代码如下:

import tkinter as tk #导入tkinter模块
import math as m

#创建一个跟窗口
root  = tk.Tk()
root.minsize(280,470)
root.title('一直没有脚的猪的计算器')

#1.界面布局
#显示面板
result1 = tk.StringVar()
result1.set(0)                           #显示面板显示结果1,用于显示默认数字0
result2 = tk.StringVar()           #显示面板显示结果2,用于显示计算过程
result2.set('')
#显示屏幕
screen2 = tk.Label(root,font = ('微软雅黑',20),bg = '#EEE9E9',bd ='9',fg = 'black',textvariable=result1,anchor='se')
screen2.place(width = 280,height = 170)
screen1 = tk.Label(root,font = ('微软雅黑',30),bg = '#EEE9E9',bd ='9',fg = 'black',textvariable=result2,anchor='se')
screen1.place(width = 280,height = 110)
#从上往下第一行
buttonmod = tk.Button(root,font = ('微软雅黑',20),text='%',bd ='0.5',fg = 'black',command=lambda : pressfunction('//'))
buttonmod.place(x=0,y=170,width=70,height=50)
buttonsqrt = tk.Button(root,font = ('微软雅黑',20),text='√',bd ='0.5',fg = 'black',command=lambda : pressfunction('√'))
buttonsqrt.place(x=70,y=170,width=70,height=50)
buttonpower = tk.Button(root,font = ('微软雅黑',20),text='x²',bd ='0.5',fg = 'black',command=lambda : pressfunction('x²'))
buttonpower.place(x=140,y=170,width=70,height=50)
buttondowncount = tk.Button(root,font=('微软雅黑',20),text='1/x',bd='0.5',fg = 'black',command=lambda : pressfunction('1/x'))
buttondowncount.place(x=210,y=170,width=70,height=50)
#第二行
buttonce = tk.Button(root,font=('微软雅黑',20),text='CE',bg='orange',bd='0.5',fg='black',command=lambda : pressfunction('CE'))
buttonce.place(x=0,y=220,width=70,height=50)
buttonc = tk.Button(root,font=('微软雅黑',20),text='C',bd='0.5',fg='black',command=lambda : pressfunction('C'))
buttonc.place(x=70,y=220,width=70,height=50)
buttondelete = tk.Button(root,font=('微软雅黑',20),text='←',bd='0.5',fg='black',command=lambda : pressfunction('←'))
buttondelete.place(x=140,y=220,width=70,height=50)
buttondiv = tk.Button(root,font=('微软雅黑',20),text='÷',bd='0.5',fg='black',command=lambda : pressfunction('/'))
buttondiv.place(x=210,y=220,width=70,height=50)
#第三行
button7 = tk.Button(root,font=('微软雅黑',20),text='7',bd='0.5',bg='white',command= lambda : pressnumber('7'))
button7.place(x=0,y=270,width=70,height=50)
button8 = tk.Button(root,font=('微软雅黑',20),text='8',bd='0.5',bg='white',command=lambda : pressnumber('8'))
button8.place(x=70,y=270,width=70,height=50)
button9 = tk.Button(root,font=('微软雅黑',20),text='9',bd='0.5',bg='white',command=lambda : pressnumber('9'))
button9.place(x=140,y=270,width=70,height=50)
buttonmul = tk.Button(root,font=('微软雅黑',20),text='×',bd='0.5',fg='black',command=lambda : pressfunction('*'))
buttonmul.place(x=210,y=270,width=70,height=50)
#第四行
button4 = tk.Button(root,font=('微软雅黑',20),text='4',bd='0.5',bg='white',command=lambda : pressnumber('4'))
button4.place(x=0,y=320,width=70,height=50)
button5 = tk.Button(root,font=('微软雅黑',20),text='5',bd='0.5',bg='white',command=lambda : pressnumber('5'))
button5.place(x=70,y=320,width=70,height=50)
button6 = tk.Button(root,font=("微软雅黑",20),text='6',bd='0.5',bg='white',command=lambda : pressnumber('6'))
button6.place(x=140,y=320,width=70,height=50)
buttonsub = tk.Button(root,font=('微软雅黑',20),text='-',bd='0.5',fg='black',command=lambda : pressfunction('-'))
buttonsub.place(x=210,y=320,width=70,height=50)
#第五行
button1 = tk.Button(root,font=('微软雅黑',20),text='1',bd='0.5',bg='white',command=lambda : pressnumber('1'))
button1.place(x=0,y=370,width=70,height=50)
button2 = tk.Button(root,font=('微软雅黑',20),text='2',bd='0.5',bg='white',command=lambda : pressnumber('2'))
button2.place(x=70,y=370,width=70,height=50)
button3 = tk.Button(root,font=("微软雅黑",20),text='3',bd='0.5',bg='white',command=lambda : pressnumber('3'))
button3.place(x=140,y=370,width=70,height=50)
buttonadd = tk.Button(root,font=('微软雅黑',20),text='+',bd='0.5',fg='black',command=lambda : pressfunction('+'))
buttonadd.place(x=210,y=370,width=70,height=50) 
#第六行
buttoninverse = tk.Button(root,font=("微软雅黑",20),text='±',bd='0.5',fg='black',command=lambda : pressfunction('±'))
buttoninverse.place(x=0,y=420,width=70,height=50)
button0 = tk.Button(root,font=("微软雅黑",20),text='0',bd='0.5',bg='white',command=lambda : pressnumber('0'))
button0.place(x=70,y=420,width=70,height=50)
buttonpoint = tk.Button(root,font=("微软雅黑",20),text='.',bd='0.5',fg='black',command=lambda : pressnumber('.'))
buttonpoint.place(x=140,y=420,width=70,height=50)
buttonvalue = tk.Button(root,font=("微软雅黑",20),text='=',bd='0.5',bg='orange',fg='black',command=lambda : pressequal())
buttonvalue.place(x=210,y=420,width=70,height=50)

#操作函数
lists = []                            #设置一个变量 保存运算数字和符号的列表
ispressfunction = False                  #添加一个判断是否按下运算符号的标志,假设默认没有按下按钮
ispressnumber = False
ispressequal = False

#数字函数 判断是否按下数字 并获取数字将数字写在显示版上
def pressnumber(num):                   
    global lists                     #全局化lists
    global ispressfunction     #按钮状态ispressfunction
    global ispressequal         #全局化等号状态ispressfunction

    if ispressequal == False :  #计算完一个结果后 重新输入数据
        pass
    else :
        ispressequal = False       #重新将等号设置为0
        result1.set('')
    
    if ispressfunction == False:
        pass
    else:                            #重新将运算符号状态设置为0
        result1.set(0)
        ispressfunction = False
    oldnum = result1.get()   #第一步判断界面的数字是否为0
    if oldnum =='0':                 #如过界面上数字为0 则获取按下的数字
        result1.set(num)
    else:                            #如果界面上的而数字不是0  则链接上新按下的数字
        newnum = oldnum + num
        result1.set(newnum)        #将按下的数字写到面板中

#按功能键函数 判断是否按下功能键
def pressfunction(stringlist):
    global lists
    global ispressfunction
    global ispressequal

    num = result1.get()    #获取界面数字
    lists.append(num)   #将界面上的数字添加到lists列表中
    shizi = ''      #设置一个字符串将每次点击功能键后的式子显示到屏幕2上

    ispressfunction = True

    if stringlist in ['-','+','/','*','//']:     #如果是常规运算符 加、减、乘、除、取余 那么直接将lists存入列表中
        
        lists.append(stringlist)              #将按下的运算符号保存到列表中
        for each in lists :
            shizi += each

    if stringlist not in ['C','CE','←','±']:  #如果按的不是这些特殊按键则将按键加入式子 之后显示在label2框中
        result2.set(shizi)	

    if stringlist in ['√','x²','1/x']:		#如果按的是开根号,平方根,倒数

        if stringlist == '√':		#如果取的数开根号
            list1 = []				
            numnow = result1.get()		#获取点击根号前 屏幕上的数字
            list1.append("sqrt(" + numnow + ")")	#将要在屏幕上输出的式子形式加入lists1中
            sqrt1 = m.sqrt(int(numnow))			#用math模块计算结果
            result2.set(list1)			#将式子显示在label2中
            result1.set(sqrt1)			#将结果显示在lists2中
        elif stringlist == 'x²':		#获取点击平方前 屏幕上的数字 之后类似
            list1 = []
            numnow = result1.get()
            list1.append("power(" + numnow + ",2)")
            power1 = m.pow(int(numnow),2)
            result2.set(list1)
            result1.set(power1)
        else:
            list1 = []
            numnow = result1.get()
            list1.append("1/" + numnow)
            countback1 = 1/int(numnow)
            result2.set(list1)
            result1.set(countback1)

    if stringlist =='C':                #如果按下的是'C'按键,则清空当前输入的数字,将其设为0
        lists.pop()                        #以及之前存留在列表中的数
        result1.set(0)
        ispressfunction = False                  #添加一个判断是否按下运算符号的标志,假设默认没有按下按钮
        ispressnumber = False
        ispressequal = False
    if stringlist =='CE':               #如果按下的是'CE'按键,则清空列表内容,讲屏幕上的数字键设置为默认数字0
        lists.clear()
        result1.set(0)
        result2.set('')
    if stringlist =='←':                 #如果按下的是退格‘’,则选取当前数字第一位到倒数第二位
        a = num[0:-1]
        lists.pop()				#将原来lists中添加的未退格的数字去除
        result1.set(a)
    if stringlist =='±':        #如果按下的是取反
        lists.pop()         #将原来lists中添加的未取反的数字去除
        num = str(int(0-int(num)))
        result1.set(num)

#获取运算结果函数
def pressequal():
    global lists
    global ispressfunction
    global ispressequal

    ispressequal = True             #将等号
    curnum = result1.get()           #设置当前数字变量,并获取添加到列表
    lists.append(curnum)              #将点下'='时的数字加入列表中
    computrStr = ''.join(lists)     #讲列表内容用join命令将字符串链接起来
    endnum = eval(computrStr)       #用eval命令运算字符串中的内容
    result1.set(endnum)                   #讲运算结果显示到屏幕1
    result2.set(computrStr)         #将运算过程显示到屏幕2
    lists.clear()                   #清空列表内容

root.mainloop()

你可能感兴趣的:(自己瞎搞搞)