前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >小朋友学Python(30):实现带UI的简易计算器(下)

小朋友学Python(30):实现带UI的简易计算器(下)

作者头像
海天一树
发布2018-04-17 11:19:53
9890
发布2018-04-17 11:19:53
举报
文章被收录于专栏:海天一树

一、最终效果

8.png

二、完整程序

代码语言:javascript
复制
import tkinter #导入tkinter模块
#定义数值
w = 280                    #整个界面的宽度
h = 480                    #整个界面的高度
processH = 120            #存放计算过程的Label的高度
resultH = 60            #存放计算结果的Label的高度
btnWidth = 70            #按纽宽度
btnHeight = 60            #按纽高度
msfont = '微软雅黑'        #微软雅黑字体
fontSize = 20            #字体大小
btnFgColor = '#4F4F4F'    #按纽颜色
btnBorderWidth = 0.5    #按纽边框粗细
#面板设置
root = tkinter.Tk()
root.minsize(w,h)                        #面板大小的最小值
root.title('海天一树的计算器')            #面板的标题
process = tkinter.StringVar()           #字符串用于存放计算过程,初始状态为空
process.set('')
result = tkinter.StringVar()            #字符串用于存放计算结果,初始状态为0
result.set(0)                           
#labelProcess用于显示计算过程,labelResult用于显示计算结果
labelProcess = tkinter.Label(root,font = (msfont,fontSize),bg = '#EEE9E9',bd ='9',fg = '#828282',anchor = 'se',textvariable = process)
labelProcess.place(width = w,height = processH)
labelResult = tkinter.Label(root,font = (msfont,30),bg = '#EEE9E9',bd ='9',fg = 'black',anchor = 'se',textvariable = result)
labelResult.place(y = processH,width = w,height = resultH)
#数字按键
btn7 = tkinter.Button(root,text = '7',font = (msfont,fontSize),fg = (btnFgColor),bd = btnBorderWidth,command = lambda : clickNum('7'))
btn7.place(x = 0,y = processH + resultH + btnHeight,width = btnWidth,height = btnHeight)
btn8 = tkinter.Button(root,text = '8',font = (msfont,fontSize),fg = (btnFgColor),bd = btnBorderWidth,command = lambda : clickNum('8'))
btn8.place(x = btnWidth,y = processH + resultH + btnHeight,width = btnWidth,height = btnHeight)
btn9 = tkinter.Button(root,text = '9',font = (msfont,fontSize),fg = (btnFgColor),bd = btnBorderWidth,command = lambda : clickNum('9'))
btn9.place(x = 2 * btnWidth,y = processH + resultH + btnHeight,width = btnWidth,height = btnHeight)
btn4 = tkinter.Button(root,text = '4',font = (msfont,fontSize),fg = (btnFgColor),bd = btnBorderWidth,command = lambda : clickNum('4'))
btn4.place(x = 0,y = processH + resultH + 2 * btnHeight,width = btnWidth,height = btnHeight)
btn5 = tkinter.Button(root,text = '5',font = (msfont,fontSize),fg = (btnFgColor),bd = btnBorderWidth,command = lambda : clickNum('5'))
btn5.place(x = btnWidth,y = processH + resultH + 2 * btnHeight,width = btnWidth,height = btnHeight)
btn6 = tkinter.Button(root,text = '6',font = (msfont,fontSize),fg = (btnFgColor),bd = btnBorderWidth,command = lambda : clickNum('6'))
btn6.place(x = 2 * btnWidth,y = processH + resultH + 2 * btnHeight,width = btnWidth,height = btnHeight)
btn1 = tkinter.Button(root,text = '1',font = (msfont,fontSize),fg = (btnFgColor),bd = btnBorderWidth,command = lambda : clickNum('1'))
btn1.place(x = 0,y = processH + resultH + 3 * btnHeight,width = btnWidth,height = btnHeight)
btn2 = tkinter.Button(root,text = '2',font = (msfont,fontSize),fg = (btnFgColor),bd = btnBorderWidth,command = lambda : clickNum('2'))
btn2.place(x = btnWidth,y = processH + resultH + 3 * btnHeight,width = btnWidth,height = btnHeight)
btn3 = tkinter.Button(root,text = '3',font = (msfont,fontSize),fg = (btnFgColor),bd = btnBorderWidth,command = lambda : clickNum('3'))
btn3.place(x = 2 * btnWidth,y = processH + resultH + 3 * btnHeight,width = btnWidth,height = btnHeight)
btn0 = tkinter.Button(root,text = '0',font = (msfont,fontSize),fg = (btnFgColor),bd = btnBorderWidth,command = lambda : clickNum('0'))
btn0.place(x = btnWidth,y = processH + resultH + 4 * btnHeight,width = btnWidth,height = btnHeight)
#运算符号按键
btnac = tkinter.Button(root,text = 'AC',bd = btnBorderWidth,font = ('黑体',fontSize),fg = 'orange',command = lambda :clickSign('AC'))
btnac.place(x = 0,y = processH + resultH,width = btnWidth,height = btnHeight)
btnback = tkinter.Button(root,text = '←',font = (msfont,fontSize),fg = btnFgColor,bd = btnBorderWidth,command = lambda:clickSign('b'))
btnback.place(x = btnWidth,y = processH + resultH,width = btnWidth,height = btnHeight)
btndiv = tkinter.Button(root,text = '÷',font = (msfont,fontSize),fg = btnFgColor,bd = btnBorderWidth,command = lambda:clickSign('/'))
btndiv.place(x = 2 * btnWidth,y = processH + resultH,width = btnWidth,height = btnHeight)
btnmul = tkinter.Button(root,text ='×',font = (msfont,fontSize),fg = btnFgColor,bd = btnBorderWidth,command = lambda:clickSign('*'))
btnmul.place(x = 3 * btnWidth,y = processH + resultH,width = btnWidth,height = btnHeight)
btnsub = tkinter.Button(root,text = '-',font = (msfont,fontSize),fg = (btnFgColor),bd = btnBorderWidth,command = lambda:clickSign('-'))
btnsub.place(x = 3 * btnWidth,y = processH + resultH + btnHeight,width = btnWidth,height = btnHeight)
btnadd = tkinter.Button(root,text = '+',font = (msfont,fontSize),fg = (btnFgColor),bd = btnBorderWidth,command = lambda:clickSign('+'))
btnadd.place(x = 3 * btnWidth,y = processH + resultH + 2 * btnHeight,width = btnWidth,height = btnHeight)
btnequ = tkinter.Button(root,text = '=',bg = 'orange',font = (msfont,fontSize),fg = (btnFgColor),bd = btnBorderWidth,command = lambda :clickEqual())
btnequ.place(x = 3 * btnWidth,y = processH + resultH + 3 * btnHeight,width = btnWidth,height = 2 * btnHeight)
btnper = tkinter.Button(root,text = '%',font = (msfont,fontSize),fg = (btnFgColor),bd = btnBorderWidth,command = lambda:clickPer())
btnper.place(x = 0,y = processH + resultH + 4 * btnHeight,width = btnWidth,height = btnHeight)
btnpoint = tkinter.Button(root,text = '.',font = (msfont,fontSize),fg = (btnFgColor),bd = btnBorderWidth,command = lambda:clickNum('.'))
btnpoint.place(x = 2 * btnWidth,y = processH + resultH + 4 * btnHeight,width = btnWidth,height = btnHeight)
#点击数字
lists = []                             #数组,保存数字和运算符
isSignClicked = False                  #是否点击了符号按纽
isEqualClicked = False                #是否点击了等号按纽
def clickNum(num):                   
    global lists                    #将lists变量设为全局变量
    global isSignClicked            #将isSignClicked变量设为全局变量
    global isEqualClicked
    if True == isSignClicked:                   
        result.set(0)                #如果上次按过运算符,那么这次要把原先的数字清空,否则会加在上次那个数的末尾
        isSignClicked = False
    if True == isEqualClicked:
        result.set(0)
        isEqualClicked = True
    #判断界面的数字是否为0
    oldnum = result.get()              #第一步
    if '0' == oldnum:                  #如果界面上数字为0 则获取按下的数字
        result.set(num)
    else:                             #如果界面上的数字不为0  则链接上新按下的数字
        newnum = oldnum + num
        result.set(newnum)             #将按下的数字写到面板中
