背景
本来想用pyqt的,但是打包成exe的时候遇到了很多坑,各种报错,从而转tkinter了。
tkinter打包很简单,不易报错,打包成exe后能独立运行于没装环境的电脑。
代码
此代码为官方文档的样例,可以基于此代码扩展。对布局要求不高,一般用网格布局即可
- 如果引用了图片文件,打包以后会报错。可以将图片转为base64变量写在代码里
from tkinter import *
from tkinter import ttk
class FeetToMeters:
def __init__(self, root):
root.title("Feet to Meters")
mainframe = ttk.Frame(root, padding="3 3 12 12")
mainframe.grid(column=0, row=0, sticky=(N, W, E, S))
root.columnconfigure(0, weight=1)
root.rowconfigure(0, weight=1)
self.feet = StringVar()
feet_entry = ttk.Entry(mainframe, width=7, textvariable=self.feet)
feet_entry.grid(column=2, row=1,columnspan=1 sticky=(W, E))
self.meters = StringVar()
ttk.Label(mainframe, textvariable=self.meters).grid(column=2, row=2, sticky=(W, E))
ttk.Button(mainframe, text="Calculate", command=self.calculate).grid(column=3, row=3, sticky=W)
ttk.Label(mainframe, text="feet").grid(column=3, row=1, sticky=W)
ttk.Label(mainframe, text="is equivalent to").grid(column=1, row=2, sticky=E)
ttk.Label(mainframe, text="meters").grid(column=3, row=2, sticky=W)
for child in mainframe.winfo_children():
child.grid_configure(padx=5, pady=5)
feet_entry.focus()
root.bind("<Return>", self.calculate)
def calculate(self, *args):
try:
value = float(self.feet.get())
self.meters.set(int(0.3048 * value * 10000.0 + 0.5) / 10000.0)
except ValueError:
pass
#打开文件弹窗
#self.open_file_path = askopenfilename(title="请选择一个要打开的html文件", filetypes=[("html", "*.html")])
#self.fileName.set(self.open_file_path.split('/')[-1])
#提示弹窗
#tkinter.messagebox.showinfo('提示', '成功搞定')
root = Tk()
FeetToMeters(root)
root.mainloop()
- 以下代码是部分常用的操作
def readFile(self,fileName):
file = open(fileName, 'rb')
msg = file.read()
result = chardet.detect(msg)
print(result)
context = msg.decode(result['encoding'], 'strict')
print(type(context))
print(context)
modified = context.replace('</body>', code)
modified = modified.replace('</head>', code1)
# file = open(fileName, 'w', encoding="utf-8")
file = open(fileName, 'w', encoding=result['encoding'])
file.write(modified)
file.close()
tkinter.messagebox.showinfo('提示', '成功搞定')
#遍历文件
def getFile(self,filePath):
files = os.listdir(filePath)
for file in files:
file_d = os.path.join(filePath, file)
if os.path.isdir(file_d):
self.getFile(file_d)
else:
if '.html' in file_d:
print(file_d)
self.readFile(file_d)
打包
pip install PyInstaller
pyinstaller -F -i XXX.ico -w XXX.py
#-D :生成文件夹 -F生成一个EXE