TG-PlatformPlus/appProductor/productor.py

169 lines
7.4 KiB
Python
Raw Permalink Normal View History

2026-03-02 14:29:58 +08:00
# This Python file uses the following encoding: utf-8
import sys
import uuid
import re
import shutil
import zipfile
import hashlib
import os
import json
from PyQt6 import *
from PyQt6.QtCore import *
from PyQt6.QtGui import *
from PyQt6.QtWidgets import *
from ui_form import Ui_Widget
class Widget(QWidget):
def __init__(self, parent=None):
super().__init__(parent)
self.ui = Ui_Widget()
self.ui.setupUi(self)
self.block = False
self.appjs = ""
self.ui.pbPackage.clicked.connect(self.compressPackage)
self.ui.leappId.textChanged.connect(self.updateInfo)
self.ui.leDes.textChanged.connect(self.updateInfo)
self.ui.leName.textChanged.connect(self.updateInfo)
self.ui.leVersion.textChanged.connect(self.updateInfo)
self.ui.pbOpenFile.clicked.connect(self.openFileDialog)
self.ui.pbOpen.clicked.connect(self.openDir)
def openFileDialog(self):
file_dialog = QFileDialog(self)
file_dialog.setWindowTitle("选择工程")
file_dialog.setFileMode(QFileDialog.FileMode.Directory)
if file_dialog.exec():
file_path = file_dialog.selectedFiles()[0]
# 获取info文件的路径
info_path = os.path.join(file_path, "info")
self.block = True
if os.path.exists(info_path):
# 读取文件内容
with open(info_path, 'r', encoding="utf-8") as f:
content = f.read()
info = json.loads(content)
# 将文件内容保存到列表中
self.ui.leappId.setText(info["General"]["AppId"])
self.ui.leName.setText(info["General"]["Name"])
self.ui.leDes.setText(info["General"]["Description"])
self.ui.leVersion.setText(info["General"]["Version"])
else:
self.ui.leappId.setText(str(uuid.uuid4()))
self.ui.leName.setText("")
self.ui.leDes.setText("")
self.ui.leVersion.setText("")
self.block = False
self.ui.lePro.setText(file_path)
def updateInfo(self):
if self.block:
return
# 获取info文件的路径
info_path = os.path.join(self.ui.lePro.text(), "info")
info = {
"General": {
"AppId": self.ui.leappId.text(),
"Name": self.ui.leName.text(),
"Description": self.ui.leDes.text(),
"Version": self.ui.leVersion.text(),
"Show": False
}
}
# 将文件内容保存到列表中
with open(info_path, 'w', encoding="utf-8") as f:
json.dump(info, f, ensure_ascii=False, indent=4)
def calculate_file_md5(self, file_path):
# 计算给定文件的MD5值。
md5 = hashlib.md5()
with open(file_path, 'rb') as f:
for chunk in iter(lambda: f.read(4096), b""):
md5.update(chunk)
return md5.hexdigest()
def calculate_directory_md5(self, directory_path):
#计算给定目录下除md5.txt文件以外的全部文件的MD5值。
md5_values = {}
with os.scandir(directory_path) as it:
for entry in it:
if entry.is_file() and entry.name != 'md5.txt':
file_md5 = self.calculate_file_md5(entry.path)
md5_values[entry.name] = file_md5
elif entry.is_dir():
sub_directory_md5 = self.calculate_directory_md5(entry.path)
md5_values[entry.name] = sub_directory_md5
return {k: v for k, v in md5_values.items() if v != {} }
def openDir(self):
directory_path = self.ui.leDir.text()
os.makedirs( directory_path, exist_ok=True)
os.startfile(directory_path)
def compressPackage(self):
try:
filename = self.ui.leName.text()+".tpa"
packeagePath = os.path.join(self.ui.leDir.text(), filename)
fname = QFileDialog.getSaveFileName(self, '保存文件', packeagePath, 'TPA files (*.tpa)')
if fname[0]:
packeagePath = fname[0]
if os.path.exists(packeagePath):
os.remove(packeagePath)
print('文件已删除')
filename_with_extension = os.path.basename(fname[0]) # 获取带有后缀的文件名
filename = filename_with_extension.replace('.tpa', '') # 删除后缀,获取没有后缀的文件名
#更新app.js
js_path = os.path.join(self.ui.lePro.text(), "app.js")
with open(js_path, 'r') as file:
self.appjs = file.read()
with open(js_path, 'w', encoding="utf-8") as file:
file.write('var appId = \"' + self.ui.leappId.text() + '\"\nvar plusFile = \"plus\"')
self.ui.lbStatus.setText("开始打包")
directory_path = self.ui.lePro.text()
target_path = os.path.dirname(fname[0])
directory_md5 = self.calculate_directory_md5(directory_path)
json_str = json.dumps(directory_md5, indent=4, sort_keys=True)
md5_str = ""
md5_str = hashlib.md5(json_str.encode('utf-8')).hexdigest()
if md5_str != "":
with open(os.path.join(self.ui.lePro.text(),"md5.txt"), 'w') as f:
f.write(md5_str)
os.makedirs( self.ui.leDir.text(), exist_ok=True)
zip_path = os.path.join(self.ui.leDir.text(), filename +".zip")
# 创建ZIP文件并添加目录内容
with zipfile.ZipFile(zip_path, 'w', zipfile.ZIP_DEFLATED) as zipf:
# 递归添加目录和文件到ZIP文件中
self.add_dir_to_zip(directory_path, zipf, directory_path)
filename, ext = os.path.splitext(zip_path)
os.rename( zip_path, os.path.join( target_path, filename_with_extension) )
#还原debug app.js
with open(js_path, 'w', encoding="utf-8") as file:
file.write(self.appjs)
self.ui.lbStatus.setText("打包成功")
else:
self.ui.lbStatus.setText("md5为空")
except Exception as e:
try:
os.remove(zip_path)
except:
pass
self.ui.lbStatus.setText(f"打包失败{e}")
def add_dir_to_zip(self, dir_path, zipf, parent_dir):
for root, dirs, files in os.walk(dir_path):
for file in files:
file_path = os.path.join(root, file)
# 使用os.path.relpath获取相对于parent_dir的路径作为归档名称
arcname = os.path.relpath(file_path, parent_dir)
zipf.write(file_path, arcname=arcname)
for subdir in dirs:
subdir_path = os.path.join(root, subdir)
# 递归调用add_dir_to_zip()函数将空目录也添加到ZIP文件中
self.add_dir_to_zip(subdir_path, zipf, parent_dir)
if __name__ == "__main__":
app = QApplication(sys.argv)
widget = Widget()
widget.show()
sys.exit(app.exec())