python学习第三节:小麦计算器(操作符、数学运算)

本博客主要介绍了Python的学习,通过Thinter库构建一个计算器应用,并讲解了数学运算,最后展示了如何将Python脚本打包成可执行的exe文件。
摘要由CSDN通过智能技术生成

课程视频链接

跟着麦叔学Python:https://b23.tv/Xx9NV0

第一部分:熟悉VSCODE

  1. 快捷键:
    Ctrl+Shift+P 调出命令行,esc退出
    alt 上下分窗口

  2. 创建pip镜像:
    在这里插入图片描述

  3. 安装插件:
    检查格式错误 Linter pylint

  4. 小tip:用户定义代码片段
    在这里插入图片描述

第二部分:学习数学运算

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

第三部分:用Thinter搭建计算器

在这里插入图片描述

  1. 普通模式
from tkinter import *
import re    # 引入正则保护
root = Tk()  # 创建一个根窗口

''' ##基础讲解 
#1.创建组件,创建组件的时候一定要指定组件所在的容器
op1 = Entry(root)
op2 = Entry(root)

#2.需要把组件显示出来:grid,pack
# op1.pack(fill=BOTH) #生成一个框,both会占满整行
# op2.pack()
op1.grid(row=0, column=0)  #网格型
op2.grid(row=0, column=1 )

root.geometry('500x500+100+100')  #指定画面大小和左上角位置
mainloop()
'''

# 0.创建运算方法,保证输入有效性


'''
# 0.1:第一种方法:简易保护
def cmd_add():
    try:   
        op1_value = float(op1.get())   # get方法,读入的值时字符串,需要变浮点数
        op2_value = float(op2.get())
        res = op1_value + op2_value
        res_var.set(res)     # set方法
    except:
        res_var.set('请输入正确的操作数')
'''


# 0.2:第二种方法:正则表达式保护

'''
    验证输入是否合法
    如-228.34, 23.5, +127等
    1.开头结尾符号:^ $
    2.正负开头,有一个或者没有:[+-]?
    3.整数部分,有一个或者多个数字:[\d]+
    4.小数点,有一个或者没有:[.]?
    5.小数部分,没有或者有一个、多个数字:[\d]*
    6.整体规则为:reg = '^[+-]?[\d]+[.]?[\d]*$'
'''

def validate_input():
    reg = '^[+-]?[\d]+[.]?[\d]*$'
    r1 = re.match(reg, op1.get())  # match方法,正确返回true
    r2 = re.match(reg, op2.get())
    return r1 and r2 #两个都正确返回true

def cmd_math(ops):
    is_valid = validate_input()
    if(is_valid):
        op1_value = float(op1.get())   # get方法,读入的值时字符串,需要变浮点数
        op2_value = float(op2.get())
        if(ops == '+'):
            res = op1_value + op2_value
        elif(ops == '-'):
            res = op1_value - op2_value
        elif(ops == '*'):
            res = op1_value * op2_value
        elif(ops == '/'):
            res = op1_value / op2_value
        elif(ops == '%'):
            res = op1_value % op2_value
        elif(ops == '//'):
            res = op1_value // op2_value     
        elif(ops == '**'):
            res = op1_value ** op2_value  
        res_var.set(res)     # set方法
    else:
        res_var.set('请输入正确的操作数')

def cmd_clr():
    op1.delete(0,END)  #学会自己转入定义学习方法
    op2.delete(0,END)


# 1.创建组件
#   以下共创建了三种组件:Entry(可供输入), Button, Label, 其中Label的值可以传入变量

