diff --git a/Icon/Microsoft Office Word.svg b/Icon/Microsoft Office Word.svg new file mode 100644 index 0000000..cd518d4 --- /dev/null +++ b/Icon/Microsoft Office Word.svg @@ -0,0 +1,267 @@ + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Icon/Unknown.svg b/Icon/Unknown.svg new file mode 100644 index 0000000..96dbeed --- /dev/null +++ b/Icon/Unknown.svg @@ -0,0 +1,328 @@ + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Icon/迅雷.svg b/Icon/迅雷.svg new file mode 100644 index 0000000..9f89815 --- /dev/null +++ b/Icon/迅雷.svg @@ -0,0 +1,267 @@ + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/buildshell/main.py b/buildshell/main.py new file mode 100644 index 0000000..39defad --- /dev/null +++ b/buildshell/main.py @@ -0,0 +1,16 @@ +import apt_pkg +import os +import apt_inst +import aptsources.distinfo +#print(apt_pkg.Cache.packages) +apt_pkg.init() +# 先更新 +os.system("sudo apt ssupdate && sudo apt upgrade -y") +#apt_inst +version = apt_pkg.Cache()["winehq-staging"].current_ver.ver_str +#version = apt_pkg.Package()["live-filesystem"].current_ver.arch +try: + new = version[: version.index("~")] +except: + new = version +# 差异对比 \ No newline at end of file diff --git a/deb/DEBIAN/control b/deb/DEBIAN/control index e365e58..18843c7 100755 --- a/deb/DEBIAN/control +++ b/deb/DEBIAN/control @@ -1,5 +1,5 @@ Package: spark-deepin-wine-runner -Version: 2.2.0 +Version: 2.2.0-Alpha2 Maintainer: gfdgd xi <3025613752@qq.com>, 为什么您不喜欢熊出没和阿布呢 Homepage: https://gitee.com/gfdgd-xi/deep-wine-runner, https://github.com/gfdgd-xi/deep-wine-runner, https://gitlink.org.cn/gfdgd_xi/deep-wine-runner Architecture: all @@ -9,7 +9,7 @@ Recommends: winbind Section: utils Conflicts: spark.deepin-venturi-setter, spark-deepin-wine5-application-packer, spark-deepin-wine-runner-52 Replaces: spark.deepin-venturi-setter, spark-deepin-wine5-application-packer, spark-deepin-wine-runner-52 -Installed-Size: 24948 +Installed-Size: 25152 Description: gfdgd xi、为什么您不喜欢熊出没和阿布呢 制作的 wine 运行器 2.1.0-1 更新内容: ※1、删除多余图标 diff --git a/deb/opt/apps/deepin-wine-runner/Icon/QQ.svg b/deb/opt/apps/deepin-wine-runner/Icon/QQ.svg new file mode 100644 index 0000000..2b858d4 --- /dev/null +++ b/deb/opt/apps/deepin-wine-runner/Icon/QQ.svg @@ -0,0 +1,342 @@ + + + +image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/deb/opt/apps/deepin-wine-runner/Icon/TIM.svg b/deb/opt/apps/deepin-wine-runner/Icon/TIM.svg new file mode 100644 index 0000000..df383e4 --- /dev/null +++ b/deb/opt/apps/deepin-wine-runner/Icon/TIM.svg @@ -0,0 +1,289 @@ + + + + + + image/svg+xml + + tim + + + + + + tim + Created with Sketch. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/deb/opt/apps/deepin-wine-runner/Icon/UltraISO.svg b/deb/opt/apps/deepin-wine-runner/Icon/UltraISO.svg new file mode 100644 index 0000000..868d740 --- /dev/null +++ b/deb/opt/apps/deepin-wine-runner/Icon/UltraISO.svg @@ -0,0 +1,1275 @@ + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/deb/opt/apps/deepin-wine-runner/Icon/Unknown.svg b/deb/opt/apps/deepin-wine-runner/Icon/Unknown.svg new file mode 100644 index 0000000..96dbeed --- /dev/null +++ b/deb/opt/apps/deepin-wine-runner/Icon/Unknown.svg @@ -0,0 +1,328 @@ + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/deb/opt/apps/deepin-wine-runner/Icon/微信.svg b/deb/opt/apps/deepin-wine-runner/Icon/微信.svg new file mode 100644 index 0000000..bab296b --- /dev/null +++ b/deb/opt/apps/deepin-wine-runner/Icon/微信.svg @@ -0,0 +1,338 @@ + + + + + + image/svg+xml + + 微信 + + + + + + 微信 + Created with Sketch. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/deb/opt/apps/deepin-wine-runner/InstallNetFramework.py b/deb/opt/apps/deepin-wine-runner/InstallNetFramework.py index 8a29b65..f4a9a8b 100755 --- a/deb/opt/apps/deepin-wine-runner/InstallNetFramework.py +++ b/deb/opt/apps/deepin-wine-runner/InstallNetFramework.py @@ -18,6 +18,8 @@ try: netList = json.loads(requests.get("https://code.gitlink.org.cn/gfdgd_xi/wine-runner-list/raw/branch/master/net/list.json").text) except: netList = [ + ["Microsoft® .NET Framework 1.1 版可转散发套件", "https://download.microsoft.com/download/8/2/7/827bb1ef-f5e1-4464-9788-40ef682930fd/dotnetfx.exe"], + ["Microsoft .NET Framework 2.0 Service Pack 1 (x86)", "https://download.microsoft.com/download/0/8/c/08c19fa4-4c4f-4ffb-9d6c-150906578c9e/NetFx20SP1_x86.exe"], ["3.5 SP1 Offline Installer", "https://download.visualstudio.microsoft.com/download/pr/b635098a-2d1d-4142-bef6-d237545123cb/2651b87007440a15209cac29634a4e45/dotnetfx35.exe"], ["4.0 Offline Installer", "https://download.microsoft.com/download/9/5/A/95A9616B-7A37-4AF6-BC36-D6EA96C8DAAE/dotNetFx40_Full_x86_x64.exe"], ["4.5 Web Installer", "https://download.microsoft.com/download/B/A/4/BA4A7E71-2906-4B2D-A0E1-80CF16844F5F/dotNetFx45_Full_setup.exe"], @@ -29,7 +31,18 @@ except: ["4.7 Offline Installer", "https://download.visualstudio.microsoft.com/download/pr/2dfcc711-bb60-421a-a17b-76c63f8d1907/e5c0231bd5d51fffe65f8ed7516de46a/ndp47-kb3186497-x86-x64-allos-enu.exe"], ["4.7.1 Offline Installer", "https://download.visualstudio.microsoft.com/download/pr/4312fa21-59b0-4451-9482-a1376f7f3ba4/9947fce13c11105b48cba170494e787f/ndp471-kb4033342-x86-x64-allos-enu.exe"], ["4.7.2 Offline Installer", "https://download.visualstudio.microsoft.com/download/pr/1f5af042-d0e4-4002-9c59-9ba66bcf15f6/089f837de42708daacaae7c04b7494db/ndp472-kb4054530-x86-x64-allos-enu.exe"], - ["4.8 Offline Installer", "https://download.visualstudio.microsoft.com/download/pr/2d6bb6b2-226a-4baa-bdec-798822606ff1/8494001c276a4b96804cde7829c04d7f/ndp48-x86-x64-allos-enu.exe"] + ["4.8 Offline Installer", "https://download.visualstudio.microsoft.com/download/pr/2d6bb6b2-226a-4baa-bdec-798822606ff1/8494001c276a4b96804cde7829c04d7f/ndp48-x86-x64-allos-enu.exe"], + ["4.8.1 Offline Installer", "https://download.visualstudio.microsoft.com/download/pr/6f083c7e-bd40-44d4-9e3f-ffba71ec8b09/3951fd5af6098f2c7e8ff5c331a0679c/ndp481-x86-x64-allos-enu.exe"], + [".NET 5.0 Desktop Runtime (v5.0.17) - Windows x86 Installer", "https://download.visualstudio.microsoft.com/download/pr/b6fe5f2a-95f4-46f1-9824-f5994f10bc69/db5ec9b47ec877b5276f83a185fdb6a0/windowsdesktop-runtime-5.0.17-win-x86.exe"], + [".NET 5.0 Desktop Runtime (v5.0.17) - Windows x64 Installer", "https://download.visualstudio.microsoft.com/download/pr/3aa4e942-42cd-4bf5-afe7-fc23bd9c69c5/64da54c8864e473c19a7d3de15790418/windowsdesktop-runtime-5.0.17-win-x64.exe"], + [".NET 5.0 Desktop Runtime (v5.0.17) - Windows Arm64 Installer", "https://download.visualstudio.microsoft.com/download/pr/be25784a-4231-4c53-ba6e-869166ef523f/9602c6c0d358d31dc710fd0573fc39e0/windowsdesktop-runtime-5.0.17-win-arm64.exe"], + [".NET Core 3.0 Desktop Runtime (v3.0.3) - Windows x86 Installer", "https://download.visualstudio.microsoft.com/download/pr/e312618d-85c4-4cad-b660-569b5522eca9/e951e76ebe011b5d3ea1289ef68e8281/windowsdesktop-runtime-3.0.3-win-x86.exe"], + [".NET Core 3.0 Desktop Runtime (v3.0.3) - Windows x64 Installer", "https://download.visualstudio.microsoft.com/download/pr/c525a2bb-6e98-4e6e-849e-45241d0db71c/d21612f02b9cae52fa50eb54de905986/windowsdesktop-runtime-3.0.3-win-x64.exe"], + [".NET Core 3.1 Desktop Runtime (v3.1.28) - Windows x86 Installer", "https://download.visualstudio.microsoft.com/download/pr/d2ec7ca2-017d-4d06-a6da-3707daa3c3b1/1f2e108653e3d8316e1657105ef24b93/windowsdesktop-runtime-3.1.28-win-x86.exe"], + [".NET Core 3.1 Desktop Runtime (v3.1.28) - Windows x64 Installer", "https://download.visualstudio.microsoft.com/download/pr/5c74593e-f156-44c8-9957-f11996de72bc/d3e0e26c64a5a2d860c5c0deca975d78/windowsdesktop-runtime-3.1.28-win-x64.exe"], + [".NET 6.0 Desktop Runtime (v6.0.8) - Windows x86 Installer", "https://download.visualstudio.microsoft.com/download/pr/61747fc6-7236-4d5e-85e5-a5df5f480f3a/02203594bf1331f0875aa6491419ffa1/windowsdesktop-runtime-6.0.8-win-x86.exe"], + [".NET 6.0 Desktop Runtime (v6.0.8) - Windows x64 Installer", "https://download.visualstudio.microsoft.com/download/pr/b4a17a47-2fe8-498d-b817-30ad2e23f413/00020402af25ba40990c6cc3db5cb270/windowsdesktop-runtime-6.0.8-win-x64.exe"], + [".NET 6.0 Desktop Runtime (v6.0.8) - Windows Arm64 Installer", "https://download.visualstudio.microsoft.com/download/pr/17737b16-dbb0-45f8-9684-16cce46f0835/14475e8380422840249513d58c70d8da/windowsdesktop-runtime-6.0.8-win-arm64.exe"] ] def Download(wineBotton: str, id: int, wine: str): diff --git a/deb/opt/apps/deepin-wine-runner/InstallVisualCPlusPlus.py b/deb/opt/apps/deepin-wine-runner/InstallVisualCPlusPlus.py index ace14b6..26a136a 100755 --- a/deb/opt/apps/deepin-wine-runner/InstallVisualCPlusPlus.py +++ b/deb/opt/apps/deepin-wine-runner/InstallVisualCPlusPlus.py @@ -18,6 +18,7 @@ try: netList = json.loads(requests.get("https://code.gitlink.org.cn/gfdgd_xi/wine-runner-list/raw/branch/master/vscpp/list.json").text) except: netList = [ + ["VC6 运行库", "https://code.gitlink.org.cn/gfdgd_xi/wine-runner-list/raw/branch/master/vscpp/VC6RedistSetup_deu.exe"], ["2005 Service Pack 1 Redistributable Package MFC 安全更新", "https://download.microsoft.com/download/4/A/2/4A22001F-FA3B-4C13-BF4E-42EC249D51C4/vcredist_x86.EXE", "vcredist05_x86.exe"], ["2008 (VC++ 9.0) SP1 (不再支持) X86", "https://download.microsoft.com/download/5/D/8/5D8C65CB-C849-4025-8E95-C3966CAFD8AE/vcredist_x86.exe", "vcredist08_x86.exe"], ["2008 (VC++ 9.0) SP1 (不再支持) X64", "https://download.microsoft.com/download/5/D/8/5D8C65CB-C849-4025-8E95-C3966CAFD8AE/vcredist_x64.exe", "vcredist08_x86.exe"], diff --git a/deb/opt/apps/deepin-wine-runner/Model/__init__.py b/deb/opt/apps/deepin-wine-runner/Model/__init__.py index 7f043be..eee72d3 100644 --- a/deb/opt/apps/deepin-wine-runner/Model/__init__.py +++ b/deb/opt/apps/deepin-wine-runner/Model/__init__.py @@ -1,4 +1,6 @@ import os +import sys +import PyQt5.QtWidgets as QtWidgets def OpenTerminal(command): if terminalEnd[terminal][1]: os.system(f"\"{terminal}\" \"{terminalEnd[terminal][0]}\" \"{command}\"") @@ -12,12 +14,14 @@ terminal = "" terminalList = [ "deepin-terminal", "mate-terminal", - "gnome-terminal" + "gnome-terminal", + "xfce4-terminal" ] terminalEnd = { f"{programPath}/../launch.sh\" \"deepin-terminal": ["-e", 0], "mate-terminal": ["-e", 1], - "gnome-terminal": ["--", 0] + "gnome-terminal": ["--", 0], + "xfce4-terminal": ["-e", 1] } for i in terminalList: if not os.system(f"which {i}"): @@ -28,4 +32,6 @@ for i in terminalList: if terminal == "": print("无法识别到以下的任意一个终端") print(" ".join(terminalList)) + app = QtWidgets.QApplication(sys.argv) + QtWidgets.QMessageBox.critical(None, "错误", "无法识别到以下的任意一个终端\n" + " ".join(terminalList)) exit() diff --git a/deb/opt/apps/deepin-wine-runner/Model/__pycache__/__init__.cpython-37.pyc b/deb/opt/apps/deepin-wine-runner/Model/__pycache__/__init__.cpython-37.pyc index 3a4bb90..6766788 100644 Binary files a/deb/opt/apps/deepin-wine-runner/Model/__pycache__/__init__.cpython-37.pyc and b/deb/opt/apps/deepin-wine-runner/Model/__pycache__/__init__.cpython-37.pyc differ diff --git a/deb/opt/apps/deepin-wine-runner/deepin-wine-packager.py b/deb/opt/apps/deepin-wine-runner/deepin-wine-packager.py index 404ee51..0bb68d1 100755 --- a/deb/opt/apps/deepin-wine-runner/deepin-wine-packager.py +++ b/deb/opt/apps/deepin-wine-runner/deepin-wine-packager.py @@ -102,6 +102,17 @@ def make_deb(build=False): if QtWidgets.QMessageBox.question(widget, QtCore.QCoreApplication.translate("U", "提示"), QtCore.QCoreApplication.translate("U", "打包将会改动现在选择的容器,是否继续?")) == QtWidgets.QMessageBox.No: disabled_or_NORMAL_all(True) return + # 警告信息 + if os.path.exists(e7_text.text()): + if QtWidgets.QMessageBox.warning(window, "警告", "输入的路径似乎是一个绝对路径\n不建议打包绝对路径,建议是 Wine 容器内路径\n是否继续打包?", QtWidgets.QMessageBox.Yes | QtWidgets.QMessageBox.No) == QtWidgets.QMessageBox.No: + disabled_or_NORMAL_all(True) + return + if e7_text.text()[:2].lower() == "c:" and not os.path.exists("{}/drive_c/{}".format( + e6_text.text(), + e7_text.text()[3:].replace("\\", '/'))): + if QtWidgets.QMessageBox.warning(window, "警告", "输入的路径似乎在 Wine 容器不存在(如果只是大小写错误导致的误判,请忽略)\n是否继续打包?", QtWidgets.QMessageBox.Yes | QtWidgets.QMessageBox.No) == QtWidgets.QMessageBox.No: + disabled_or_NORMAL_all(True) + return #thread = threading.Thread(target=make_deb_threading) QT.thread = make_deb_threading(build) QT.thread.signal.connect(chang_textbox1_things) diff --git a/deb/opt/apps/deepin-wine-runner/deepin-wine-runner b/deb/opt/apps/deepin-wine-runner/deepin-wine-runner index dbf272b..713ede7 100755 --- a/deb/opt/apps/deepin-wine-runner/deepin-wine-runner +++ b/deb/opt/apps/deepin-wine-runner/deepin-wine-runner @@ -161,9 +161,11 @@ class Runexebutton_threading(QtCore.QThread): option += f"WINEDLLOVERRIDES=\"mscoree,mshtml=\" " if not setting["Debug"]: option += "WINEDEBUG=-all " + else: + option += "WINEDEBUG=FIXME,ERR,WARN,TRACE,Message " wineUsingOption = "" if o1.currentText() == "基于 exagear 的 deepin-wine6-stable" or o1.currentText() == "基于 box86 的 deepin-wine6-stable": - wineUsingOption = "--disable-gpu" + wineUsingOption = "" if o1.currentText() == "基于 exagear 的 deepin-wine6-stable": os.system(f"'{programPath}/deepin-wine-runner-create-botton.py' '{wineBottonPath}'") if o1.currentText() == "基于 box86 的 deepin-wine6-stable": @@ -174,10 +176,16 @@ class Runexebutton_threading(QtCore.QThread): os.remove(f"{programPath}/dlls-arm.7z") if setting["TerminalOpen"]: res = "" - OpenTerminal("env WINEPREFIX='" + wineBottonPath + "' " + option + wine[o1.currentText()] + " '" + e2.currentText() + "' " + setting["WineOption"]) + if e2.currentText()[-4:] == ".msi" and os.path.exists(e2.currentText()): + OpenTerminal("env WINEPREFIX='" + wineBottonPath + "' " + option + wine[o1.currentText()] + " msiexec /i '" + e2.currentText() + "' " + setting["WineOption"]) + else: + OpenTerminal("env WINEPREFIX='" + wineBottonPath + "' " + option + wine[o1.currentText()] + " '" + e2.currentText() + "' " + setting["WineOption"]) #res = subprocess.Popen([f"'{programPath}/launch.sh' deepin-terminal -C \"WINEPREFIX='" + wineBottonPath + "' " + option + wine[o1.currentText()] + " '" + e2.currentText() + "' " + setting["WineOption"] + "\" --keep-open" + wineUsingOption], shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) else: - res = subprocess.Popen(["WINEPREFIX='" + wineBottonPath + "' " + option + wine[o1.currentText()] + " '" + e2.currentText() + "' " + setting["WineOption"]], shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) + if e2.currentText()[-4:] == ".msi" and os.path.exists(e2.currentText()): + res = subprocess.Popen(["WINEPREFIX='" + wineBottonPath + "' " + option + wine[o1.currentText()] + " msiexec /i '" + e2.currentText() + "' " + setting["WineOption"]], shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) + else: + res = subprocess.Popen(["WINEPREFIX='" + wineBottonPath + "' " + option + wine[o1.currentText()] + " '" + e2.currentText() + "' " + setting["WineOption"]], shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) # 实时读取程序返回 # if not setting["TerminalOpen"]: @@ -195,6 +203,28 @@ class Runexebutton_threading(QtCore.QThread): wineBottonHistory.append(e2.currentText()) # 将记录写进数组 write_txt(get_home() + "/.config/deepin-wine-runner/WineBottonHistory.json", str(json.dumps(ListToDictionary(wineBottonHistory)))) # 将历史记录的数组转换为字典并写入 self.showHistory.emit("") + # 针对 QQ、TIM 安装后不会生成 lnk 的问题,由程序读取以及自动创建 + # 判断是否安装了 QQ/TIM + for i in iconListUnBuild: + if os.path.exists(i[1].replace("wineBottonPath", wineBottonPath)): + if not os.path.exists(f"{get_home()}/.local/share/applications/wine/{i[0]}-{os.path.basename(wineBottonPath)}.desktop"): + print("图标不存在,创建图标") + # 图标不存在 + # 写入 .desktop 文件 + try: + os.system(f"mkdir -p '{get_home()}/.local/share/applications/wine'") + name = i[0] + if setting["BuildByBottleName"]: + name = f"{i[0]}——{os.path.basename(wineBottonPath)}" + write_txt(f"{get_home()}/.local/share/applications/wine/{i[0]}-{os.path.basename(wineBottonPath)}.desktop", f'''[Desktop Entry] +Name={name} +Exec=env WINEPREFIX='{wineBottonPath}' {option} {wine[o1.currentText()]} '{i[1].replace("wineBottonPath", wineBottonPath)}' {setting["WineOption"]} {wineUsingOption} +Icon={programPath}/Icon/{i[0]}.svg +Type=Application +StartupNotify=true''') + except: + # 写入不进去就别写入了,当什么事情都没发生就行 + traceback.print_exc() DisableButton(False) @@ -255,6 +285,8 @@ def make_desktop_on_launcher(): option += f"WINEARCH={setting['Architecture']} " if not setting["Debug"]: option += "WINEDEBUG=-all " + else: + option += "WINEDEBUG=FIXME,ERR,WARN,TRACE,Message " wineUsingOption = "" if o1.currentText() == "基于 box86 的 deepin-wine6-stable": if not os.path.exists(f"{programPath}/dlls-arm"): @@ -263,11 +295,24 @@ def make_desktop_on_launcher(): return os.remove(f"{programPath}/dlls-arm.7z") if o1.currentText() == "基于 exagear 的 deepin-wine6-stable" or o1.currentText() == "基于 box86 的 deepin-wine6-stable": - wineUsingOption = "--disable-gpu" - write_txt(get_home() + "/.local/share/applications/" + combobox1.currentText() + ".desktop", f'''[Desktop Entry] + wineUsingOption = "" + value = "" + if e2.currentText()[:2].upper() == "C:": + value = f"{wineBottonPath}/drive_c/{e2.currentText()[2:]}".replace("\\", "/").replace("//", "/") + print(value) + iconPaths = iconPath + for i in iconList: + listValue = i[1].replace("wineBottonPath", wineBottonPath) + if listValue == e2.currentText() or listValue == value: + # 如果路径相同,即可以用程序对应的图标 + iconPaths = f"{programPath}/Icon/{i[0]}.svg" + # 读到了就不需要再读取了 + break + os.system(f"mkdir -p '{get_home()}/.local/share/applications/wine'") + write_txt(get_home() + "/.local/share/applications/wine/" + combobox1.currentText() + ".desktop", f'''[Desktop Entry] Name={combobox1.currentText()} Exec=env WINEPREFIX='{wineBottonPath}' {option} {wine[o1.currentText()]} '{e2.currentText()}' {setting["WineOption"]} {wineUsingOption} -Icon={iconPath} +Icon={iconPaths} Type=Application StartupNotify=true''') # 写入文本文档 if len(shellHistory) == 0 or shellHistory[-1] != combobox1.currentText(): @@ -304,7 +349,7 @@ def make_desktop_on_desktop(): wineBottonPath = e1.currentText() wineUsingOption = "" if o1.currentText() == "基于 exagear 的 deepin-wine6-stable" or o1.currentText() == "基于 box86 的 deepin-wine6-stable": - wineUsingOption = "--disable-gpu" + wineUsingOption = "" if o1.currentText() == "基于 box86 的 deepin-wine6-stable": if not os.path.exists(f"{programPath}/dlls-arm"): if os.system(f"7z x \"{programPath}/dlls-arm.7z\" -o\"{programPath}\""): @@ -319,10 +364,23 @@ def make_desktop_on_desktop(): option += f"WINEARCH={setting['Architecture']} " if not setting["Debug"]: option += "WINEDEBUG=-all " + value = "" + if e2.currentText()[:2].upper() == "C:": + value = f"{wineBottonPath}/drive_c/{e2.currentText()[2:]}".replace("\\", "/").replace("//", "/") + print(value) + iconPaths = iconPath + for i in iconList: + listValue = i[1].replace("wineBottonPath", wineBottonPath) + if listValue == e2.currentText() or listValue == value: + # 如果路径相同,即可以用程序对应的图标 + iconPaths = f"{programPath}/Icon/{i[0]}.svg" + # 读到了就不需要再读取了 + break + os.system(f"mkdir -p '{get_home()}/.local/share/applications/wine'") write_txt(get_desktop_path() + "/" + combobox1.currentText() + ".desktop", f'''[Desktop Entry] Name={combobox1.currentText()} Exec=env WINEPREFIX='{wineBottonPath}' {option} {wine[o1.currentText()]} '{e2.currentText()}' {setting["WineOption"]} {wineUsingOption} -Icon={iconPath} +Icon={iconPaths} Type=Application StartupNotify=true''') # 写入文本文档 if len(shellHistory) == 0 or shellHistory[-1] != combobox1.currentText(): @@ -418,7 +476,7 @@ class RunWineProgramThread(QtCore.QThread): if o1.currentText() == "基于 exagear 的 deepin-wine6-stable": os.system(f"'{programPath}/deepin-wine-runner-create-botton.py' '{wineBottonPath}'") if o1.currentText() == "基于 exagear 的 deepin-wine6-stable" or o1.currentText() == "基于 box86 的 deepin-wine6-stable": - wineUsingOption = "--disable-gpu" + wineUsingOption = "" if o1.currentText() == "基于 box86 的 deepin-wine6-stable": if not os.path.exists(f"{programPath}/dlls-arm"): if os.system(f"7z x \"{programPath}/dlls-arm.7z\" -o\"{programPath}\""): @@ -482,7 +540,7 @@ class RunWinetricksThread(QtCore.QThread): option += "WINEDEBUG=-all " wineUsingOption = "" if o1.currentText() == "基于 exagear 的 deepin-wine6-stable" or o1.currentText() == "基于 box86 的 deepin-wine6-stable": - wineUsingOption = "--disable-gpu" + wineUsingOption = "" if o1.currentText() == "基于 box86 的 deepin-wine6-stable": if not os.path.exists(f"{programPath}/dlls-arm"): if os.system(f"7z x \"{programPath}/dlls-arm.7z\" -o\"{programPath}\""): @@ -504,6 +562,8 @@ class RunWinetricksThread(QtCore.QThread): text = "" self.signal.emit(text) print(text, end="") + + DisableButton(False) runWinetricks = None @@ -808,6 +868,7 @@ class GetDllFromWindowsISO: mount = False mountButton = None dllListModel = None + arch = 0 def ShowWindow(): #DisableButton(True) GetDllFromWindowsISO.message = QtWidgets.QMainWindow() @@ -816,8 +877,8 @@ class GetDllFromWindowsISO: if not e1.currentText() == "": GetDllFromWindowsISO.wineBottonPath = e1.currentText() widgetLayout.addWidget(QtWidgets.QLabel(f"""提示: - 目前本提取功能只支持 Windows XP 以及 Windows Server 2003 等老系统的官方安装镜像,只支持读取 i386 安装方法的安装镜像,不支持读取 wim、ghost 安装方式 - 以及不要拷贝/替换太多的 dll,否则可能会导致 wine 容器异常 + 目前本提取功能暂只支持 NT 内核系统的官方安装镜像,不支持读取 ghost 等第三方封装方式的安装镜像 + 以及不要拷贝/替换太多的 dll,否则可能会导致 wine 容器异常,以及不要替换 Wine 的核心 dll 最后,拷贝/替换 dll 后,建议点击下面“设置 wine 容器”按钮==》函数库 进行设置 当前选择的 Wine 容器:{GetDllFromWindowsISO.wineBottonPath}"""), 0, 0, 1, 5) isoLabel = QtWidgets.QLabel(QtCore.QCoreApplication.translate("U", "ISO镜像:")) @@ -903,16 +964,38 @@ class GetDllFromWindowsISO: findList = [] try: if found == "": - for i in os.listdir("/tmp/wine-runner-getdll/i386"): - if i[-3:] == "dl_": - findList.append(i[:-1] + "l") + # 显示所有内容 + # 下面内容需要分类讨论 + if GetDllFromWindowsISO.arch == 0: + for i in os.listdir("/tmp/wine-runner-getdll/i386"): + if i[-3:] == "dl_": + findList.append(i[:-1] + "l") + elif GetDllFromWindowsISO.arch == 32: + for i in os.listdir("/tmp/wine-runner-getdll-wim/Windows/SysWOW64"): + if i[-3:] == "dll": + findList.append(i[:-1] + "l") + elif GetDllFromWindowsISO.arch == 64: + for i in os.listdir("/tmp/wine-runner-getdll-wim/Windows/System32"): + if i[-3:] == "dll": + findList.append(i[:-1] + "l") + GetDllFromWindowsISO.dllListModel.setStringList(findList) return - for i in os.listdir("/tmp/wine-runner-getdll/i386"): - if found in i[:-1] + "l": - findList.append(i[:-1] + "l") - if len(isoPath) == 0 or isoPathFound[-1] != found: - isoPathFound.append(found) # 将记录写进数组 - write_txt(get_home() + "/.config/deepin-wine-runner/ISOPathFound.json", str(json.dumps(ListToDictionary(isoPathFound)))) # 将历史记录的数组转换为字典并写入 + if GetDllFromWindowsISO.arch == 0: + for i in os.listdir("/tmp/wine-runner-getdll/i386"): + if found in i[:-1] + "l": + findList.append(i[:-1] + "l") + elif GetDllFromWindowsISO.arch == 32: + for i in os.listdir("/tmp/wine-runner-getdll-wim/Windows/SysWOW64"): + if found in i[:-1] + "l": + findList.append(i[:-1] + "l") + elif GetDllFromWindowsISO.arch == 64: + for i in os.listdir("/tmp/wine-runner-getdll-wim/Windows/System32"): + if found in i[:-1] + "l": + findList.append(i[:-1] + "l") + if len(isoPath) == 0: + if isoPathFound[-1] != found: + isoPathFound.append(found) # 将记录写进数组 + write_txt(get_home() + "/.config/deepin-wine-runner/ISOPathFound.json", str(json.dumps(ListToDictionary(isoPathFound)))) # 将历史记录的数组转换为字典并写入 GetDllFromWindowsISO.dllFound.clear() GetDllFromWindowsISO.dllFound.addItems(isoPathFound) GetDllFromWindowsISO.dllListModel.setStringList(findList) @@ -928,11 +1011,15 @@ class GetDllFromWindowsISO: if os.path.exists("/tmp/wine-runner-getdll"): try: os.rmdir("/tmp/wine-runner-getdll") + os.rmdir("/tmp/wine-runner-getdll-wim") except: # 如果无法删除可能是挂载了文件 + os.system("wimunmount /tmp/wine-runner-getdll-wim") os.system("pkexec umount /tmp/wine-runner-getdll") + try: os.rmdir("/tmp/wine-runner-getdll") + os.rmdir("/tmp/wine-runner-getdll-wim") except: traceback.print_exc() QtWidgets.QMessageBox.critical(GetDllFromWindowsISO.message, "错误", traceback.format_exc()) @@ -940,15 +1027,60 @@ class GetDllFromWindowsISO: os.makedirs("/tmp/wine-runner-getdll") os.system(f"pkexec mount '{GetDllFromWindowsISO.isoPath.currentText()}' /tmp/wine-runner-getdll") findList = [] - try: - for i in os.listdir("/tmp/wine-runner-getdll/i386"): - if i[-3:] == "dl_": - findList.append(i[:-1] + "l") - except: - traceback.print_exc() - QtWidgets.QMessageBox.critical(GetDllFromWindowsISO.message, "错误", f"镜像内容读取/挂载失败,报错如下:\n{traceback.format_exc()}") - return - GetDllFromWindowsISO.dllListModel.setStringList(findList) + # 判断是新版的 Windows ISO(Windows Vista 及以上版本) + if os.path.exists("/tmp/wine-runner-getdll/sources/install.wim"): + # 是新版,挂载 wim + # 需要让用户选择挂载内容 + QtWidgets.QInputDialog.getMultiLineText(GetDllFromWindowsISO.message, "提示", "挂载文件需要用户记住并在下一个对话框输入 Index 以挂载正确的镜像,按下下方任意按钮即可继续", subprocess.getoutput("wiminfo '/tmp/wine-runner-getdll/sources/install.wim'")) + choose = QtWidgets.QInputDialog.getInt(GetDllFromWindowsISO.message, "提示", "请输入 Index") + if not choose[1]: + return + os.makedirs("/tmp/wine-runner-getdll-wim") + os.system(f"wimmount /tmp/wine-runner-getdll/sources/install.wim {choose[0]} /tmp/wine-runner-getdll-wim") + if os.path.exists("/tmp/wine-runner-getdll-wim/Windows/SysWOW64"): + # 如果是 64 位镜像 + if QtWidgets.QInputDialog.getItem(GetDllFromWindowsISO.message, "选择位数", "选择位数(如果没有选择,默认为 64 位)", ["32", "64"], 1, False) == "32": + # 64 位镜像的 32 位是存在 SysWOW64 的 + try: + for i in os.listdir("/tmp/wine-runner-getdll-wim/Windows/SysWOW64"): + if i[-3:] == "dll": + findList.append(i[:-1] + "l") + GetDllFromWindowsISO.dllListModel.setStringList(findList) + GetDllFromWindowsISO.arch = 32 + GetDllFromWindowsISO.DisbledDown(False) + GetDllFromWindowsISO.DisbledUp(True) + GetDllFromWindowsISO.mount = True + if len(isoPath) == 0 or isoPath[-1] != GetDllFromWindowsISO.isoPath.currentText(): + isoPath.append(GetDllFromWindowsISO.isoPath.currentText()) # 将记录写进数组 + write_txt(get_home() + "/.config/deepin-wine-runner/ISOPath.json", str(json.dumps(ListToDictionary(isoPath)))) # 将历史记录的数组转换为字典并写入 + GetDllFromWindowsISO.isoPath.clear() + GetDllFromWindowsISO.isoPath.addItems(isoPath) + return + except: + traceback.print_exc() + QtWidgets.QMessageBox.critical(GetDllFromWindowsISO.message, "错误", f"镜像内容读取/挂载失败,报错如下:\n{traceback.format_exc()}") + return + try: + for i in os.listdir("/tmp/wine-runner-getdll-wim/Windows/System32"): + if i[-3:] == "dll": + findList.append(i[:-1] + "l") + GetDllFromWindowsISO.arch = 64 + except: + traceback.print_exc() + QtWidgets.QMessageBox.critical(GetDllFromWindowsISO.message, "错误", f"镜像内容读取/挂载失败,报错如下:\n{traceback.format_exc()}") + return + GetDllFromWindowsISO.dllListModel.setStringList(findList) + else: + try: + for i in os.listdir("/tmp/wine-runner-getdll/i386"): + if i[-3:] == "dl_": + findList.append(i[:-1] + "l") + GetDllFromWindowsISO.arch = 0 + except: + traceback.print_exc() + QtWidgets.QMessageBox.critical(GetDllFromWindowsISO.message, "错误", f"镜像内容读取/挂载失败,报错如下:\n{traceback.format_exc()}") + return + GetDllFromWindowsISO.dllListModel.setStringList(findList) GetDllFromWindowsISO.DisbledDown(False) GetDllFromWindowsISO.DisbledUp(True) GetDllFromWindowsISO.mount = True @@ -960,9 +1092,11 @@ class GetDllFromWindowsISO: #GetDllFromWindowsISO.isoPath['value'] = isoPath def UmountDisk(): + os.system("wimunmount /tmp/wine-runner-getdll-wim") os.system("pkexec umount /tmp/wine-runner-getdll") try: shutil.rmtree("/tmp/wine-runner-getdll") + os.system("rm -rf /tmp/wine-runner-getdll-wim") except: traceback.print_exc() QtWidgets.QMessageBox.critical(GetDllFromWindowsISO.message, QtCore.QCoreApplication.translate("U", "错误"), f"关闭/卸载镜像失败,报错如下:\n{traceback.format_exc()}") @@ -975,11 +1109,23 @@ class GetDllFromWindowsISO: def CopyDll(): choose = GetDllFromWindowsISO.dllList.selectionModel().selectedIndexes()[0].data() if os.path.exists(f"{GetDllFromWindowsISO.wineBottonPath}/drive_c/windows/system32/{choose}"): - if QtWidgets.QMessageBox.question(widget, "提示", f"DLL {choose} 已经存在,是否覆盖?") == QtWidgets.QMessageBox.No: + if QtWidgets.QMessageBox.question(GetDllFromWindowsISO.message, "提示", f"DLL {choose} 已经存在,是否覆盖?") == QtWidgets.QMessageBox.No: return try: - shutil.copy(f"/tmp/wine-runner-getdll/i386/{choose[:-1]}_", f"{GetDllFromWindowsISO.wineBottonPath}/drive_c/windows/system32/{choose}") - os.system(f"WINEPREFIX='{GetDllFromWindowsISO.wineBottonPath}' '{wine[o1.currentText()]}' reg add 'HKEY_CURRENT_USER\Software\Wine\DllOverrides' /v {os.path.splitext(choose)[0]} /d native /f") + # 要分类讨论 + if GetDllFromWindowsISO.arch == 0: + shutil.copy(f"/tmp/wine-runner-getdll/i386/{choose[:-1]}_", f"{GetDllFromWindowsISO.wineBottonPath}/drive_c/windows/system32/{choose}") + elif GetDllFromWindowsISO.arch == 32: + shutil.copy(f"/tmp/wine-runner-getdll-wim/Windows/SysWOW64/{choose[:-1]}l", f"{GetDllFromWindowsISO.wineBottonPath}/drive_c/windows/system32/{choose}") + elif GetDllFromWindowsISO.arch == 64: + shutil.copy(f"/tmp/wine-runner-getdll-wim/Windows/System32/{choose[:-1]}l", f"{GetDllFromWindowsISO.wineBottonPath}/drive_c/windows/system32/{choose}") + # 选择原装或优于内建 + if QtWidgets.QInputDialog.getItem(GetDllFromWindowsISO.message, "选择", "选择模式", ["原装先于内建", "原装"], 0, False) == "原装先于内建": + # 原装先于内建 + os.system(f"WINEPREFIX='{GetDllFromWindowsISO.wineBottonPath}' '{wine[o1.currentText()]}' reg add 'HKEY_CURRENT_USER\Software\Wine\DllOverrides' /v {os.path.splitext(choose)[0]} /d native,builtin /f") + else: + # 原装 + os.system(f"WINEPREFIX='{GetDllFromWindowsISO.wineBottonPath}' '{wine[o1.currentText()]}' reg add 'HKEY_CURRENT_USER\Software\Wine\DllOverrides' /v {os.path.splitext(choose)[0]} /d native /f") QtWidgets.QMessageBox.information(GetDllFromWindowsISO.message, "提示", "提取成功!") except: traceback.print_exc() @@ -1111,13 +1257,14 @@ class ProgramRunStatusUpload(): try: if ProgramRunStatusUpload.sha1Value == "": ProgramRunStatusUpload.sha1Value = ProgramRunStatusUpload.GetSHA1(e2.currentText()) - QtWidgets.QMessageBox.information(None, QtCore.QCoreApplication.translate("U", "提示"), json.loads(requests.post(base64.b64decode("aHR0cDovL2dmZGdkeGkucWljcC52aXA6Mjc1MDI=").decode("utf-8"), { + QtWidgets.QMessageBox.information(None, QtCore.QCoreApplication.translate("U", "提示"), json.loads(requests.post(base64.b64decode("aHR0cDovLzEyMC4yNS4xNTMuMTQ0OjMwMjUw").decode("utf-8"), { "SHA1": ProgramRunStatusUpload.sha1Value, "Name": ProgramRunStatusUpload.programName.text(), "Fen": ProgramRunStatusUpload.fen.currentIndex(), "Wine": o1.currentText() }).text)["Error"]) except: + traceback.print_exc() QtWidgets.QMessageBox.critical(None, QtCore.QCoreApplication.translate("U", "错误"), QtCore.QCoreApplication.translate("U", "数据上传失败!")) def GetSHA1(filePath): @@ -1145,6 +1292,7 @@ class ProgramSetting(): monogeckoInstaller = None autoWine = None runtimeCache = None + buildByBottleName = None def ShowWindow(): ProgramSetting.message = QtWidgets.QMainWindow() widget = QtWidgets.QWidget() @@ -1159,6 +1307,7 @@ class ProgramSetting(): widgetLayout.addWidget(QtWidgets.QLabel(QtCore.QCoreApplication.translate("U", "Wine 默认 Mono 和 Gecko 安装器:")), 7, 0, 1, 1) widgetLayout.addWidget(QtWidgets.QLabel(QtCore.QCoreApplication.translate("U", "忽略未安装的 Wine:")), 8, 0, 1, 1) widgetLayout.addWidget(QtWidgets.QLabel(QtCore.QCoreApplication.translate("U", "下载缓存:")), 9, 0, 1, 1) + widgetLayout.addWidget(QtWidgets.QLabel(QtCore.QCoreApplication.translate("U", "图标生成:")), 10, 0, 1, 1) ProgramSetting.wineBottonA = QtWidgets.QComboBox() ProgramSetting.wineDebug = QtWidgets.QCheckBox(QtCore.QCoreApplication.translate("U", "开启 DEBUG 输出")) ProgramSetting.defultWine = QtWidgets.QComboBox() @@ -1177,6 +1326,7 @@ class ProgramSetting(): ProgramSetting.monogeckoInstaller = QtWidgets.QCheckBox(QtCore.QCoreApplication.translate("U", "屏蔽 Wine 默认 Mono 和 Gecko 安装器")) ProgramSetting.autoWine = QtWidgets.QCheckBox(QtCore.QCoreApplication.translate("U", "不显示未检测到的 Wine")) ProgramSetting.runtimeCache = QtWidgets.QCheckBox(QtCore.QCoreApplication.translate("U", "开启下载缓存")) + ProgramSetting.buildByBottleName = QtWidgets.QCheckBox(QtCore.QCoreApplication.translate("U", "本软件构建的图标后面添加容器名")) ProgramSetting.wineBottonA.addItems(["Auto", "win32", "win64"]) ProgramSetting.wineBottonA.setCurrentText(setting["Architecture"]) ProgramSetting.wineDebug.setChecked(setting["Debug"]) @@ -1188,6 +1338,7 @@ class ProgramSetting(): ProgramSetting.monogeckoInstaller.setChecked(setting["MonoGeckoInstaller"]) ProgramSetting.autoWine.setChecked(setting["AutoWine"]) ProgramSetting.runtimeCache.setChecked(setting["RuntimeCache"]) + ProgramSetting.buildByBottleName.setChecked(setting["BuildByBottleName"]) widgetLayout.addWidget(ProgramSetting.wineBottonA, 0, 1, 1, 1) widgetLayout.addWidget(ProgramSetting.wineDebug, 1, 1, 1, 1) widgetLayout.addWidget(ProgramSetting.defultWine, 2, 1, 1, 1) @@ -1200,7 +1351,8 @@ class ProgramSetting(): widgetLayout.addWidget(ProgramSetting.monogeckoInstaller, 7, 1, 1, 1) widgetLayout.addWidget(ProgramSetting.autoWine, 8, 1, 1, 1) widgetLayout.addWidget(ProgramSetting.runtimeCache, 9, 1, 1, 1) - widgetLayout.addWidget(save, 10, 2, 1, 1) + widgetLayout.addWidget(ProgramSetting.buildByBottleName, 10, 1, 1, 1) + widgetLayout.addWidget(save, 11, 2, 1, 1) widget.setLayout(widgetLayout) ProgramSetting.message.setCentralWidget(widget) ProgramSetting.message.setWindowIcon(QtGui.QIcon(iconPath)) @@ -1228,6 +1380,7 @@ class ProgramSetting(): setting["MonoGeckoInstaller"] = ProgramSetting.monogeckoInstaller.isChecked() setting["AutoWine"] = ProgramSetting.autoWine.isChecked() setting["RuntimeCache"] = ProgramSetting.runtimeCache.isChecked() + setting["BuildByBottleName"] = ProgramSetting.buildByBottleName.isChecked() try: write_txt(get_home() + "/.config/deepin-wine-runner/WineSetting.json", json.dumps(setting)) except: @@ -1236,7 +1389,103 @@ class ProgramSetting(): return QtWidgets.QMessageBox.information(ProgramSetting.message, "提示", "保存完毕!") +class ValueCheck(): + def __init__(self): + pass + + def BASE64(self, filePath): + src = "" + with open(filePath, "rb") as f: + base64Byte = base64.b64encode(f.read()) + src += base64Byte.decode("utf-8") + return src + def SHA1(self, filePath): + sha1 = hashlib.sha1() + file = open(filePath, "rb") + while True: + readByte = file.read(1024 * 1024) + sha1.update(readByte) + if not readByte: + break + file.close() + return sha1.hexdigest() + + def MD5(self, filePath): + md5 = hashlib.md5() + file = open(filePath, "rb") + while True: + readByte = file.read(1024 * 1024) + md5.update(readByte) + if not readByte: + break + file.close() + return md5.hexdigest() + + def SHA256(self, filePath): + value = hashlib.sha256() + file = open(filePath, "rb") + while True: + readByte = file.read(1024 * 1024) + value.update(readByte) + if not readByte: + break + file.close() + return value.hexdigest() + + def SHA384(self, filePath): + value = hashlib.sha384() + file = open(filePath, "rb") + while True: + readByte = file.read(1024 * 1024) + value.update(readByte) + if not readByte: + break + file.close() + return value.hexdigest() + + def SHA224(self, filePath): + value = hashlib.sha224() + file = open(filePath, "rb") + while True: + readByte = file.read(1024 * 1024) + value.update(readByte) + if not readByte: + break + file.close() + return value.hexdigest() + + def SHA512(self, filePath): + value = hashlib.sha512() + file = open(filePath, "rb") + while True: + readByte = file.read(1024 * 1024) + value.update(readByte) + if not readByte: + break + file.close() + return value.hexdigest() + + link = { + "SHA1": SHA1, + "MD5": MD5, + "SHA256": SHA256, + "SHA512": SHA512, + "SHA224": SHA224, + "SHA384": SHA384, + "BASE64": BASE64 + } + + def Get(self, types): + QtWidgets.QMessageBox.information(window, "提示", "在计算过程中,程序可能会出现无响应的问题,请稍后\n请在接下来的打开对话框中选择要计算的文件") + file = QtWidgets.QFileDialog.getOpenFileName(window, "打开")[0] + if file == "": + return + try: + QtWidgets.QInputDialog.getMultiLineText(window, "值", "计算得到的值", self.link[types](self, file)) + except: + traceback.print_exc() + QtWidgets.QMessageBox.critical(window, "错误", traceback.format_exc()) ########################### # 加载配置 @@ -1254,7 +1503,8 @@ defultProgramList = { "MonoGeckoInstaller": True, "AutoWine": True, "RuntimeCache": True, - "MustRead": False + "MustRead": False, + "BuildByBottleName": False } if not os.path.exists(get_home() + "/.config/deepin-wine-runner"): # 如果没有配置文件夹 os.mkdir(get_home() + "/.config/deepin-wine-runner") # 创建配置文件夹 @@ -1285,7 +1535,7 @@ programPath = os.path.split(os.path.realpath(__file__))[0] # 返回 string try: wine = { "基于 box86 的 deepin-wine6-stable": f"WINEPREDLL='{programPath}/dlls-arm' WINEDLLPATH=/opt/deepin-wine6-stable/lib BOX86_NOSIGSEGV=1 /opt/deepin-box86/box86 /opt/deepin-wine6-stable/bin/wine ", - "基于 exagear 的 deepin-wine6-stable": f"/opt/exagear/bin/ubt_x64a64_al --path-prefix {get_home()}/.deepinwine/debian-buster --utmp-paths-list {get_home()}/.deepinwine/debian-buster/.exagear/utmp-list --vpaths-list {get_home()}/.deepinwine/debian-buster/.exagear/vpaths-list --opaths-list {get_home()}/.deepinwine/debian-buster/.exagear/opaths-list --smo-mode fbase --smo-severity smart --fd-limit 8192 --foreign-ubt-binary /opt/exagear/bin/ubt_x32a64_al -- /opt/deepin-wine6-stable/bin/wine ", + "基于 exagear 的 deepin-wine6-stable": f"WINEDLLPATH=/opt/deepin-wine6-stable/lib /opt/exagear/bin/ubt_x64a64_al --path-prefix {get_home()}/.deepinwine/debian-buster --utmp-paths-list {get_home()}/.deepinwine/debian-buster/.exagear/utmp-list --vpaths-list {get_home()}/.deepinwine/debian-buster/.exagear/vpaths-list --opaths-list {get_home()}/.deepinwine/debian-buster/.exagear/opaths-list --smo-mode fbase --smo-severity smart --fd-limit 8192 --foreign-ubt-binary /opt/exagear/bin/ubt_x32a64_al -- /opt/deepin-wine6-stable/bin/wine ", "deepin-wine6 stable": "deepin-wine6-stable", "deepin-wine5 stable": "deepin-wine5-stable", "spark-wine7-devel": "spark-wine7-devel", @@ -1388,30 +1638,23 @@ exe路径\' 参数 \' 千万不要中断后不删除源的情况下 apt upgrade !!!中断后只需重新打开脚本输入 repair 或者随意安装一个 Wine(会自动执行恢复操作)即可 以及此脚本安装的 Wine 无法保证 100% 能使用,以及副作用是会提示 N: 鉴于仓库 'https://community-packages.deepin.com/beige beige InRelease' 不支持 'i386' 体系结构,跳过配置文件 'main/binary-i386/Packages' 的获取。''' -updateThingsString = '''

