用十种编程语言开发计算器应用-第三篇-Python

用十种编程语言开发计算器应用

  1. C语言
  2. C#(windows桌面软件)
  3. Swift (ios应用)
  4. python
  5. Dart(Flutter应用,跨平台,适用安卓、ios、mac、windows、web)
  6. Java(安卓App)
  7. Kotlin (安卓App)
  8. Js+Html+Vue(H5应用)
  9. 微信小程序
  10. 抖音小程序
image

Python语言版

请添加图片描述

开发工具

Pycharm


image

工程截图

image

关键代码文件

  • calculator.py 绘制计算器界面及逻辑处理程序
import tkinter as tk


def printout(result1, result2, frm):
    label1 = tk.Label(frm, font=('微软雅黑', 20), bg='#0a0a0a', bd='9', fg='#ffffff', anchor='se', textvariable=result1)
    label1.place(relx=1, rely=0.5, relwidth=1, relheight=0.5, anchor='se')
    label2 = tk.Label(frm, font=('微软雅黑', 20), bg='#0a0a0a', bd='9', fg='#ffffff', anchor='se', textvariable=result2)
    label2.place(relx=1, rely=1, relwidth=1, relheight=0.5, anchor='se')


def layout(root, result1, result2):
    frm1 = tk.Frame(root)
    frm1.config(width=320, height=100, relief='solid')

    printout(result1, result2, frm1)
    frm1.grid(row=0, column=0)
    frm1.grid_propagate(0)
    frm1.update()

    frm2 = tk.Frame(root)
    frm2.config(width=320, height=400, bg='#dfe9f4', relief='solid')
    layout_button(frm2)

    frm2.grid(row=1, column=0)
    frm2.grid_propagate(0)


def layout_button(frm):
    btn7 = tk.Button(frm, text='7', font=('微软雅黑', 20), bg='#f1f5fa', command=lambda: press_num('7'))
    btn7.place(relx=0.125, rely=0.125, relwidth=0.23, relheight=0.23, anchor='center')
    btn8 = tk.Button(frm, text='8', font=('微软雅黑', 20), bg='#f1f5fa', command=lambda: press_num('8'))
    btn8.place(relx=0.375, rely=0.125, relwidth=0.23, relheight=0.23, anchor='center')
    btn9 = tk.Button(frm, text='9', font=('微软雅黑', 20), bg='#f1f5fa', command=lambda: press_num('9'))
    btn9.place(relx=0.625, rely=0.125, relwidth=0.23, relheight=0.23, anchor='center')
    btn4 = tk.Button(frm, text='4', font=('微软雅黑', 20), bg='#f1f5fa', command=lambda: press_num('4'))
    btn4.place(relx=0.125, rely=0.375, relwidth=0.23, relheight=0.23, anchor='center')
    btn5 = tk.Button(frm, text='5', font=('微软雅黑', 20), bg='#f1f5fa', command=lambda: press_num('5'))
    btn5.place(relx=0.375, rely=0.375, relwidth=0.23, relheight=0.23, anchor='center')
    btn6 = tk.Button(frm, text='6', font=('微软雅黑', 20), bg='#f1f5fa', command=lambda: press_num('6'))
    btn6.place(relx=0.625, rely=0.375, relwidth=0.23, relheight=0.23, anchor='center')
    btn1 = tk.Button(frm, text='1', font=('微软雅黑', 20), bg='#f1f5fa', command=lambda: press_num('1'))
    btn1.place(relx=0.125, rely=0.625, relwidth=0.23, relheight=0.23, anchor='center')
    btn2 = tk.Button(frm, text='2', font=('微软雅黑', 20), bg='#f1f5fa', command=lambda: press_num('2'))
    btn2.place(relx=0.375, rely=0.625, relwidth=0.23, relheight=0.23, anchor='center')
    btn3 = tk.Button(frm, text='3', font=('微软雅黑', 20), bg='#f1f5fa', command=lambda: press_num('3'))
    btn3.place(relx=0.625, rely=0.625, relwidth=0.23, relheight=0.23, anchor='center')
    btn10 = tk.Button(frm, text='0', font=('微软雅黑', 20), bg='#f1f5fa', command=lambda: press_num('0'))
    btn10.place(relx=0.125, rely=0.875, relwidth=0.23, relheight=0.23, anchor='center')
    btn11 = tk.Button(frm, text='.', font=('微软雅黑', 20), bg='#f1f5fa', command=lambda: press_num('.'))
    btn11.place(relx=0.375, rely=0.875, relwidth=0.23, relheight=0.23, anchor='center')

    btn12 = tk.Button(frm, text='=', font=('微软雅黑', 20), bg='#f1f5fa', command=lambda: press_equal())
    btn12.place(relx=0.625, rely=0.875, relwidth=0.23, relheight=0.23, anchor='center')

    btn13 = tk.Button(frm, text='+', font=('微软雅黑', 20), bg='#f1f5fa', command=lambda: press_compute('+'))
    btn13.place(relx=0.875, rely=0.125, relwidth=0.23, relheight=0.23, anchor='center')
    btn13 = tk.Button(frm, text='-', font=('微软雅黑', 20), bg='#f1f5fa', command=lambda: press_compute('-'))
    btn13.place(relx=0.875, rely=0.375, relwidth=0.23, relheight=0.23, anchor='center')
    btn13 = tk.Button(frm, text='X', font=('微软雅黑', 20), bg='#f1f5fa', command=lambda: press_compute('*'))
    btn13.place(relx=0.875, rely=0.625, relwidth=0.23, relheight=0.23, anchor='center')
    btn13 = tk.Button(frm, text='÷', font=('微软雅黑', 20), bg='#f1f5fa', command=lambda: press_compute('/'))
    btn13.place(relx=0.875, rely=0.875, relwidth=0.23, relheight=0.23, anchor='center')