A = Label(root, text='操作数1', padx=50, pady=10)  # padx,pady来指定组件大小
B = Label(root, text='操作数2', padx=50, pady=10)
op1 = Entry(root)
op2 = Entry(root)
btn_add = Button(root, text='+', padx=50, pady=10, command=lambda: cmd_math('+'))  # 传入命令,lambda函数,如果直接传命令没按按钮就会进行
btn_sub = Button(root, text='-', padx=50, pady=10, command=lambda: cmd_math('-'))
btn_mul = Button(root, text='*', padx=50, pady=10, command=lambda: cmd_math('*'))
btn_div = Button(root, text='/', padx=50, pady=10, command=lambda: cmd_math('/'))
btn_mod = Button(root, text='%', padx=50, pady=10, command=lambda: cmd_math('%'))
btn_flo = Button(root, text='//', padx=50, pady=10, command=lambda: cmd_math('//'))
btn_exp = Button(root, text='**', padx=50, pady=10, command=lambda: cmd_math('**'))
btn_clr = Button(root, text='Clear', padx=50, pady=10, command=cmd_clr)
res_var = StringVar()       #设为可变字符串
res_var.set('Show result')
result = Label(root, textvariable=res_var, pady=50)


# 2.显示组件grid

A.grid(row=0, column=0, sticky='WE')   # columnspan指定该组件占位所跨列数, sticky指定组件是否填充东西南北
op1.grid(row=0, column=1, columnspan=3, sticky='WENS')  
B.grid(row=1, column=0, sticky='WE')
op2.grid(row=1, column=1, columnspan=3, sticky='WENS')
btn_add.grid(row=2, column=0, sticky='WE')
btn_sub.grid(row=2, column=1, sticky='WE')
btn_mul.grid(row=2, column=2, sticky='WE')
btn_div.grid(row=2, column=3, sticky='WE')
btn_mod.grid(row=3, column=0, sticky='WE')
btn_flo.grid(row=3, column=1, sticky='WE')
btn_exp.grid(row=3, column=2, sticky='WE')
btn_clr.grid(row=3, column=3, sticky='WE')
result.grid(row=4, column=0, columnspan=4, sticky='WE')

root.geometry()  #画面大小自适应
mainloop()

在这里插入图片描述

  1. 增添菜单和文艺模式
from tkinter import *
import re    # 引入正则保护

root = Tk()  # 创建一个根窗口


# ------0.创建运算方法,保证输入有效性----------------------

def validate_input():
    reg = '^[+-]?[\d]+[.]?[\d]*$'
    r1 = re.match(reg, op1.get())  # match方法,正确返回true
    r2 = re.match(reg, op2.get())
    return r1 and r2 #两个都正确返回true

def cmd_math(ops):
    is_valid = validate_input()
    if(is_valid):
        op1_value = float(op1.get())   # get方法,读入的值时字符串,需要变浮点数
        op2_value = float(op2.get())
        if(ops == '+'):
            res = op1_value + op2_value
        elif(ops == '-'):
            res = op1_value - op2_value
        elif(ops == '*'):
            res = op1_value * op2_value
        elif(ops == '/'):
            res = op1_value / op2_value
        elif(ops == '%'):
            res = op1_value % op2_value
        elif(ops == '//'):
            res = op1_value // op2_value     
        elif(ops == '**'):
            res = op1_value ** op2_value  
        res_var.set(res)     # set方法
    else:
        res_var.set('请输入正确的操作数')

def calc_art():    # 文艺模式使用eval()函数
    ex = op_art.get()
    if(re.match('[a-zA-Z]+', ex)):
        res = ('别乱输,不能有字母')   
    else:
        res = eval(ex) 
    res_str.set(res)
    
def cmd_clr(mod):
    if(mod=='putong'):
        op1.delete(0,END)  #学会自己转入定义学习方法
        op2.delete(0,END)
    elif(mod=='art'):
        op_art.delete(0,END)
            



# ------1.创建菜单和画布---------------------------

