手把手教python打包exe,打包一个简易的小程序。tkinter,python初学者。编程初学者作业:用*填充出自己的名字
Posted cqu.rol
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了手把手教python打包exe,打包一个简易的小程序。tkinter,python初学者。编程初学者作业:用*填充出自己的名字相关的知识,希望对你有一定的参考价值。
【声明】这篇文章可能写的很差,作者技术不够。但是一定原创,一定用最简单的语言,最详细的描述让没有经验的读者能够懂得
【首言】exe是电脑上直接点击就可以使用的。当你写了一个.py文件,可以实现你的有趣功能,于是你高兴的把这个发送给你的朋友,但是你的朋友没有ptyhon环境(环境:idle,指python基本的软件。或者有python这个软件,但是你的程序需要用到某个模块,比如pygame(模块是指前辈们写好的,可以直接下载后运用某些简单的命令实现厉害的功能,比如pygame可以制作游戏,设置窗口,加载图片,音乐等等)所以我们需要打包成exe文件,这样不管别人的电脑有没有python,都可以点击直接运行。
一,打包介绍:
实现打包的也是一个模块,名字 pyinstaller ,安装即可
可以在桌面按下[win]键+R键 输入cmd进入cmd。输入命令 pip install pyinstaller回车
完成后输入pip list可以查看已安装的模块目录
pycharm可以点击file--setting--project。点这里的加号添加该pyinstaller模块
打包实例
二, 打包演示:
这是一个非常简单但效果明显的例子。引用pyttsx3模块(可以用来发出声音,方便测试,并且该模块需要自行下载,更加验证其可执行性)
好了,我们来到mai.py所在的文件夹
点击这里,输入cmd就进入了此文件夹的cmd空间,你会发现默认行前面增加了文件位置前缀,
就像python打开txt文档,如果是同级文件夹进行,只需要txt的名字即可。否则需要txt的绝对地址(c/user/……)
进入cmd后,输入 pyinstaller -F mai.py (改成py文件的名字)
提示成功打包,
多了这些文件,dist文件夹里有个exe,点击就可以运行。其他的文件没用可删
注意点:
1,有可能windows系统把程序当成病毒删了或者不让打开,在右下角安全中心选择操作--允许出现在设备上即可
2,pyinstaller -F -w -i xxx.ico xx.py命令可以改变图标,需要一个图标网站,将心仪的图片转化为ico图标文件(自行更改后缀名不管用)
3,打包内存大小可能很大,主要是打包类似于将你所需要的模块一起打包进去,又可能打包了一些无用模块,再加上他自身必须要用一部分位置。不太容易解决此问题
4,打包后import引用的模块可以直接使用。如果在代码行增加如下代码
try:
f=open("add.txt", "r", encoding="utf-8").read() # 读取add文档里的内容,以兼容中文的方式(encoding=utf-8)
exec(f) # 这个是成段的eval
except:
pass # 如果代码中有错就跳过
这样你只需要更改add.txt的内容就可以更改exe程序的作用。如果你想更改某功能,只需要发给朋友一个add.txt,几kb即可解决,而不需要重新发送30MB的软件
三,填充文字实例:
普通窗口打包点击是这样的窗口,看着不太好看。运用tkinter模块即可美化(教程很多)
这样就好看一些(如下)
有朋友的作业是打印输出自己的名字,用*号填充,手写太累
可以先写在名字截图,在ppt中插入图片调整透明度,然后文字框写入 *
更为高级的方法是:pil可以读取每个像素点的颜色,如果是黑就填充
import tkinter as tk # 界面设计模块
from tkinter import filedialog # 选择图片模块
from PIL import ImageFont # 图片操作
from PIL import Image
from PIL import ImageDraw
import pyperclip # 复制到剪切板模块
首先导入模块,最后一个模块用于把结果粘贴到剪切板上,更为方便
这是将字转换为填充段的函数
这是把文字缩写的函数,因为在python中,字符串可以相加,可以和数字相乘来重复
核心函数已经构建,接下来就是界面设计
置顶,透明度,大小,背景,按钮,标签,输入框统统安排上
而按钮执行的函数,非常简单。这个是直接复制文段函数。
我们读取三个文本框的内容,如果格式正确就进行全局变量(文字,字号,填充)的更改
否则背景标红以示警告。随后运行核心函数1.复制到剪切板即可。
三.1,代码:
import tkinter as tk # 界面设计模块
from tkinter import filedialog # 选择图片模块
from PIL import ImageFont # 图片操作
from PIL import Image
from PIL import ImageDraw
import pyperclip # 复制到剪切板模块
goal_strs = "张三"
word_size = 80
fill_item = "*"
def get_s():
font = ImageFont.truetype("simhei.ttf", word_size) # 写字的字体,字号
im1 = Image.new('RGB', (len(goal_strs)*word_size, word_size), (255, 255, 255)) # 建立新图, 白底
draw = ImageDraw.Draw(im1) # 写字函数
draw.text((0, 0), goal_strs, (0, 0, 0), font=font) # 写字,黑色
img = im1.convert("L")
size_x, size_y = img.size
img = img.resize((size_x, int(size_y/2))) # 由于最后字,每行有行间距,为了看起来正常,所以高度减半
pix = img.load() # 加载我们刚刚制作的图
ss = ""
for n in range(int(word_size/2)):
for m in range(word_size*len(goal_strs)): # 两次循环 找到整张图的每一个点
nt = pix[m, n] # 这个点对应的值
try:
if nt > 100: # 单通道结构(每个点:0-255)
ss += " " # 白色空格
else:
ss += "*" # 黑色*号 之所以运用一个范围是可能那个点不是完全黑或者完全白
except:
if nt[0] > 100: # 多通道结构(每个点:(25, 125, 87))
ss += " "
else:
ss += "*"
ss += "\\n"
img.close()
return ss # 这个函数即是把给的字以这个字号填充
def str_transform_to_print_str(orig_str: str):
srt = orig_str
list1 = srt.split(sep="\\n") # 按行分为列表
list1.remove("") # 减去最后一个空列表,防止后面报错
final_str = ""
for line_str in list1:
s0 = line_str[0] # 这是当前循环字
ct = 1 # 计数
for s in line_str[1::]:
if s == s0: # 如果这个字还是一样的,那么count+1
ct += 1
else:
final_str += "*''+".format(ct, s0) # 否则整体加上已经重复的次数*字符,并且计数清零,字符更改
s0 = s
ct = 1
final_str += "'\\\\n'+"
final_str = final_str[0:-1] # 最后一个是加号
return final_str
def fun1():
tag1.config(bg="white")
tag2.config(bg="white")
tag3.config(bg="white")
global goal_strs, word_size, fill_item
count = 1
if len(ent1.get()) > 0:
goal_strs = ent1.get()
count += 1
else:
tag1.config(bg="red")
try:
word_size = int(ent2.get())
count += 1
except:
tag2.config(bg="red")
if len(ent3.get()) == 1:
fill_item = ent3.get()
count += 1
else:
tag3.config(bg="red")
if count == 4:
next_str = get_s()
pyperclip.copy(next_str)
goal_strs, word_size, fill_item = "张三", 80, "*"
def fun2():
tag1.config(bg="white")
tag2.config(bg="white")
tag3.config(bg="white")
global goal_strs, word_size, fill_item
count = 1
if len(ent1.get()) > 0:
goal_strs = ent1.get()
count += 1
else:
tag1.config(bg="red")
try:
word_size = int(ent2.get())
count += 1
except:
tag2.config(bg="red")
if len(ent3.get()) == 1:
fill_item = ent3.get()
count += 1
else:
tag3.config(bg="red")
if count == 4:
next_str = get_s()
fin_str = str_transform_to_print_str(next_str)
pyperclip.copy(fin_str)
goal_strs, word_size, fill_item = "张三", 80, "*"
def fun3():
open_name = filedialog.askopenfilename(title='待处理 请选择', initialdir=r'D:\\a', filetypes=[("", ".jpg")])
img = Image.open(open_name)
img = img.convert("L")
size_x, size_y = img.size
img = img.resize((size_x, int(size_y / 2)))
pix = img.load()
ss = ""
for n in range(int(word_size / 2)):
for m in range(word_size * len(goal_strs)):
nt = pix[m, n]
try:
if nt > 100:
ss += " "
else:
ss += "*"
except:
if nt[0] > 100:
ss += " "
else:
ss += "*"
ss += "\\n"
pyperclip.copy(ss)
root = tk.Tk()
root.attributes("-topmost", 1)
root.attributes("-alpha", 0.7)
root.geometry("400x300")
tk.Canvas(height=300, width=400, background="white").place(x=0, y=0)
root.resizable(False, False)
tag0 = tk.Label(text="提示:结果在剪切板", bg="white", font=2)
tag0.place(x=100, y=230)
tag1 = tk.Label(text=" 输入:文字(勿多) ", bg="white")
tag1.pack(pady=5)
ent1 = tk.Entry(width=20)
ent1.insert(0, "张三")
ent1.pack(pady=5)
tag2 = tk.Label(text=" 输入:字号(整数) ", bg="white")
tag2.pack(pady=5)
ent2 = tk.Entry(width=20)
ent2.insert(0, "50")
ent2.pack(pady=5)
tag3 = tk.Label(text=" 输入:填充(单个) ", bg="white")
tag3.pack(pady=5)
ent3 = tk.Entry(width=20)
ent3.insert(0, "*")
ent3.pack(pady=5)
bu1 = tk.Button(text="点击开始".format(30*" ", 30*" "), command=fun1)
bu1.pack(pady=10)
bu2 = tk.Button(text="获取简写".format(30*" ", 30*" "), command=fun2)
bu2.pack(pady=10)
bu3 = tk.Button(text="选择图片\\n简单线条", command=fun3)
bu3.place(x=20, y=40)
root.mainloop()
实验打包成功,点击可用
欢迎指正讨论,请勿喷人
手把手教你打包代码----webpack
webpack基本概念
webpack本质是, node的一个第三方模块包, 用于打包代码;
现代 javascript 应用程序的 静态模块打包器 (module bundler)
webpack能做什么
功能:
1.压缩,合并,打包
2. 语法转换
- 高版本===>低版本(降级兼容)
- less/sass -> css
3. 监听代码变化,自动打包和更新
4. 提取vue中的html/.css/js文件
作用:
1.减少文件数量;
2.缩减代码体积;
3.提高浏览器打开的速度;
新建webpack的步骤:
1.初始化--package.json
yarn init
2.下载webpack等模块包
yarn add webpack webpack-cli -D
3.在package.json自定义命令,为打包做准备
scripts: {
"build": "webpack"
}
4.新建目录src,在src文件夹下建立index.js文件---该文件为,默认入口 ./src/index.js
5.新建业务文件,并定义执行函数(js代码)---src/add/add.js
6.在src/index.js中导入业务文件
7.运行打包代码
yarn build
#或者 npm run build
打包后会自动生成dist文件夹 ----默认出口: ./dist/main.js
8.打开默认生成的dist和main.js文件,查看其中代码
webpack 更新打包
以后代码变更, 如何重新打包呢?
别担心,只需要输入打包指令重新打包就好啦~
yarn build
webpack的配置
webpack-入口和出口
默认入口: ./src/index.js
entry: "./src/main.js",
默认出口: ./dist/main.js
output: {
path: path.join(__dirname, "dist"), // 出口路径
filename: "bundle.js" // 出口文件名
}
修改package.json, 自定义打包命令 - 让webpack使用配置文件
"scripts": {
"build": "webpack"
},
webpack默认只能处理js类型文件,无法识别html文件---因此,我们需要借助工具来解决引入HTML
插件的使用----自动生成html文件
目标: html-webpack-plugin插件, 让webpack打包后生成html文件并自动引入打包后的js
1.下载插件
yarn add html-webpack-plugin -D
2.webpack.config.js配置
// 引入自动生成 html 的插件
const HtmlWebpackPlugin = require('html-webpack-plugin')
module.exports = {
// ...省略其他代码
plugins: [
new HtmlWebpackPlugin({
template: './public/index.html' // 以此为基准生成打包后html文件
})
]
}
加载器的使用
css加载器
安装
yarn add style-loader css-loader -D
webpack.config.js 配置
const HtmlWebpackPlugin = require('html-webpack-plugin')
module.exports = {
// ...其他代码
module: { // 加载器
rules: [ // loader的规则
{
test: /\\.css$/, // 匹配所有的css文件
// use数组里从右向左运行
// 先用 css-loader 让webpack能够识别 css 文件的内容并打包
// 再用 style-loader 将样式, 把css插入到dom中
use: [ "style-loader", "css-loader"]
}
]
}
}
把css文件引入到 main.js
import "./css/index.css"
less加载器
目标: less-loader让webpack处理less文件, less模块翻译less代码
下载包
yarn add less less-loader -D
webpack.config.js配置
rules: [ // loader的规则
// ...省略其他
{
test: /\\.less$/,
// 使用less-loader, 让webpack处理less文件, 内置还会用less翻译less代码成css内容
use: [ "style-loader", "css-loader", 'less-loader']
}
]
把less引入到main.js中
import "./less/index.less"
图片文件 加载器
目标: 用asset module方式(webpack5版本新增)
下载包
yarn add url-loader file-loader -D
webpack.config.js 配置
{
test: /\\.(png|jpg|gif|jpeg)$/i,
type: 'asset'
}
在src/main.js - 把图片插入到创建的img标签上
// 引入图片-使用
import imgUrl from './assets/1.gif'
const theImg = document.createElement("img")
theImg.src = imgUrl
document.body.appendChild(theImg)
总结: url-loader 把文件转base64 打包进js中, 会有30%的增大, file-loader 把文件直接复制输出
字体文件加载器
配置
{ // webpack5默认内部不认识这些文件, 所以当做静态资源直接输出即可
test: /\\.(eot|svg|ttf|woff|woff2)$/,
type: 'asset/resource',
generator: { //生成文件名定义规则(自定义文件名)
filename: 'font/[name].[hash:6][ext]'
}
}
在main.js引入iconfont.css
// 引入字体图标文件
import './assets/fonts/iconfont.css'
总结: url-loader和file-loader 可以打包静态资源文件
js语法转换
安装包
yarn add -D babel-loader @babel/core @babel/preset-env
配置规则
rules: [
{
test: /\\.js$/,
exclude: /(node_modules|bower_components)/,
use: {
loader: 'babel-loader',
options: {
presets: ['@babel/preset-env'] // 预设:转码规则(用bable开发环境本来预设的)
}
}
}
]
总结: babel-loader 可以让webpack 对高版本js语法做降级处理后打包
webpack 开发服务器
每次修改代码, 都需要重新 yarn build 打包, 才能看到最新的效果, 实际工作中, 打包 yarn build 非常费时,我们可以启动本地服务, 可实时更新修改的代码, 打包变化代码到内存中, 然后直接提供端口和网页访问。
下载包
yarn add webpack-dev-server -D
配置自定义命令
scripts: {
"build": "webpack",
"serve": "webpack serve"
}
如果想设置特定的端口号,可以在webpack.config.js中添加服务器配置(webpack-dev-server配置 )
webpack-dev-server配置
module.exports = {
// ...其他配置
devServer: {
port: 3000 // 端口号
}
}
运行命令-启动webpack开发服务器
yarn serve
#或者 npm run serve
以上是关于手把手教python打包exe,打包一个简易的小程序。tkinter,python初学者。编程初学者作业:用*填充出自己的名字的主要内容,如果未能解决你的问题,请参考以下文章
# yyds干货盘点 # 手把手教你开展mofish库(摸鱼库)的打包发布