def press_num(num):
    global isintbtn  # 标记按钮按的数字,默认未按
    global isstrbtn  # 标记按钮按的符号,默认未按
    global is_equal_last  # 标记上一个按键
    global last_num  # 记录上一个数字
    global list
    if isstrbtn == False:
        pass
    else:
        result2.set(0)
        isstrbtn = False  # 若上次按键为符号,数字重新清零开始计数
    if is_equal_last == True:
        result2.set(0)  # 等号同理

    oldnum = result2.get()
    if oldnum == '0':
        result2.set(num)
        last_num = num
    else:
        newnum = oldnum + num
        result2.set(newnum)
        last_num = newnum  # 连续按数字,将数字连起来作为新的数字
    is_equal_last = False  # 标记下上个按键已不是等号


def press_compute(sign):
    global isintbtn
    global isstrbtn
    global is_equal_last
    global last_cpt
    global list
    num = result2.get()
    list.append(num)  # 把数字记录到列表中

    list.append(sign)
    isstrbtn = True  # 把符号记录到列表中

    is_equal_last = False
    last_cpt = sign
    cur_out = ''.join(list)
    result1.set(cur_out)  # 上部分显示板显示之前输入的数字


def press_equal():
    global isintbtn
    global isstrbtn
    global is_equal_last
    global last_num
    global list
    if is_equal_last == False:
        curnum = result2.get()
        list.append(curnum)
        computeStr = ''.join(list)
        endnum = eval(computeStr)  # 使用eval函数将list内容计算出结果

        result2.set(endnum)
        result1.set(computeStr)  # 将计算结果和内容显示在显示板上
        is_equal_last = True  # 标记此时最后一个按键是等号
        list.clear()  # 清空list
    else:
        curnum = result2.get()  # 如果上次按键是等号,记录上次的计算结果
        list.append(curnum)
        list.append(last_cpt)
        list.append(str(last_num))  # 将计算结果、最后一次的符号、最后一个数字添加到list中
        # print(list)

        computeStr = ''.join(list)
        endnum = eval(computeStr)
        # print(computeStr)

        result2.set(endnum)
        result1.set(computeStr)
        is_equal_last = True
        list.clear()  # 按照新的list计算结果并显示


root = tk.Tk()
root.title("计算器-花生皮编程")
root['bg'] = '#181818'
root.geometry("320x500")

isintbtn = False  # 确认是否按下了计算符,默认为未按下
isstrbtn = False
is_equal_last = False  # 确认上一个按键是不是等号,便于处理连续按了等号的情况
last_num = []  # 上一个数字保存
last_cpt = ''  # 上一个计算符号保存,便与处理如果连续按了等号的情况
list = []  # 保存按下的数据和字符,一是用于最终结果计算,而是现实在上面现实板上
result1 = tk.StringVar()
result1.set('')  # 上面显示板,默认显示空
result2 = tk.StringVar()
result2.set(0)  # 下面显示板,默认显示0

layout(root, result1, result2)

root.mainloop()

完整源代码

https://gitee.com/hspbc/calculators

image

系列文章

用十种编程语言开发计算器应用-第一篇-C语言
用十种编程语言开发计算器应用-第二篇-Java
用十种编程语言开发计算器应用-第三篇-Python
用十种编程语言开发计算器应用-第四篇-Kotlin
用十种编程语言开发计算器应用-第五篇-Flutter
用十种编程语言开发计算器应用-第六篇-iOS
用十种编程语言开发计算器应用-第七篇-h5(Js+Html+Vue)
用十种编程语言开发计算器应用-第八篇-微信小程序
用十种编程语言开发计算器应用-第九篇-抖音小程序
用十种编程语言开发计算器应用-第十篇-C#(Windows桌面软件)

关于我

厦门大学计算机专业|华为八年高级工程师
十年软件开发经验,5年编程培训教学经验
目前从事编程教学,软件开发指导,软件类毕业设计指导。
所有编程资料及开源项目见https://cxyxy.blog.csdn.net/article/details/120405881

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

推荐阅读更多精彩内容