diff --git a/information.json b/information.json index b6ce66f..d7896b4 100755 --- a/information.json +++ b/information.json @@ -229,6 +229,7 @@ "Contribute": [ "感谢以下用户提供的问题、建议、图标、代码等,如果有遗漏,请及时与开发者联系添加,以及如果侵犯到您的合法权益,也及时与开发者联系:

", "
", + "感谢 Bail 为此程序做出的许多贡献;", "感谢 Bail、shenmo、Allen 反馈的图标无法正常拷贝的问题;", "感谢 Bail Pr 修复Python主版本号判断时潜在的问题的补丁;", "感谢 麻木法师(1312580754) 在星火应用商店QQ交流群展示的接口及其原理;", diff --git a/uengine-apk-builder b/uengine-apk-builder index a543fca..e867fa2 100755 --- a/uengine-apk-builder +++ b/uengine-apk-builder @@ -118,7 +118,7 @@ Maintainer: {} Depends: deepin-elf-verify, uengine (>= 1.0.1) Section: utils Priority: optional -Description: {}\n'''.format(apkPackageNameNew, apkPackageVersion, apkChineseLabel, apkChineseLabel) +Description: {}, Build By UEngine Runner Packager\n'''.format(apkPackageNameNew, apkPackageVersion, apkChineseLabel, apkChineseLabel) debPostinst = '''#!/bin/sh APK_DIR="/usr/share/uengine/apk" @@ -426,7 +426,8 @@ if not lang in langFile.keys(): lang = "en_US.UTF-8" information = json.loads(readtxt(programPath + "/information.json")) version = information["Version"] -title = "{} {}".format(langFile[lang]["Uengine Apk Builder"]["Title"], version) +#title = "{} {}".format(langFile[lang]["Uengine Apk Builder"]["Title"], version) +title = f"UEngine 运行器应用打包器(高级) {version}" iconPath = "{}/builer.svg".format(os.path.split(os.path.realpath(__file__))[0]) ########################### diff --git a/uengine-apk-builder-more b/uengine-apk-builder-more new file mode 100755 index 0000000..2c26e89 --- /dev/null +++ b/uengine-apk-builder-more @@ -0,0 +1,562 @@ +#!/usr/bin/env python3 +# 使用系统默认的 python3 运行 +########################################################################################### +# 作者:gfdgd xi +# 版本:1.8.1 +# 更新时间:2022年08月01日 +# 感谢:anbox、deepin 和 统信 +# 基于 Python3 的 PyQt5 构建 +########################################################################################### +################# +# 引入所需的库 +################# +import os +import sys +import json +import shutil +import random +import zipfile +import traceback +import subprocess +import updatekiller +import PyQt5.QtGui as QtGui +import PyQt5.QtCore as QtCore +import PyQt5.QtWidgets as QtWidgets +from getxmlimg import getsavexml + +print("""南安军 +梅花南北路,风雨湿征衣。出岭同谁出?归乡如此归! +山河千古在,城郭一时非。饿死真吾志,梦中行采薇。""") +print("") +print("""译文:由南往北走过大庾岭口,一路风雨打湿衣裳。想到去南岭时有哪些同伴,回到家乡却身为俘囚。 +祖国的河山千年万世永存,城郭只是暂时落入敌手。绝食而死是我真正的意愿,梦中也学伯夷叔齐,吃野菜充饥等死。""") +print("================================") + +def FindApk(): + path = QtWidgets.QFileDialog.getOpenFileName(widget, "选择 APK", json.loads(readtxt(get_home() + "/.config/uengine-runner/FindApkBuild.json"))["path"], "APK 可执行文件(*.apk);;所有文件(*.*)") + print(path) + if path[0] != "" and path[1] != "": + try: + combobox1.setEditText(path[0]) + write_txt(get_home() + "/.config/uengine-runner/FindApkBuild.json", json.dumps({"path": os.path.dirname(path[0])})) # 写入配置文件 + except: + traceback.print_exc() + QtWidgets.QMessageBox.critical(widget, "错误", traceback.format_exc()) + +def FindIcon(): + path = QtWidgets.QFileDialog.getOpenFileName(widget, "选择 APK", json.loads(readtxt(get_home() + "/.config/uengine-runner/FindApkBuild.json"))["path"], "png 文件(*.png);;svg 文件(*.svg);;所有文件(*.*)") + if path[0] != "" and path[1] != "": + try: + iconText.setText(path[0]) + #write_txt(get_home() + "/.config/uengine-runner/FindApkBuild.json", json.dumps({"path": os.path.dirname(path[0])})) # 写入配置文件 + except: + traceback.print_exc() + QtWidgets.QMessageBox.critical(widget, "错误", traceback.format_exc()) + +class QT: + run = None + +def BuildDeb(): + if combobox1.currentText() == "": + QtWidgets.QMessageBox.critical(None, "提示", "信息没有填写完整,无法继续打包 APK") + return + for i in textList: + if i.text() == "": + QtWidgets.QMessageBox.critical(None, "提示", "信息没有填写完整,无法继续打包 APK") + return + # 包名小写 + packageText.setText(packageText.text().lower()) + if not os.path.exists(combobox1.currentText()) or not os.path.exists(iconPath): + QtWidgets.QMessageBox.critical(None, "提示", "信息填写错误,无法继续打包 APK") + return + DisabledAndEnbled(True) + QT.run = BuildApkDeb(combobox1.currentText()) + QT.run.signal.connect(TextboxAddText1) + QT.run.labelChange.connect(ChangeItems) + QT.run.tips.connect(TipsMessagebox) + QT.run.start() + +class BuildApkDeb(QtCore.QThread): + signal = QtCore.pyqtSignal(str) + labelChange = QtCore.pyqtSignal(str) + tips = QtCore.pyqtSignal(str) + + def __init__(self, apkPath) -> None: + self.apkPath = apkPath + super().__init__() + + def RunCommandShow(self, command): + if command.replace(" ", "").replace("\n", "") == "": + return + self.signal.emit("$> {}".format(command)) + res = subprocess.Popen([command], shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) + # 实时读取程序返回 + while res.poll() is None: + try: + texts = res.stdout.readline().decode("utf8") + except: + texts = "" + print(texts, end="") + self.signal.emit(texts) + # 已废弃 + # TextboxAddText1(GetCommandReturn(command)) + + def run(self): + try: + apkPath = self.apkPath + tempPath = "/tmp/uengine-apk-builder-{}".format(int(random.randint(0, 1024))) + self.RunCommandShow("echo '======================================New===================================='") + self.RunCommandShow("echo '创建目录'") + self.RunCommandShow("mkdir -pv '{}/DEBIAN'".format(tempPath)) + self.RunCommandShow("mkdir -pv '{}/usr/share/applications'".format(tempPath)) + self.RunCommandShow("mkdir -pv '{}/usr/share/uengine/apk'".format(tempPath)) + self.RunCommandShow("mkdir -pv '{}/usr/share/uengine/icons'".format(tempPath)) + self.RunCommandShow("echo '写入文件,因为写入过程过于复杂,不显示写入命令……'") + apkPackageName = GetApkPackageName(apkPath, False) + apkPackageNameNew = packageText.text() + # 高级打包器直接忽略此勾选 + #if check.isChecked(): + # apkPackageNameNew = GetApkPackageName(apkPath, True).lower().replace("_", "-") + #else: + # apkPackageNameNew = GetApkPackageName(apkPath, False).lower().replace("_", "-") + apkPackageVersion = GetApkVersion(apkPath) + if apkPackageVersion[0].upper() == "V": + package = list(apkPackageVersion) + package.pop(0) + apkPackageVersion = "".join(package) + apkChineseLabel = GetApkChineseLabel(apkPath) + apkActivityName = GetApkActivityName(apkPath) + if sizes.isChecked() and os.path.exists(f"/usr/share/uengine/appetc/{apkPackageName}.txt"): + os.makedirs(f"{tempPath}/usr/share/uengine/appetc") + shutil.copy(f"/usr/share/uengine/appetc/{apkPackageName}.txt", f"{tempPath}/usr/share/uengine/appetc/{apkPackageName}.txt") + iconSavePath = "{}/usr/share/uengine/icons/{}.png".format(tempPath, apkPackageNameNew) + debControl = f'''Package: {apkPackageNameNew} +Version: {versionText.text()} +Architecture: all +Maintainer: {makerText.text()} +Depends: deepin-elf-verify, uengine (>= 1.0.1) +Section: utils +Priority: optional +Description: {comText.text()}\n''' + debPostinst = '''#!/bin/sh + +APK_DIR="/usr/share/uengine/apk" +APK_NAME="{}" +APK_PATH="$APK_DIR/$APK_NAME" +DESKTOP_FILE="{}" + + +if [ -f $APK_PATH ]; then + echo "Installing $APK_NAME" +else + echo "ERROR: $APK_NAME does not exist." + exit 0 +fi + +session_manager=`ps -ef | grep "uengine session-manager" | grep -v grep` +if test -z "$session_manager"; then + echo "ERROR: app install failed(session-manager is not running)." + sess_dir="/usr/share/uengine/session_install" + if [ ! -d $sess_dir ]; then + mkdir $sess_dir + chmod 777 $sess_dir + fi + apk_name=${{APK_PATH##*/}} + fileName="$sess_dir/$apk_name" + echo $DESKTOP_FILE > $fileName + abistr="" + if test -n "$abistr"; then + abi=`echo $abistr |awk -F \= '{{print $2}}'` + echo $abi >> $fileName + fi + chmod 766 $fileName +fi + +/usr/bin/uengine-session-launch-helper -- uengine install --apk="$APK_PATH" + +exit 0'''.format(apkPackageNameNew + ".apk", "/usr/share/applications/{}.desktop".format(apkPackageNameNew)) + debPrerm = '''#!/bin/sh + +APP_NAME="{}" +DESKTOP_FILE="{}" + +session_manager=`ps -ef | grep "uengine session-manager" | grep -v grep` +if test -z "$session_manager"; then + echo "ERROR: app uninstall failed(session-manager is not running)." + sess_dir="/usr/share/uengine/session_uninstall" + if [ ! -d $sess_dir ]; then + mkdir $sess_dir + chmod 777 $sess_dir + fi + fileName="$sess_dir/$APP_NAME" + echo $DESKTOP_FILE > $fileName + chmod 766 $fileName +fi + +echo "Uninstalling $APP_NAME" +/usr/bin/uengine-session-launch-helper -- uengine uninstall --pkg="$APP_NAME" + +exit 0'''.format(apkPackageName, "/usr/share/applications/{}.desktop".format(apkPackageNameNew)) + desktopFile = '''[Desktop Entry] +Categories=Other; +Exec=uengine launch --action=android.intent.action.MAIN --package={} --component={} +Icon=/usr/share/uengine/icons/{}.png +Terminal=false +Type=Application +GenericName={} +Name={} +''' + #self.RunCommandShow("echo '{}' > '{}/DEBIAN/control'".format(debControl, tempPath)) + self.RunCommandShow("echo 正在写入文件:'{}/DEBIAN/control'".format(tempPath)) + write_txt("{}/DEBIAN/control".format(tempPath), debControl) + self.RunCommandShow("echo 正在写入文件:'{}/DEBIAN/postinst'".format(tempPath)) + write_txt("{}/DEBIAN/postinst".format(tempPath), debPostinst) + self.RunCommandShow("echo 正在写入文件:'{}/DEBIAN/prerm'".format(tempPath)) + write_txt("{}/DEBIAN/prerm".format(tempPath), debPrerm) + self.RunCommandShow("echo 正在写入文件:'/usr/share/applications/{}.desktop'".format(apkPackageNameNew)) + #write_txt("{}/usr/share/applications/{}.desktop".format(tempPath, apkPackageNameNew), desktopFile) + BuildUengineDesktop(apkPackageName, apkActivityName, nameText.text(), "/usr/share/uengine/icons/{}.png".format(apkPackageNameNew), + "{}/usr/share/applications/{}.desktop".format(tempPath, apkPackageNameNew), typeChoose.currentText()) + self.RunCommandShow("echo '复制文件'") + self.RunCommandShow("echo '写入 APK 软件图标'") + #SaveApkIcon(apkPath, iconSavePath) + self.RunCommandShow(f"cp -rv '{iconText.text()}' '{iconSavePath}'") + self.RunCommandShow("echo '复制 APK 文件'") + self.RunCommandShow("cp -rv '{}' '{}/usr/share/uengine/apk/{}.apk'".format(apkPath, tempPath, apkPackageNameNew)) + self.RunCommandShow("echo '正在设置文件权限……'") + self.RunCommandShow("chmod 0775 -vR '{}/DEBIAN/postinst'".format(tempPath)) + self.RunCommandShow("chmod 0775 -vR '{}/DEBIAN/prerm'".format(tempPath)) + self.RunCommandShow("echo '打包 deb 到桌面……'") + self.RunCommandShow("dpkg -b '{}' '{}/{}_{}_all.deb'".format(tempPath, get_desktop_path(),apkPackageNameNew, versionText.text())) + self.RunCommandShow("echo '正在删除临时目录……'") + self.RunCommandShow("rm -rfv '{}'".format(tempPath)) + self.RunCommandShow("echo '完成!'") + findApkHistory.append(apkPath) + self.labelChange.emit("") + write_txt(get_home() + "/.config/uengine-runner/FindApkBuildHistory.json", str(json.dumps(ListToDictionary(findApkHistory)))) # 将历史记录的数组转换为字典并写入 + DisabledAndEnbled(False) + self.tips.emit("打包完成") + + except: + DisabledAndEnbled(False) + traceback.print_exc() + QtWidgets.QMessageBox.critical(widget, "错误", traceback.format_exc()) + +def TipsMessagebox(tips): + QtWidgets.QMessageBox.information(widget, "提示", tips) + +def ChangeItems(self): + combobox1.clear() + combobox1.addItems(findApkHistory) + #combobox1.setEditText("") + +def DisabledAndEnbled(choose): + combobox1.setDisabled(choose) + check.setDisabled(choose) + button2.setDisabled(choose) + button3.setDisabled(choose) + sizes.setDisabled(choose) + iconBrowser.setDisabled(choose) + typeChoose.setDisabled(choose) + for i in textList: + i.setDisabled(choose) + +# 重启本应用程序 +def ReStartProgram(): + python = sys.executable + os.execl(python, python, * sys.argv) + +def GetCommandReturn(command): + return subprocess.getoutput(command) + +# 获取用户主目录 +def get_home(): + return os.path.expanduser('~') + +# 获取当前语言 +def get_now_lang()->"获取当前语言": + return os.getenv('LANG') + +# 获取用户桌面目录 +def get_desktop_path(): + for line in open(get_home() + "/.config/user-dirs.dirs"): # 以行来读取配置文件 + desktop_index = line.find("XDG_DESKTOP_DIR=\"") # 寻找是否有对应项,有返回 0,没有返回 -1 + if desktop_index != -1: # 如果有对应项 + break # 结束循环 + if desktop_index == -1: # 如果是提前结束,值一定≠-1,如果是没有提前结束,值一定=-1 + return -1 + else: + get = line[17:-2] # 截取桌面目录路径 + get_index = get.find("$HOME") # 寻找是否有对应的项,需要替换内容 + if get != -1: # 如果有 + get = get.replace("$HOME", get_home()) # 则把其替换为用户目录(~) + return get # 返回目录 + +# 数组转字典 +def ListToDictionary(list): + dictionary = {} + for i in range(len(list)): + dictionary[i] = list[i] + return dictionary + +# 读取文本文档 +def readtxt(path): + f = open(path, "r") # 设置文件对象 + str = f.read() # 获取内容 + f.close() # 关闭文本对象 + return str # 返回结果 + +# 写入文本文档 +def write_txt(path, things): + file = open(path, 'w', encoding='UTF-8') # 设置文件对象 + file.write(things) # 写入文本 + file.close() # 关闭文本对象 + +def GetApkInformation(apkFilePath): + return GetCommandReturn("aapt dump badging '{}'".format(apkFilePath)) + +def GetApkActivityName(apkFilePath): + info = GetApkInformation(apkFilePath) + for line in info.split('\n'): + if "launchable-activity" in line: + line = line[0: line.index("label='")] + line = line.replace("launchable-activity: ", "") + line = line.replace("'", "") + line = line.replace(" ", "") + line = line.replace("name=", "") + line = line.replace("label=", "") + line = line.replace("icon=", "") + return line + return f"{GetApkPackageName(apkFilePath, False)}.Main" + +def GetApkPackageName(apkFilePath, setting): + # 提示:此函数有被为此程序适配而调整,如果需要最原始(无调整的)请使用主程序(此为附属组件)里的函数 + info = GetApkInformation(apkFilePath) + for line in info.split('\n'): + if "package:" in line: + line = line[0: line.index("versionCode='")] + line = line.replace("package:", "") + line = line.replace("name=", "") + line = line.replace("'", "") + line = line.replace(" ", "") + # 此较为特殊,因为需要判断用户是否要添加前缀 + if setting: + return "uengine-dc-{}".format(line) + return line + +def GetApkVersion(apkFilePath): + info = GetApkInformation(apkFilePath) + for line in info.split('\n'): + if "package:" in line: + if "compileSdkVersion='" in line: + line = line.replace(line[line.index("compileSdkVersion='"): -1], "") + if "platform" in line: + line = line.replace(line[line.index("platform"): -1], "") + line = line.replace(line[0: line.index("versionName='")], "") + line = line.replace("versionName='", "") + line = line.replace("'", "") + line = line.replace(" ", "") + return line + +def BuildUengineDesktop(packageName, activityName, showName, iconPath, savePath, type): + if showName == "" or showName == None: + showName = "未知应用" + things = f''' + [Desktop Entry] +Categories=app; +Encoding=UTF-8 +Exec=/usr/bin/uengine launch --action=android.intent.action.MAIN --package={packageName} --component={activityName} +GenericName={showName} +Icon={iconPath} +MimeType= +Name={showName} +Categories={type}; +StartupWMClass={showName} +Terminal=false +Type=Application +''' + write_txt(savePath, things) + +# 获取软件的中文名称 +def GetApkChineseLabel(apkFilePath)->"获取软件的中文名称": + info = GetApkInformation(apkFilePath) + name = None + for line in info.split('\n'): + if "application-label-zh:" in line: + line = line.replace("application-label-zh:", "") + line = line.replace("'", "") + return line + if "application-label:" in line: + line = line.replace("application-label:", "") + line = line.replace("'", "") + name = line + return name + +#合并两个函数到一起 +def SaveApkIcon(apkFilePath, iconSavePath)->"获取 apk 文件的图标": + try: + info = GetApkInformation(apkFilePath) + for line in info.split('\n'): + if "application:" in line: + xmlpath = line.split(":")[-1].split()[-1].split("=")[-1].replace("'","") + if xmlpath.endswith('.xml'): + xmlsave = getsavexml() + print(xmlpath) + xmlsave.savexml(apkFilePath,xmlpath,iconSavePath) + else: + zip = zipfile.ZipFile(apkFilePath) + iconData = zip.read(xmlpath) + with open(iconSavePath, 'w+b') as saveIconFile: + saveIconFile.write(iconData) + return + print("Show defult icon") + shutil.copy(programPath + "/defult.svg", iconSavePath) + except: + traceback.print_exc() + print("Error, show defult icon") + shutil.copy(programPath + "/defult.svg", iconSavePath) + +def TextboxAddText1(message): + global textbox1 + if message.replace(" ", "").replace("\n", "") == "": + return + textbox1.append(message.replace("\n", "")) + +# 获取用户桌面目录 +def get_desktop_path(): + for line in open(get_home() + "/.config/user-dirs.dirs"): # 以行来读取配置文件 + desktop_index = line.find("XDG_DESKTOP_DIR=\"") # 寻找是否有对应项,有返回 0,没有返回 -1 + if desktop_index != -1: # 如果有对应项 + break # 结束循环 + if desktop_index == -1: # 如果是提前结束,值一定≠-1,如果是没有提前结束,值一定=-1 + return -1 + else: + get = line[17:-2] # 截取桌面目录路径 + get_index = get.find("$HOME") # 寻找是否有对应的项,需要替换内容 + if get != -1: # 如果有 + get = get.replace("$HOME", get_home()) # 则把其替换为用户目录(~) + return get # 返回目录 + +# 获取用户主目录 +def get_home(): + return os.path.expanduser('~') + +########################### +# 程序信息 +########################### +programPath = os.path.split(os.path.realpath(__file__))[0] # 返回 string +lang = get_now_lang() +langFile = json.loads(readtxt(programPath + "/Language.json")) +if not lang in langFile.keys(): + lang = "en_US.UTF-8" +information = json.loads(readtxt(programPath + "/information.json")) +version = information["Version"] +title = "{} {}".format(langFile[lang]["Uengine Apk Builder"]["Title"], version) +iconPath = "{}/builer.svg".format(os.path.split(os.path.realpath(__file__))[0]) + +########################### +# 加载配置 +########################### +if not os.path.exists(get_home() + "/.config/uengine-runner"): # 如果没有配置文件夹 + os.makedirs(get_home() + "/.config/uengine-runner") # 创建配置文件夹 +if not os.path.exists(get_home() + "/.config/uengine-runner/FindApkBuildHistory.json"): # 如果没有配置文件 + write_txt(get_home() + "/.config/uengine-runner/FindApkBuildHistory.json", json.dumps({})) # 创建配置文件 +if not os.path.exists(get_home() + "/.config/uengine-runner/FindApkBuild.json"): # 如果没有配置文件 + write_txt(get_home() + "/.config/uengine-runner/FindApkBuild.json", json.dumps({"path": "~"})) # 创建配置文件 + +########################### +# 设置变量 +########################### +findApkHistory = list(json.loads(readtxt(get_home() + "/.config/uengine-runner/FindApkBuildHistory.json")).values()) + +########################### +# 窗口创建 +########################### +app = QtWidgets.QApplication(sys.argv) +# 权重 +size = QtWidgets.QSizePolicy() +size.setHorizontalPolicy(0) +widgetSize = QtWidgets.QSizePolicy() +widgetSize.setVerticalPolicy(0) +# +window = QtWidgets.QMainWindow() +widget = QtWidgets.QWidget() +widgetLayout = QtWidgets.QGridLayout() +combobox1 = QtWidgets.QComboBox() +packageText = QtWidgets.QLineEdit() +versionText = QtWidgets.QLineEdit() +comText = QtWidgets.QLineEdit() +makerText = QtWidgets.QLineEdit() +typeChoose = QtWidgets.QComboBox() +nameText = QtWidgets.QLineEdit() +iconText = QtWidgets.QLineEdit() +label1 = QtWidgets.QLabel(langFile[lang]["Uengine Apk Builder"]["label1"]) +button2 = QtWidgets.QPushButton(langFile[lang]["Uengine Apk Builder"]["button2"]) +button3 = QtWidgets.QPushButton(langFile[lang]["Uengine Apk Builder"]["button3"]) +textbox1 = QtWidgets.QTextBrowser() +frame2 = QtWidgets.QHBoxLayout() +check = QtWidgets.QCheckBox(langFile[lang]["Uengine Apk Builder"]["check"]) +sizes = QtWidgets.QCheckBox(langFile[lang]["Uengine Apk Builder"]["size"]) +iconBrowser = QtWidgets.QPushButton("浏览") +iconBrowser.clicked.connect(FindIcon) +label1.setSizePolicy(size) +button2.setSizePolicy(size) +check.setSizePolicy(size) +button3.setSizePolicy(size) +combobox1.setEditable(True) +combobox1.addItems(findApkHistory) +combobox1.setEditText("") +button2.clicked.connect(FindApk) +button3.clicked.connect(BuildDeb) +typeChoose.addItems(["Network", "Chat", "Audio", "Video", "Graphics", "Office", "Translation", "Development", "Utility"]) +typeChoose.setCurrentText("Network") +widgetLayout.addWidget(label1, 0, 0, 1, 1) +widgetLayout.addWidget(combobox1, 0, 1, 1, 1) +widgetLayout.addWidget(button2, 0, 2, 1, 1) +widgetLayout.addWidget(QtWidgets.QLabel("包名:"), 1, 0) +widgetLayout.addWidget(packageText, 1, 1, 1, 1) +widgetLayout.addWidget(QtWidgets.QLabel("版本号:"), 2, 0) +widgetLayout.addWidget(versionText, 2, 1) +widgetLayout.addWidget(QtWidgets.QLabel("说明:"), 3, 0) +widgetLayout.addWidget(comText, 3, 1) +widgetLayout.addWidget(QtWidgets.QLabel("维护者:"), 4, 0) +widgetLayout.addWidget(makerText, 4, 1) +widgetLayout.addWidget(QtWidgets.QLabel("程序分类:"), 5, 0) +widgetLayout.addWidget(typeChoose, 5, 1) +widgetLayout.addWidget(QtWidgets.QLabel("程序名称:"), 6, 0) +widgetLayout.addWidget(nameText, 6, 1) +widgetLayout.addWidget(QtWidgets.QLabel("程序图标:"), 7, 0) +widgetLayout.addWidget(iconText, 7, 1) +widgetLayout.addWidget(iconBrowser, 7, 2) +widgetLayout.addLayout(frame2, 8, 1, 1, 1) +widgetLayout.addWidget(textbox1, 9, 0, 1, 3) +# 菜单栏 +menu = window.menuBar() +programmenu = menu.addMenu(langFile[lang]["Uengine Apk Builder"]["Menu"][0]["Name"]) +exitProgram = QtWidgets.QAction(langFile[lang]["Uengine Apk Builder"]["Menu"][0]["Menu"][0]) +exitProgram.triggered.connect(window.close) +programmenu.addAction(exitProgram) +# +check.setChecked(True) +#frame2.addWidget(check) +frame2.addWidget(sizes) +frame2.addWidget(button3) +widget.setLayout(widgetLayout) +window.setWindowTitle(title) +window.setCentralWidget(widget) +window.setWindowIcon(QtGui.QIcon(iconPath)) +window.resize(int(window.frameSize().width() * 1.3), int(window.frameSize().height() * 1.1)) +try: + combobox1.setCurrentText(sys.argv[1]) +except: + print("无参数") +window.show() +textList = [ + packageText, + versionText, + comText, + makerText, + nameText, + iconText + ] +sys.exit(app.exec_())