关于如何高效使用pyinstaller这件事(2)

上一次说到我已经将所有的步骤整合到一个.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
以上

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值