#点击运算符号(等号除外)
def clickSign(sign):
    global lists
    global isSignClicked
    num = result.get()              #获取界面数字
    if 0 == num.find('='):            #在连续计算时,若得到的是“=15”,要去掉等号,取其数字
        num = num[1:len(num)]
    lists.append(num)               #将界面获取的数字保存列表中
    lists.append(sign)              #将运算符号保存到列表中
    isSignClicked = True
    if 'AC' ==  sign:                  #如果按下的是'AC'按键,则清空列表内容,并将屏幕上的数字设置为默认值0
        lists.clear()
        process.set('')
        result.set(0)
    if 'b' ==  sign:                  #如果按下的是退格按纽,则选取当前数字第一位到倒数第二位
        a = num[0:-1]
        lists.clear()
        result.set(a)
        if 0 == len(a):                #如果是最后一个数,退格后变成0
            result.set(0)
#求百分值
def clickPer():
    curval = result.get()
    lists.append(curval)
    lists.append('/')
    lists.append('100')
    res = ''.join(lists)
    res = eval(res)
    result.set(res)
    lists.clear()
#获取运算结果
def clickEqual():
    global lists
    global isEqualClicked
    isEqualClicked = True
    curval = result.get()           #将界面上的数字添加到列表中
    lists.append(curval)
    proc = ''.join(lists)             #将列表内容用join命令将字符串链接起来
    res = eval(proc)                   #用eval命令运算字符串中的内容
    res = '='+str(res)              #给运算结果前添加一个 ‘=’ 显示 
    res = res[0:10]                 #所有的运算结果取9位数
    process.set(proc)                 #显示运算过程
    result.set(res)                 #显示运算结果
    lists.clear()                   #清空lists数组中的内容
root.mainloop()

三、Github源码下载

下载

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-03-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 海天一树 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、最终效果
  • 二、完整程序
  • 三、Github源码下载
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档