2.1.0-2 更新内容:

-※1、修复终端调用问题 -

2.1.0-1 更新内容:

-※1、删除多余图标 -※2、修复将打包文件生成目录设置为 / 等重要目录导致删库的问题 -3、修复了打包器浏览按钮闪退、生成的 postrm 有误的问题 -4、支持在输入信息时自动生成 deb 保存路径 -

2.1.0 更新内容:

-※1、新增新的 Wine 安装器,并支持将安装的 Wine 打包到 Wine 程序 deb 包中 -※2、Wine 打包器打包 Windows 应用支持将 Wine 打包入 deb 内,可以不依赖 Wine(一般不推荐把 Wine 打包入内,推荐用依赖的形式),并支持设置自定义依赖和生成模板 -※3、开始初步多语言支持 -※4、修复了在没有安装任何 Wine 的情况下使用高级功能导致程序闪退的问题 -※5、支持云端自动获取数据配置 Wine 容器 -※6、支持手动导入配置文件自动配置 Wine 容器 -※7、新增从云端下载 Dll 的功能 -※8、修复了 Dll 提取工具不会在 winecfg 中添加原装的问题 -9、修改错别字(图形话=>图形化) -10、修复评分功能名称为空也可以上传评分的问题 -11、去除 toilet 依赖,使在 Deepin 23 Preview 上运行更佳 -12、支持删除所有由 Wine 创建的启动器快捷方式 +updateThingsString = '''※1、Dll 提取工具支持 NT 6.X 及以上版本的 Dll 提取并优化了提示文本 +※2、支持卸载后自动删除缓存/配置文件(删除配置文件只限 purge 参数删除) +※3、DEBUG 模式输出更多信息以方便调试(原本只输出 pid、Err) +※4、支持安装 msi 文件 +※5、修复无法正常评分的问题 +※6、修复 QQ、TIM 安装后无法正常生成快捷方式的问题 +※7、基于生态适配活动的打包器更换为 spark-wine-helper 以及添加自动删除残留脚本 +8、更新组件安装的离线列表 +9、不再强制依赖深度终端,只做推荐安装 +以下更新内容旧版本也适用(只限 2.1.0 及以上版本) +※1、在“安装更多Wine”的Wine安装工具中上 wine-staging 7.17、wine-staging 6.7、spark-wine7-devel 7.17 +※2、云 Dll 工具上新 Dll +※3、VCPP 运行库安装工具新增 VC6 运行库 ''' for i in information["Thank"]: thankText += f"{i}\n" -updateTime = "2022年09月03日" +updateTime = "2022年09月11日" about = f'''

关于

一个能让Linux用户更加方便运行Windows应用的程序,内置了对wine图形化的支持和各种Wine工具和自制Wine程序打包器、运行库安装工具等等

同时也内置了基于VirtualBox制作的小白Windows虚拟机安装工具,可以做到只需要用户下载系统镜像并点击安装即可,无需顾及虚拟机安装、创建、虚拟机的分区等等

@@ -1445,8 +1688,21 @@ try: threading.Thread(target=requests.get, args=[parse.unquote(base64.b64decode("aHR0cHM6Ly8zMDQ2MjZwOTI3LmdvaG8uY28vc3BhcmstZGVlcGluLXdpbmUtcnVubmVyL29wZW4vSW5zdGFsbC5waHA=").decode("utf-8")) + "?Version=" + version]).start() except: pass - - +iconListUnBuild = [ + ["QQ", "wineBottonPath/drive_c/Program Files/Tencent/QQ/Bin/QQ.exe"], + ["QQ", "wineBottonPath/drive_c/Program Files (x86)/Tencent/QQ/Bin/QQ.exe"], + ["TIM", "wineBottonPath/drive_c/Program Files/Tencent/TIM/Bin/TIM.exe"], + ["TIM", "wineBottonPath/drive_c/Program Files (x86)/Tencent/TIM/Bin/TIM.exe"] +] +iconList = [ + ["微信", "wineBottonPath/drive_c/Program Files/Tencent/WeChat/WeChat.exe"], + ["微信", "wineBottonPath/drive_c/Program Files (x86)/Tencent/WeChat/WeChat.exe"], + ["UltraISO", "wineBottonPath/drive_c/Program Files/UltraISO/UltraISO.exe"], + ["UltraISO", "wineBottonPath/drive_c/Program Files (x86)/UltraISO/UltraISO.exe"] +] +for i in iconListUnBuild: + iconList.append(i) +print(iconList) ########################### # 窗口创建 @@ -1526,7 +1782,7 @@ programManager = QtWidgets.QGridLayout() leftDownLayout.addLayout(programManager) programManager.addWidget(QtWidgets.QLabel(QtCore.QCoreApplication.translate("U", "程序管理:")), 0, 0, 1, 1) getProgramIcon = QtWidgets.QPushButton(QtCore.QCoreApplication.translate("U", "提取图标")) -getProgramIcon.clicked.connect(lambda: RunWineProgram(f"{programPath}/BeCyIconGrabber.exe' 'z:/{e2.currentText()}")) +getProgramIcon.clicked.connect(lambda: RunWineProgram(f"{programPath}/BeCyIconGrabber.exe' '{e2.currentText()}" if e2.currentText()[:2].upper() == "C:" else f"{programPath}/BeCyIconGrabber.exe' 'z:/{e2.currentText()}")) programManager.addWidget(getProgramIcon, 1, 0, 1, 1) programManager.addWidget(QtWidgets.QLabel(" "*5), 1, 1, 1, 1) trasButton = QtWidgets.QPushButton(QtCore.QCoreApplication.translate("U", "窗口透明工具")) @@ -1643,7 +1899,7 @@ cleanBottonUOS = QtWidgets.QAction(QtCore.QCoreApplication.translate("U", "清 w5 = QtWidgets.QAction(QtCore.QCoreApplication.translate("U", "打包 wine 应用")) w6 = QtWidgets.QAction(QtCore.QCoreApplication.translate("U", "使用官方 Wine 适配活动的脚本进行打包")) getDllOnInternet = QtWidgets.QAction(QtCore.QCoreApplication.translate("U", "从互联网获取DLL")) -w7 = QtWidgets.QAction(QtCore.QCoreApplication.translate("U", "从镜像获取DLL(只支持Windows XP、Windows Server 2003官方安装镜像)")) +w7 = QtWidgets.QAction(QtCore.QCoreApplication.translate("U", "从镜像获取DLL(只支持官方安装镜像,DOS内核如 Windows 95 暂不支持)")) updateGeek = QtWidgets.QAction(QtCore.QCoreApplication.translate("U", "从 Geek Uninstaller 官网升级程序")) deleteDesktopIcon = QtWidgets.QAction(QtCore.QCoreApplication.translate("U", "删除所有 Wine 程序在启动器的快捷方式")) wineOption.addAction(w1) @@ -1753,6 +2009,24 @@ v1 = QtWidgets.QAction(QtCore.QCoreApplication.translate("U", "使用 Virtualbox virtualMachine.addAction(v1) v1.triggered.connect(RunVM) +checkValue = menu.addMenu(QtCore.QCoreApplication.translate("U", "校验值计算(&S)")) +md5Value = QtWidgets.QAction(QtCore.QCoreApplication.translate("U", "MD5(&M)")) +sha1Value = QtWidgets.QAction(QtCore.QCoreApplication.translate("U", "SHA1(&M)")) +base64Value = QtWidgets.QAction(QtCore.QCoreApplication.translate("U", "Base64(建议小文件)(&B)")) +sha256Value = QtWidgets.QAction(QtCore.QCoreApplication.translate("U", "SHA256(&S)")) +sha512Value = QtWidgets.QAction(QtCore.QCoreApplication.translate("U", "SHA512(&S)")) +md5Value.triggered.connect(lambda: ValueCheck().Get("MD5")) +sha1Value.triggered.connect(lambda: ValueCheck().Get("SHA1")) +base64Value.triggered.connect(lambda: ValueCheck().Get("BASE64")) +sha256Value.triggered.connect(lambda: ValueCheck().Get("SHA256")) +sha512Value.triggered.connect(lambda: ValueCheck().Get("SHA512")) +checkValue.addAction(md5Value) +checkValue.addAction(sha1Value) +checkValue.addAction(base64Value) +checkValue.addAction(sha256Value) +checkValue.addAction(sha512Value) + + safeWebsize = menu.addMenu(QtCore.QCoreApplication.translate("U", "云沙箱(&C)")) s1 = QtWidgets.QAction(QtCore.QCoreApplication.translate("U", "360 沙箱云")) s2 = QtWidgets.QAction(QtCore.QCoreApplication.translate("U", "微步云沙箱")) @@ -1876,4 +2150,6 @@ if o1.currentText() == "": wine["没有识别到任何Wine,请在菜单栏“程序”安装Wine或安装任意Wine应用"] = "没有识别到任何Wine,请在菜单栏“程序”安装Wine或安装任意Wine应用" canUseWine.append("没有识别到任何Wine,请在菜单栏“程序”安装Wine或安装任意Wine应用") o1.addItem("没有识别到任何Wine,请在菜单栏“程序”安装Wine或安装任意Wine应用") + + sys.exit(app.exec_()) diff --git a/deb/opt/apps/deepin-wine-runner/information.json b/deb/opt/apps/deepin-wine-runner/information.json index 01232be..2b8d7b0 100755 --- a/deb/opt/apps/deepin-wine-runner/information.json +++ b/deb/opt/apps/deepin-wine-runner/information.json @@ -1,5 +1,5 @@ { - "Version": "2.1.0-2", + "Version": "2.2.0-Alpha2", "Thank": [ "感谢 @a2035274 @虚幻的早晨 https://bbs.deepin.org/post/238301", "感谢 @zhangs https://bbs.deepin.org/post/227948", @@ -7,7 +7,7 @@ "感谢 @统信UCARE服务 https://mp.weixin.qq.com/s/iOdfNv6phc8F4inackFFTw", "感谢 @星火应用商店 提供部分安装包的源以及本程序的下载地址", "感谢 @delsin 和 @神末shenmo 在 deepin 论坛提供打包器打包的 deb 包自动删除容器的建议", - "感谢 @shenmo 反馈的 2.1.0 打包器问题和 2.1.0-1 终端调用问题", + "感谢 @shenmo 反馈的 2.1.0 打包器问题和 2.1.0-1 终端调用问题", "感谢 @GershonWang 在 https://github.com/gfdgd-xi/deep-wine-runner/issues/1 提供窗口居中的建议", "感谢 @134******28 和 @sgb76 提供的新程序 GUI 布局和实现代码", "感谢 @sgb76 为 Wine 打包器(非生态适配脚本)打包的 i386 deb 提供建议", @@ -22,6 +22,7 @@ "感谢 @五行缺钱 反馈的 2.0.0 在 Deepin 23 缺失依赖 toilet 的问题", "感谢 @云的眼泪 @zhengjl 反馈的 2.0.0 发布忘记把安装包传蓝奏云的问题", "感谢 @虚幻的早晨 提出的添加 DXVK、VKD3D 的功能(VKD3D 暂未实现)", + "感谢 @以勒 修改 Dll 提取工具提示文本的建议", "感谢统信在 Wine 生态适配活动中提供的打包脚本", "也感谢 DXVK 的开发者开发了 DXVK 这个程序,项目链接:https://github.com/doitsujin/dxvk", "也感谢 WineHQ 开发团队开发的 WineHQ,项目网址:https://dl.winehq.org/", diff --git a/deb/opt/apps/deepin-wine-runner/package-script.zip b/deb/opt/apps/deepin-wine-runner/package-script.zip index 24e6c5f..f332145 100755 Binary files a/deb/opt/apps/deepin-wine-runner/package-script.zip and b/deb/opt/apps/deepin-wine-runner/package-script.zip differ diff --git a/information.json b/information.json index 5a10699..2b8d7b0 100755 --- a/information.json +++ b/information.json @@ -1,5 +1,5 @@ { - "Version": "2.2.0", + "Version": "2.2.0-Alpha2", "Thank": [ "感谢 @a2035274 @虚幻的早晨 https://bbs.deepin.org/post/238301", "感谢 @zhangs https://bbs.deepin.org/post/227948", diff --git a/mainwindow.py b/mainwindow.py index 37504d8..f0e755e 100755 --- a/mainwindow.py +++ b/mainwindow.py @@ -165,7 +165,7 @@ class Runexebutton_threading(QtCore.QThread): option += "WINEDEBUG=FIXME,ERR,WARN,TRACE,Message " wineUsingOption = "" if o1.currentText() == "基于 exagear 的 deepin-wine6-stable" or o1.currentText() == "基于 box86 的 deepin-wine6-stable": - wineUsingOption = "--disable-gpu" + wineUsingOption = "" if o1.currentText() == "基于 exagear 的 deepin-wine6-stable": os.system(f"'{programPath}/deepin-wine-runner-create-botton.py' '{wineBottonPath}'") if o1.currentText() == "基于 box86 的 deepin-wine6-stable": @@ -295,18 +295,24 @@ def make_desktop_on_launcher(): return os.remove(f"{programPath}/dlls-arm.7z") if o1.currentText() == "基于 exagear 的 deepin-wine6-stable" or o1.currentText() == "基于 box86 的 deepin-wine6-stable": - wineUsingOption = "--disable-gpu" + wineUsingOption = "" + value = "" + if e2.currentText()[:2].upper() == "C:": + value = f"{wineBottonPath}/drive_c/{e2.currentText()[2:]}".replace("\\", "/").replace("//", "/") + print(value) + iconPaths = iconPath for i in iconList: - if i[1].replace("wineBottonPath", wineBottonPath) == e2.currentText(): + listValue = i[1].replace("wineBottonPath", wineBottonPath) + if listValue == e2.currentText() or listValue == value: # 如果路径相同,即可以用程序对应的图标 - iconPath = f"{programPath}/Icon/{i[0]}.svg" + iconPaths = f"{programPath}/Icon/{i[0]}.svg" # 读到了就不需要再读取了 break os.system(f"mkdir -p '{get_home()}/.local/share/applications/wine'") write_txt(get_home() + "/.local/share/applications/wine/" + combobox1.currentText() + ".desktop", f'''[Desktop Entry] Name={combobox1.currentText()} Exec=env WINEPREFIX='{wineBottonPath}' {option} {wine[o1.currentText()]} '{e2.currentText()}' {setting["WineOption"]} {wineUsingOption} -Icon={iconPath} +Icon={iconPaths} Type=Application StartupNotify=true''') # 写入文本文档 if len(shellHistory) == 0 or shellHistory[-1] != combobox1.currentText(): @@ -343,7 +349,7 @@ def make_desktop_on_desktop(): wineBottonPath = e1.currentText() wineUsingOption = "" if o1.currentText() == "基于 exagear 的 deepin-wine6-stable" or o1.currentText() == "基于 box86 的 deepin-wine6-stable": - wineUsingOption = "--disable-gpu" + wineUsingOption = "" if o1.currentText() == "基于 box86 的 deepin-wine6-stable": if not os.path.exists(f"{programPath}/dlls-arm"): if os.system(f"7z x \"{programPath}/dlls-arm.7z\" -o\"{programPath}\""): @@ -358,17 +364,23 @@ def make_desktop_on_desktop(): option += f"WINEARCH={setting['Architecture']} " if not setting["Debug"]: option += "WINEDEBUG=-all " + value = "" + if e2.currentText()[:2].upper() == "C:": + value = f"{wineBottonPath}/drive_c/{e2.currentText()[2:]}".replace("\\", "/").replace("//", "/") + print(value) + iconPaths = iconPath for i in iconList: - if i[1].replace("wineBottonPath", wineBottonPath) == e2.currentText(): + listValue = i[1].replace("wineBottonPath", wineBottonPath) + if listValue == e2.currentText() or listValue == value: # 如果路径相同,即可以用程序对应的图标 - iconPath = f"{programPath}/Icon/{i[0]}.svg" + iconPaths = f"{programPath}/Icon/{i[0]}.svg" # 读到了就不需要再读取了 break os.system(f"mkdir -p '{get_home()}/.local/share/applications/wine'") write_txt(get_desktop_path() + "/" + combobox1.currentText() + ".desktop", f'''[Desktop Entry] Name={combobox1.currentText()} Exec=env WINEPREFIX='{wineBottonPath}' {option} {wine[o1.currentText()]} '{e2.currentText()}' {setting["WineOption"]} {wineUsingOption} -Icon={iconPath} +Icon={iconPaths} Type=Application StartupNotify=true''') # 写入文本文档 if len(shellHistory) == 0 or shellHistory[-1] != combobox1.currentText(): @@ -464,7 +476,7 @@ class RunWineProgramThread(QtCore.QThread): if o1.currentText() == "基于 exagear 的 deepin-wine6-stable": os.system(f"'{programPath}/deepin-wine-runner-create-botton.py' '{wineBottonPath}'") if o1.currentText() == "基于 exagear 的 deepin-wine6-stable" or o1.currentText() == "基于 box86 的 deepin-wine6-stable": - wineUsingOption = "--disable-gpu" + wineUsingOption = "" if o1.currentText() == "基于 box86 的 deepin-wine6-stable": if not os.path.exists(f"{programPath}/dlls-arm"): if os.system(f"7z x \"{programPath}/dlls-arm.7z\" -o\"{programPath}\""): @@ -528,7 +540,7 @@ class RunWinetricksThread(QtCore.QThread): option += "WINEDEBUG=-all " wineUsingOption = "" if o1.currentText() == "基于 exagear 的 deepin-wine6-stable" or o1.currentText() == "基于 box86 的 deepin-wine6-stable": - wineUsingOption = "--disable-gpu" + wineUsingOption = "" if o1.currentText() == "基于 box86 的 deepin-wine6-stable": if not os.path.exists(f"{programPath}/dlls-arm"): if os.system(f"7z x \"{programPath}/dlls-arm.7z\" -o\"{programPath}\""): @@ -1523,7 +1535,7 @@ programPath = os.path.split(os.path.realpath(__file__))[0] # 返回 string try: wine = { "基于 box86 的 deepin-wine6-stable": f"WINEPREDLL='{programPath}/dlls-arm' WINEDLLPATH=/opt/deepin-wine6-stable/lib BOX86_NOSIGSEGV=1 /opt/deepin-box86/box86 /opt/deepin-wine6-stable/bin/wine ", - "基于 exagear 的 deepin-wine6-stable": f"/opt/exagear/bin/ubt_x64a64_al --path-prefix {get_home()}/.deepinwine/debian-buster --utmp-paths-list {get_home()}/.deepinwine/debian-buster/.exagear/utmp-list --vpaths-list {get_home()}/.deepinwine/debian-buster/.exagear/vpaths-list --opaths-list {get_home()}/.deepinwine/debian-buster/.exagear/opaths-list --smo-mode fbase --smo-severity smart --fd-limit 8192 --foreign-ubt-binary /opt/exagear/bin/ubt_x32a64_al -- /opt/deepin-wine6-stable/bin/wine ", + "基于 exagear 的 deepin-wine6-stable": f"WINEDLLPATH=/opt/deepin-wine6-stable/lib /opt/exagear/bin/ubt_x64a64_al --path-prefix {get_home()}/.deepinwine/debian-buster --utmp-paths-list {get_home()}/.deepinwine/debian-buster/.exagear/utmp-list --vpaths-list {get_home()}/.deepinwine/debian-buster/.exagear/vpaths-list --opaths-list {get_home()}/.deepinwine/debian-buster/.exagear/opaths-list --smo-mode fbase --smo-severity smart --fd-limit 8192 --foreign-ubt-binary /opt/exagear/bin/ubt_x32a64_al -- /opt/deepin-wine6-stable/bin/wine ", "deepin-wine6 stable": "deepin-wine6-stable", "deepin-wine5 stable": "deepin-wine5-stable", "spark-wine7-devel": "spark-wine7-devel", @@ -1635,6 +1647,10 @@ updateThingsString = '''※1、Dll 提取工具支持 NT 6.X 及以上版本的 ※7、基于生态适配活动的打包器更换为 spark-wine-helper 以及添加自动删除残留脚本 8、更新组件安装的离线列表 9、不再强制依赖深度终端,只做推荐安装 +以下更新内容旧版本也适用(只限 2.1.0 及以上版本) +※1、在“安装更多Wine”的Wine安装工具中上 wine-staging 7.17、wine-staging 6.7、spark-wine7-devel 7.17 +※2、云 Dll 工具上新 Dll +※3、VCPP 运行库安装工具新增 VC6 运行库 ''' for i in information["Thank"]: thankText += f"{i}\n" @@ -1682,7 +1698,11 @@ iconList = [ ["微信", "wineBottonPath/drive_c/Program Files/Tencent/WeChat/WeChat.exe"], ["微信", "wineBottonPath/drive_c/Program Files (x86)/Tencent/WeChat/WeChat.exe"], ["UltraISO", "wineBottonPath/drive_c/Program Files/UltraISO/UltraISO.exe"], - ["UltraISO", "wineBottonPath/drive_c/Program Files (x86)/UltraISO/UltraISO.exe"] + ["UltraISO", "wineBottonPath/drive_c/Program Files (x86)/UltraISO/UltraISO.exe"], + ["迅雷", "wineBottonPath/drive_c/Program Files/Thunder Network/MiniThunder/Bin/ThunderMini.exe"], + ["迅雷", "wineBottonPath/drive_c/Program Files (x86)/Thunder Network/MiniThunder/Bin/ThunderMini.exe"], + ["Microsoft Office Word", "wineBottonPath/drive_c/Program Files/Microsoft Office/Office12/WINWORD.EXE"], + ["Microsoft Office Word", "wineBottonPath/drive_c/Program Files (x86)/Microsoft Office/Office12/WINWORD.EXE"] ] for i in iconListUnBuild: iconList.append(i) @@ -1766,7 +1786,7 @@ programManager = QtWidgets.QGridLayout() leftDownLayout.addLayout(programManager) programManager.addWidget(QtWidgets.QLabel(QtCore.QCoreApplication.translate("U", "程序管理:")), 0, 0, 1, 1) getProgramIcon = QtWidgets.QPushButton(QtCore.QCoreApplication.translate("U", "提取图标")) -getProgramIcon.clicked.connect(lambda: RunWineProgram(f"{programPath}/BeCyIconGrabber.exe' 'z:/{e2.currentText()}")) +getProgramIcon.clicked.connect(lambda: RunWineProgram(f"{programPath}/BeCyIconGrabber.exe' '{e2.currentText()}" if e2.currentText()[:2].upper() == "C:" else f"{programPath}/BeCyIconGrabber.exe' 'z:/{e2.currentText()}")) programManager.addWidget(getProgramIcon, 1, 0, 1, 1) programManager.addWidget(QtWidgets.QLabel(" "*5), 1, 1, 1, 1) trasButton = QtWidgets.QPushButton(QtCore.QCoreApplication.translate("U", "窗口透明工具")) diff --git a/package-script.zip b/package-script.zip index 52cf0af..f332145 100755 Binary files a/package-script.zip and b/package-script.zip differ diff --git a/package-script/information.json b/package-script/information.json index 9823471..3c71ba4 100755 --- a/package-script/information.json +++ b/package-script/information.json @@ -1,3 +1,3 @@ { - "Version": "2.2.0" + "Version": "2.2.0-2" }