目录
效果展示
一、前言
二、正文
(一)tkinter部分
1、导入tkinter
2、新建窗口
3、tkinter部分全部代码
(二)后端部分
1、变量
2、函数
三、封装
四、全部代码
五、结语
如果您只想使用此功能,可以直接前往下载原文件,并且无需安装python。
(我使用的python版本为3.11)
一共需要用到三个库,分别是python自带的os库和需要自行安装的tkinter库、pyinstaller库。
os库:用于调用cmd
tkinter库:用于制作可视化的窗口
pyinstaller:直接在cmd中运行,用于打包py
如果您已经安装python,但是没有后面这两个库,可以在cmd中输入以下命令以安装:
pip install pyinstaller
pip install tkinter
当然,如果您觉得下载速度慢,也可以使用国内源下载:
pip install -i pyinstaller https://pypi.tuna.tsinghua.edu.cn/simple/
pip install -i tkinter https://pypi.tuna.tsinghua.edu.cn/simple/
好的,到这里,准备工作就告一段落了。
在这里,需要有三行来导入tkinter:
from tkinter import *
from tkinter import simpledialog
from tkinter import messagebox
现在您可能会有疑问:为什么需要三行导入?第一行不就足够了吗?
但是,当您试验的时候会发现simpledialog和messagebox无法被识别,所以需要多加两行。
现在,您已经将库导入了,所以我们该建一个窗口了。
首先建一个主窗口:
window = Tk()
window.geometry('250x350')#窗口大小
window.title('py转exe by sraxc')#标题
当然,最后不能少了循环,否则窗口只会昙花一现:
window.mainloop()
我们现在已经把主窗口的名字设置为window了。
现在进行调试,就会发现已经可以打开一个窗口了。
接下来就是添加各种控件了。
第一种:标签
l1 = Label(window,text="py文件绝对路径或相对路径")
l1.pack()
前面的l1是标签的名字,window是指显示在主窗口,text=" "是显示的文字
第二种:输入框
e1 = Entry(window)
e1.pack()
e1是名字,window是指显示在主窗口。
第三种:单选框
因为pyinstaller提供了一些可选项,所以我选择了几个最常用的进行编写,后面如果有需要也可以再加入。
radio1 = IntVar()
R1 = Radiobutton(window, text="是", variable=radio1, value=1, command=in1)
R1.pack( anchor = W )
R2 = Radiobutton(window, text="否", variable=radio1, value=2, command=in1)
R2.pack( anchor = W )
这样,当我们选择其中一个选项时即可将其的值(value)导入到radio1变量里。
第四种:弹出式输入框
因为.ico图标是一个可选项,而选择后还需要添加.ico图标的路径,于是我在此做了一个防呆设计,只有你选择“是”才会弹出窗口让你填写。
simpledialog.askstring(title = '输入',prompt='请输入ico图标绝对路径或相对路径')
title是标题,prompt是显示的文字,效果如下:
当然,只要规定一个变量,便可以把输入的文字存储为变量。示例如下:
ret = simpledialog.askstring(title = '输入',prompt='请输入ico图标绝对路径或相对路径')
此时ret内便存储着您输入的路径。
第五种:弹出式信息框
当我们全部参数都输入完成后,可以再弹出一个窗口,显示您的所有选择,用以确认信息,再次点击确认即可开始运行。
re = messagebox.askquestion(title = '确认框 by sarxc',message= nr)
其实上面的函数可以不用规定变量,但是一会儿这个变量是有用的,这个变量存储的是您的选择——“yes”或“no”。
至此,关于本文中使用到的tkinter的功能便告一段落了。
from tkinter import *
from tkinter import simpledialog
from tkinter import messagebox
window = Tk()
window.geometry('250x350')
window.title('py转exe by sraxc')
l1 = Label(window,text="py文件绝对路径或相对路径")
l1.pack()
e1 = Entry(window)
e1.pack()
l2 = Label(window,text="是否添加ico图标")
l2.pack()
radio1 = IntVar()
R1 = Radiobutton(window, text="是", variable=radio1, value=1, command=in1)
R1.pack( anchor = W )
R2 = Radiobutton(window, text="否", variable=radio1, value=2, command=in1)
R2.pack( anchor = W )
l3 = Label(window,text="是否生成一整个exe文件?[建议选是]")
l3.pack()
radio2 = IntVar()
R1 = Radiobutton(window, text="是[建议]", variable=radio2, value=1, command=in2)
R1.pack( anchor = W )
R2 = Radiobutton(window, text="否", variable=radio2, value=2, command=in2)
R2.pack( anchor = W )
l4 = Label(window,text="是否允许显示控制台窗口?")
l4.pack()
l5 = Label(window,text="(如您是直接在命令行中运行建议选是)")
l5.pack()
radio3 = IntVar()
R1 = Radiobutton(window, text="是", variable=radio3, value=1, command=in3)
R1.pack( anchor = W )
R2 = Radiobutton(window, text="否", variable=radio3, value=2, command=in3)
R2.pack( anchor = W )
button = Button(window,text ='开始',command = seeall)
button.pack()
window.mainloop()
1.获取单选框的值
使用的是get函数,语法如下:
a = int(radio1.get())
我们知道,在函数中声明变量为局部变量,所以此处的if可以使用一样的变量。
2.声明全局变量
我们需要在其他函数中也可以使用的变量,这时我们就要声明全局变量了。在这里,我使用的是python自带的global。
global r1
1.关于单选框的函数
我们已经做好了单选框,现在就是单选框的函数部分了,这其中有两类,一类是第2、3项的只在主窗口中运行,另一类是第一项的弹出输入框。
对于第一类:
def in2():
a = int(radio2.get())
global r2
global s2
if a == 1:
r2 = " -F"
s2 = "是"
else:
r2 = ""
s2 = "否"
"""
对应控件:
l3 = Label(window,text="是否生成一整个exe文件?[建议选是]")
l3.pack()
radio2 = IntVar()
R1 = Radiobutton(window, text="是[建议]", variable=radio2, value=1, command=in2)
R1.pack( anchor = W )
R2 = Radiobutton(window, text="否", variable=radio2, value=2, command=in2)
R2.pack( anchor = W )
"""
这里的r2以及其他的r*都是最后用于cmd的命令的,而这里的r2以及其他的r*都是用于那个最后确认信息的弹窗的。
对于第二类:
def in1():
a = int(radio1.get())
global r1
global ret
global s1
if a == 1:
ret = simpledialog.askstring(title = '输入',prompt='请输入ico图标绝对路径或相对路径')
r1 = " -i " + str(ret)
s1 = "是。" + " ico路径:" + ret
else:
r1 = ""
s1 = "否"
"""
对应控件:
l2 = Label(window,text="是否添加ico图标")
l2.pack()
radio1 = IntVar()
R1 = Radiobutton(window, text="是", variable=radio1, value=1, command=in1)
R1.pack( anchor = W )
R2 = Radiobutton(window, text="否", variable=radio1, value=2, command=in1)
R2.pack( anchor = W )
"""
接下来,就该去做那个消息提示框了。
从上面的效果和代码中应该可以猜到,这个信息提示框应该是在seeall函数中,所以,我们现在就开始写seeall()函数。
def seeall():
r4 = e1.get()
nr = "py文件路径:" + r4 +"\n" + "是否添加ico图标:" + s1 + "\n" + "是否生成一整个exe文件:" + s2 +"\n" + "是否允许显示控制台窗口:" + s3
re = messagebox.askquestion(title = '确认框 by sarxc',message= nr)
if re == "yes":
st = ok()
messagebox.showinfo(title = '完成',message= "完成")
else:
messagebox.showinfo(title = '取消',message= "已取消")
当您看到"\n"时可能会感到疑惑,别担心,其实这只是python中的换行代码。
而这个showinfo就是信息框。
现在,消息提示框做完了,您会发现,还有一个函数没有定义,就是ok(),这个函数是最终运行的函数,正如其名,运行完就ok了。
这时,便用到了那个迟迟未出场的os库了。
2.运行cmd的函数:
首先,肯定还是先导入库
import os
接下来,就是写ok()函数:
def ok():
r4 = e1.get()
con = "pyinstaller" + r2 + r3 + r1 + " " + r4
os.system(con)
最后的os.system()便是调用cmd命令,而括号里面的变量即是将要在cmd中运行的命令。
如果想让您刚才做的软件更易于使用,您可以用您刚才做的软件复制出一个副本来进行封装,这样也可以测试您写的程序。
import os
from tkinter import *
from tkinter import simpledialog
from tkinter import messagebox
def in1():
a = int(radio1.get())
global r1
global ret
global s1
if a == 1:
ret = simpledialog.askstring(title = '输入',prompt='请输入ico图标绝对路径或相对路径')
r1 = " -i " + str(ret)
s1 = "是。" + " ico路径:" + ret
else:
r1 = ""
s1 = "否"
def in2():
a = int(radio2.get())
global r2
global s2
if a == 1:
r2 = " -F"
s2 = "是"
else:
r2 = ""
s2 = "否"
def in3():
a = int(radio3.get())
global r3
global s3
if a == 2:
r3 = " -w"
s3 = "否"
else:
r3 = ""
s3 = "是"
def ok():
r4 = e1.get()
con = "pyinstaller" + r2 + r3 + r1 + " " + r4
os.system(con)
def seeall():
r4 = e1.get()
nr = "py文件路径:" + r4 +"\n" + "是否添加ico图标:" + s1 + "\n" + "是否生成一整个exe文件:" + s2 +"\n" + "是否允许显示控制台窗口:" + s3
re = messagebox.askquestion(title = '确认框 by sarxc',message= nr)
if re == "yes":
st = ok()
messagebox.showinfo(title = '完成',message= "完成")
else:
messagebox.showinfo(title = '取消',message= "已取消")
window = Tk()
window.geometry('250x350')
window.title('py转exe by sraxc')
l1 = Label(window,text="py文件绝对路径或相对路径")
l1.pack()
e1 = Entry(window)
e1.pack()
l2 = Label(window,text="是否添加ico图标")
l2.pack()
radio1 = IntVar()
R1 = Radiobutton(window, text="是", variable=radio1, value=1, command=in1)
R1.pack( anchor = W )
R2 = Radiobutton(window, text="否", variable=radio1, value=2, command=in1)
R2.pack( anchor = W )
l3 = Label(window,text="是否生成一整个exe文件?[建议选是]")
l3.pack()
radio2 = IntVar()
R1 = Radiobutton(window, text="是[建议]", variable=radio2, value=1, command=in2)
R1.pack( anchor = W )
R2 = Radiobutton(window, text="否", variable=radio2, value=2, command=in2)
R2.pack( anchor = W )
l4 = Label(window,text="是否允许显示控制台窗口?")
l4.pack()
l5 = Label(window,text="(如您是直接在命令行中运行建议选是)")
l5.pack()
radio3 = IntVar()
R1 = Radiobutton(window, text="是", variable=radio3, value=1, command=in3)
R1.pack( anchor = W )
R2 = Radiobutton(window, text="否", variable=radio3, value=2, command=in3)
R2.pack( anchor = W )
button = Button(window,text ='开始',command = seeall)
button.pack()
window.mainloop()
希望这篇文章对您有所帮助。