'''
# 方法1,只有一层菜单
menubar = Menu(root)
menubar.add_checkbutton(label='普通模式',command=lambda: f1.tkraise()) #直接在根菜单上加按钮
menubar.add_checkbutton(label='文艺模式',command=lambda: f2.tkraise())
root.config(menu=menubar)
'''
# 方法2,两层下拉菜单
menubar = Menu(root)
menu1 = Menu(menubar)
menu1.add_command(label='普通', command=lambda: f1.tkraise())
menu1.add_command(label='文艺', command=lambda: f2.tkraise())
menubar.add_cascade(label='模式', menu=menu1)    # 在根菜单上级联
root.config(menu=menubar)    #配置在根菜单上


# 创建两个画布,f1:普通模式,f2:文艺模式

f2 = Frame(root)
f2.grid(row=0, column=0, sticky='news')
f1 = Frame(root)
f1.grid(row=0, column=0, sticky='news')



# ------2.搭建普通模式---------------------------

# 2.1 创建组件
#   以下共创建了三种组件:Entry(可供输入), Button, Label, 其中Label的值可以传入变量
A = Label(f1, text='操作数1', padx=50, pady=10)  # padx,pady来指定组件大小
B = Label(f1, text='操作数2', padx=50, pady=10)
op1 = Entry(f1)
op2 = Entry(f1)
btn_add = Button(f1, text='+', padx=50, pady=10, command=lambda: cmd_math('+'))  # 传入命令,lambda函数,如果直接传命令没按按钮就会进行
btn_sub = Button(f1, text='-', padx=50, pady=10, command=lambda: cmd_math('-'))
btn_mul = Button(f1, text='*', padx=50, pady=10, command=lambda: cmd_math('*'))
btn_div = Button(f1, text='/', padx=50, pady=10, command=lambda: cmd_math('/'))
btn_mod = Button(f1, text='%', padx=50, pady=10, command=lambda: cmd_math('%'))
btn_flo = Button(f1, text='//', padx=50, pady=10, command=lambda: cmd_math('//'))
btn_exp = Button(f1, text='**', padx=50, pady=10, command=lambda: cmd_math('**'))
btn_clr = Button(f1, text='Clear', padx=50, pady=10, command=lambda: cmd_clr('putong'))
res_var = StringVar()       #设为可变字符串
res_var.set('Show result')
result = Label(f1, textvariable=res_var, pady=50)


# 2.2 显示组件grid
A.grid(row=0, column=0, sticky='WE')   # columnspan指定该组件占位所跨列数, sticky指定组件是否填充东西南北
op1.grid(row=0, column=1, columnspan=3, sticky='WENS')  
B.grid(row=1, column=0, sticky='WE')
op2.grid(row=1, column=1, columnspan=3, sticky='WENS')
btn_add.grid(row=2, column=0, sticky='WE')
btn_sub.grid(row=2, column=1, sticky='WE')
btn_mul.grid(row=2, column=2, sticky='WE')
btn_div.grid(row=2, column=3, sticky='WE')
btn_mod.grid(row=3, column=0, sticky='WE')
btn_flo.grid(row=3, column=1, sticky='WE')
btn_exp.grid(row=3, column=2, sticky='WE')
btn_clr.grid(row=3, column=3, sticky='WE')
result.grid(row=4, column=0, columnspan=4, sticky='WE')



# ------3.搭建文艺模式---------------------------

op_art = Entry(f2)
btn_art = Button(f2, text='计算', command=lambda: calc_art())   #必须用lambda,要不然执行eval('')会报错 
clr_art = Button(f2, text='Clear', command=lambda: cmd_clr('art'))
res_str = StringVar()
res_str.set('计算结果显示在这里')
label_art = Label(f2, textvariable=res_str)

op_art.pack(fill=BOTH) # 用填充的方法
btn_art.pack(fill=BOTH)
clr_art.pack(fill=BOTH)
label_art.pack(fill=BOTH)


root.geometry()  #画面大小自适应
mainloop()

在这里插入图片描述

第四部分:打包成可执行文件exe

在cmd中转到py文件所在文件夹,输入pyinstaller --onefile calc_2.py(文件名),即可在文件夹中dist目录下找到exe文件。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值