上一次说到我已经将所有的步骤整合到一个.py文件中,我要做的就是将需要改动的数据输入到控制台里,它就会执行剩下的操作。
但是相信不少写代码的人都已经厌倦了黑色而又单调的控制台,我也不例外,所以我今天做了第一个属于自己的GUI:
输入的内容和当初用控制台时别无二致,做出了一个可视化的用户界面而已,但是这个界面却花了我整整一个上午的时间。
这里所需要的一个库的名字叫做:tkinter
这个库是跟随Python一起安装的一个标准库,不需要自行下载,直接引用就完事import tkinter as tk
,但是要设计一个界面,还要知道这个库相关的参数和用法才行,我这里主要参考的是当当云阅读上的一本电子书:《Python GUI设计 tkinter 菜鸟编程》,除此之外,有许多博友也做过相关教程,大家可以自行搜索。但是值得一提的是,许多网上的教程都不够全面,这本电子书虽然详细,仍有些问题和方法没有涉及,许多博主的教程也是如此,如果想要参考更详细的教程,还是推荐通过Python官方参考文档学习,在那里可以找到有关tkinter的详细说明,包括且不限于Python,可以说非常有帮助。
目前我还没有系统的学习tkinter,为了完成我的想法(制作一个可视化用户界面帮助我高效使用pyinstaller),我先有选择地学习了相关内容。
新建一个窗口
想要实现一定功能,首先要有一个窗口来容纳它:
import tkinter as tk #引用tkinter库
win1=tk.Tk() #新建一个窗口
win1.mainloop() #放在最后,表示保持窗口,等待操作
对窗口属性进行调整
这里可涉及的窗口属性有很多,包括
tilte()
geometry(“宽x高+x+y”)
maxsize(width,height)
minsiza(width,height) 拖曳时最大/小宽高
configure(bg=“color”) 窗口颜色
resizable(True,True) 固定窗口大小则用resizeable(0,0)
state(“zoomed”)最大化窗口
iconify()最小化窗口
iconbitmap(“xx.ico”)更改默认窗口图标
我也只使用了其中的一部分:
import tkinter as tk
win1=tk.Tk()
win1.title("简单打包") #更改标题
win1.resizable(0,0) #固定窗口大小,为了防止窗口被拉伸时构件(按钮、文本框等)错位
win1.geometry("300x200+566+273") #设定窗口大小及左上角相对屏幕左上角的位置
win1.wm_attributes('-topmost',1) #保持窗口置顶
win1.mainloop()
这样,我们就得到了一个已更改标题、大小、位置和保持置顶的窗口
加入部件(widget)
这里我们需要的部件有“文本框”,“输入框”和“按钮”三类。
文本框(Label)
语法:tkinter.Label(父对象,options...)
这里的父对象也就是我们刚刚创建的文本框win1
options指各种可选参数:
1.anchor
2.bg(background)
3.bitmap
4.bd(borderwidth)
5.compound(位置关系)
6.cursor(鼠标外形)
7.fg(foreground)
8.font(字形)
9.height
10.image
11.justify(文本对齐方式)
12.padx/pady(标签文字与标签区间的距离)
13.relief(默认为FLAT,可控制标签外框)
14.text(标签文字)
15.textveriable(可设置标签以变量方式显示)
16.underline(从0开始算起,设置下划线,默认为-1)
17.width()
18.wraplength(宽度达到多少时换行)
这里仍是只使用一部分,更多的用法可以自行查阅资料
label1=tk.Label(win1,font="宋体 10 normal",text="年:",anchor="e")
label2=tk.Label(win1,font="宋体 10 normal",text="月:",anchor="e")
label3=tk.Label(win1,font="宋体 10 normal",text="日:”,anchor="e")
label4=tk.Label(win1,font="宋体 10 normal",text="文件名:",anchor="e")
##↑创建四个文本框
##↓接下来将它们放入到指定的位置
label1.grid(row=0,column=0,pady=5)
label2.grid(row=1,column=0,pady=5)
label3.grid(row=2,column=0,pady=5)
label4.grid(row=3,column=0,pady=5)
这里用到的是grid方法,是将窗口以类似于单元格划分的排列方法,此处的row指行数,column指列数,均为从0开始。除grid方法之外还有pack方法和place方法,他们各自有自己的长处和不足。
pady是指文本框与相邻部件在y轴上(上下)相隔的距离。同理,我们也可以设定padx,表示在x轴上(左右)相隔的距离,由于这里暂时没有其他部件,如果现在加上,相当于与窗口边框相隔的距离。
输入框(Entry)
语法:tkinter.Entry(父对象,options...)
ent1=tk.Entry(win1,font="宋体 10 normal",width=5)
ent2=tk.Entry(win1,font="宋体 10 normal",width=5)
ent3=tk.Entry(win1,font="宋体 10 normal",width=5)
ent4=tk.Entry(win1,font="宋体 10 normal",width=20)
win1是我们创建的窗口,也即是我们的父对象
font指字体,格式为font="options"
,这里的options包括family(字形),size(字号),weight(可取bold、normal等),slant(可取italic、roman等),underline(可取True、False),overstrike(可取True、False)
width指输入框的宽度,当然也可以设置height
按钮(button)
语法:tkinter.Button(父对象,options...)
btn1=tk.Button(win1,text="确定",command=OK,width=25)
btn1.grid(row=4,column=0,columnspan=2,pady=5)
'''用grid方法排列控件这里出现了columspan,它的作用是“合并单元格”
,columspan=2则合并两个格子,即将第4行的1、2列合并,同理也有rowspan'''
由于button是一个可以操作的部件,所以他的options中有一个特殊的指令command
,这里我使用的是command=OK
,实际上command可以等于任何一个你所定义的函数,而一旦你按下这个按钮,这个函数就会被触发,这里我所定义的OK:
def OK():
global y1,m1,d1,n1#定义全局变量,便于install()函数调用
y1=ent1.get() #get()函数可以得到此时文本框所输入的字符串
m1=ent2.get()
d1=ent3.get()
n1=ent4.get()
win1.destroy() #destory()函数将关闭我的窗口,但是程序还会继续向下进行
install() #执行另一个我所定义的函数
这里的Instll()即是上一次我写入的代码,这样,我一按下按钮,上一次所写的代码就会被执行
def install():
f1=open("D:\\小帆。\\Python\\转exe.bat","w",encoding="ANSI")
Y=y if y1=="" else y1
M=m if m1=="" else m1
D=d if d1=="" else d1
N=n if n1=="" else n1
f1.write("d:\ncd D:\\小帆。\\Python\\打包完成\n"+"\
pyinstaller -i D:\\小帆。\\Python\\xiaofan.ico \
-F D:\\小帆。\\Python\\{0}_{1}_{2}\\{3}\n\
del /q D:\\小帆。\\Python\\打包完成\\{4}.spec\n\
move .\\dist\\* D:\\小帆。\\Python\\打包完成\n\
rd /s/q dist build\ncd D:\\小帆。\\Python\\{5}_{6}_{7}\n\
rd /s/q __pycache__".format(Y,M,D,N,N[0:-3],Y,M,D))
f1.close()
f2=open("D:\\小帆。\\Python\\储存上次操作.txt","w")
f2.write("{}\n{}\n{}\n{}".format(Y,M,D,N))
f2.close()
os.system("D:\\小帆。\\Python\\转exe.bat")
现在我将完整代码放在这里:
import os
import tkinter as tk
def OK():
global y1,m1,d1,n1
y1=ent1.get()
m1=ent2.get()
d1=ent3.get()
n1=ent4.get()
win1.destroy()
if ".py" in n1[-3:]:
install()
elif n1=="":
install()
else:
n1 +=".py"
install()
def install():
f1=open("D:\\小帆。\\Python\\转exe.bat","w",encoding="ANSI")
Y=y if y1=="" else y1
M=m if m1=="" else m1
D=d if d1=="" else d1
N=n if n1=="" else n1
f1.write("d:\ncd D:\\小帆。\\Python\\打包完成\n"+"\
pyinstaller -i D:\\小帆。\\Python\\xiaofan.ico \
-F D:\\小帆。\\Python\\{0}_{1}_{2}\\{3}\n\
del /q D:\\小帆。\\Python\\打包完成\\{4}.spec\n\
move .\\dist\\* D:\\小帆。\\Python\\打包完成\n\
rd /s/q dist build\ncd D:\\小帆。\\Python\\{5}_{6}_{7}\n\
rd /s/q __pycache__".format(Y,M,D,N,N[0:-3],Y,M,D))
f1.close()
f2=open("D:\\小帆。\\Python\\储存上次操作.txt","w")
f2.write("{}\n{}\n{}\n{}".format(Y,M,D,N))
f2.close()
os.system("D:\\小帆。\\Python\\调用.vbs")
f0=open("D:\\小帆。\\Python\\储存上次操作.txt")
y=f0.readline()[0:-1]
m=f0.readline()[0:-1]
d=f0.readline()[0:-1]
n=f0.readline()
f0.close()
win1=tk.Tk()
win1.title("简单打包")
win1.resizable(0,0)
win1.geometry("+566+273")
win1.wm_attributes('-topmost',1)
win1.resizable(0,0)
win1.geometry("+566+273")
win1.overrideredirect(False)
label1=tk.Label(win1,font="宋体 10 normal",text="请输入年(默认为{}):".format(y),anchor="e")
label2=tk.Label(win1,font="宋体 10 normal",text="请输入月(默认为{}):".format(m),anchor="e")
label3=tk.Label(win1,font="宋体 10 normal",text="请输入日(默认为{}):".format(d),anchor="e")
label4=tk.Label(win1,font="宋体 10 normal",text="请输入文件名(默认为{}):".format(n),anchor="e")
ent1=tk.Entry(win1,font="宋体 10 normal",width=5)
ent2=tk.Entry(win1,font="宋体 10 normal",width=5)
ent3=tk.Entry(win1,font="宋体 10 normal",width=5)
ent4=tk.Entry(win1,font="宋体 10 normal",width=20)
btn1=tk.Button(win1,text="确定",command=OK,width=25)
label1.grid(row=0,column=0,pady=5)
label2.grid(row=1,column=0,pady=5)
label3.grid(row=2,column=0,pady=5)
label4.grid(row=3,column=0,pady=5)
ent1.grid(row=0,column=1)
ent2.grid(row=1,column=1)
ent3.grid(row=2,column=1)
ent4.grid(row=3,column=1,padx=5)
btn1.grid(row=4,column=0,columnspan=2,pady=5)
win1.mainloop()
另外,我还从网上查找到了在.bat文件运行时隐藏命令提示符的方法,将下面这段代码复制到 .txt文件下,代码里的路径改为.bat文件的路径,保存后再把后缀改为.vbs即可使用。
CreateObject("WScript.Shell").Run "cmd /c D:\小帆。\Python\转exe.bat",0
(我保存时另存为了ANSI编码格式,没有测试UTF-8格式能否打开中文路径下的批处理文件)
所以我将代码修改为运行一个.vbs脚本,而非原先的直接运行.bat文件,以达到静默处理的效果。
以下为最终效果:
可以非常方便的打包.py文件成exe
以上