课程视频链接
跟着麦叔学Python:https://b23.tv/Xx9NV0
第一部分:熟悉VSCODE
-
快捷键:
Ctrl+Shift+P 调出命令行,esc退出
alt 上下分窗口 -
创建pip镜像:
-
安装插件:
检查格式错误 Linter pylint -
小tip:用户定义代码片段
第二部分:学习数学运算
第三部分:用Thinter搭建计算器
- 普通模式
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()
- 增添菜单和文艺模式
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文件。