用户:520669已退猫查看:0 回复:1 评论:0 创建时间:2019-08-20T12:58:15
四、Python 打包发布
我们知道,C++生成的exe 有自己打包工具:advanced installer,那么python也有自己打包工具:pyinstaller.exe ,
首先安装pyinstaller,生成在环境目录:Scripts
在搜索框输入cmd
执行 pyinstaller -F -w XXX.py
生成可执行文件exe在 dist目录下面
————————————————
1、组件
本软件中用到了大概5个组件:
1.1、Button按钮
语法如下:创建了名为Play播放的按钮,绑定了命令sound_play。
b1 = ttk.Button(xin, text = 'Play\n播放', width = 10, command = sound_play)
b1.grid(row=3,column=4, padx=10, pady=10)
1.2、Label标签
语法如下:创建了名为Model的标签。
mm1 = ttk.Label(xin, text = 'Model')
mm1.grid(row=0,column=1)
1.3、Combobox下拉列表
number = tk.StringVar()
LessonChosen = ttk.Combobox(xin, width=12, textvariable=number, state='readonly')
LessonChosen['values'] = lesson_name # 设置下拉列表的值
LessonChosen.grid(column=2, row=1) # 设置其在界面中出现的位置 column代表列 row 代表行
LessonChosen.current(lesson_name.index(str(WW[0]))) # 设置下拉列表默认显示的值,0为 LessonChosen['values']
的下标值
1.4、LabelFrame
labelframe1 = ttk.LabelFrame(xin, text='単語 (第 课,第 个单词)', height = 80, width=300) # 信息区
labelframe1.grid(row=3,column=1, columnspan = 3 , padx=10, pady=10)
labelframe1.propagate(0) # 使组件大小不变,此时width才起作用
ttk.Label(labelframe1, text = " ",font = ('Mincho, 20')).pack(fill="both", expand="yes")
1.5、Radiobutton单选按钮
#单选按钮radiobutton
v=tk.IntVar()
v.set(1)
#f1.bind('<KeyPress-1>',word_know)
f1 = tk.Radiobutton(xin,text = 'Know', font =24, variable=v,value=1, command = word_know)
f1.grid(row=6,column=2)
f1.configure(state='disabled')
#f2.bind('<KeyPress-2>',word_unknow)
f2 = tk.Radiobutton(xin,text = 'Unknow',font =24,variable=v,value=2, command = word_unknow)
f2.grid(row=6,column=3)
f2.configure(state='disabled')
下面贴一段与『Play播放』按钮绑定的sound_play函数的命令:
#Play按钮
def sound_play():
import winsound
import time
import os
global xin
global word_list
if back_canshu == 0:
if len(word_list_now)==0:
showinfo(title = 'Message', message = '恭喜,本次单词已经背完!')
if BSM == 0:
word_list1 = [R[1:3]]
for i in range(len(word_list)):
if len(word_list[i])>=6:
if word_list[i][5]!='':
word_list1.append(word_list[i])
del word_list
word_list =word_list1
#保存file.txt
import os
os.remove(r'.\file.txt')
#写出单词表信息
write_file_word(word_list,r'.\file.txt')
else:
if len(word_list_now)>=1:
lesson = int(word_list_now[0][0])
mn = int(word_list_now[0][1])
if os.path.exists(r".\audio\L"+str(lesson)+"\L"+str(lesson)+"_"+str(mn)+".wav")==False:
winsound.PlaySound(r".\audio\Windows_Background.wav", winsound.SND_FILENAME|winsound.SND_ASYNC)
#第三行:labelframe单词
labelframe1 = ttk.LabelFrame(xin, text='単語 (第 '+str(lesson)+' 课,第 '+str(mn)+' 个单词)', height = 80, width=300) # 信息区
labelframe1.grid(row=3,column=1, columnspan = 3 , padx=10, pady=10)
labelframe1.propagate(0) # 使组件大小不变,此时width才起作用
ttk.Label(labelframe1, text = word_list_now[0][2], font = ('Mincho, 20')).pack(fill="both", expand="yes")
else:
winsound.PlaySound(r".\audio\L"+str(lesson)+"\L"+str(lesson)+"_"+str(mn)+".wav", winsound.SND_FILENAME|winsound.SND_ASYNC)
else:
lesson = int(word_back[-back_canshu][0])
mn = int(word_back[-back_canshu][1])
if os.path.exists(r".\audio\L"+str(lesson)+"\L"+str(lesson)+"_"+str(mn)+".wav")==False:
winsound.PlaySound(r".\audio\Windows_Background.wav", winsound.SND_FILENAME|winsound.SND_ASYNC)
else:
winsound.PlaySound(r".\audio\L"+str(lesson)+"\L"+str(lesson)+"_"+str(mn)+".wav", winsound.SND_FILENAME|winsound.SND_ASYNC)
2、软件封装打包
Python Tkinter打包封装的方法有:PyInstaller, py2exe, wxPython等方法。答主只是用了PyInstaller来打包,感觉特别好用,对其它方法不做评论。
网上有很多打包方法:Python | 用Pyinstaller打包发布exe应用,请自行参考!
要说的是,打包过程中可以添加如下指令,自行尝试打包后的差异:
-w指令,在指令内加入-w命令可以屏蔽发布的exe应用带命令行调试窗口;
-F指令,使用-F指令可以把应用打包成一个独立的exe文件,否则是一个带各种dll和依赖文件的文件夹;
-i指令,可以自定义图标。
简单写一下用pyinstaller打包软件的过程:
①准备好打包文件:
aiueo.py为代码,audio文件夹、tango文件夹和file.txt为程序关联调用的文件,a.ico为软件图标。
②在安装的Python文件夹下的Scripts目录下(包含pyinstaller.exe),shift+右键>>在此处打开命令窗口:
③输入:pyinstaller.exe -i C:\Users\Naples\aiueo\a.ico -w C:\Users\Naples\aiueo\aiueo.py 回车。
-i C:\Users\Naples\aiueo\a.ico 为图标所在的目录;
-w C:\Users\Naples\aiueo\aiueo.py 为程序所在目录。
④在C:\Python34\Scripts目录下就会出现这三个文件:
可以将第一、三个文件删除,只留下dist文件夹。将和程序关联的audio文件夹、tango文件夹和file.txt三个文件夹拷贝到dist/aiueo/目录下。双击aiueo.exe,程序就可以使用了。
可以发送桌面快捷方式,也可以将软件打包拷贝到相同平台下的电脑上使用。