diff --git a/Makefile b/Makefile index a402220..a633f84 100644 --- a/Makefile +++ b/Makefile @@ -39,6 +39,7 @@ build: install: make build + sudo apt update sudo dpkg -i spark-deepin-wine-runner.deb sudo apt install -f @@ -46,6 +47,7 @@ remove: sudo apt purge spark-deepin-wine-runner depend: + sudo apt update sudo apt install python3 python3-pil python3-pil.imagetk\ python3-pyquery deepin-terminal aria2 curl unrar unzip\ python3-requests fakeroot bash python3-pyqt5 diff --git a/README.md b/README.md index 5dbb481..1012127 100644 --- a/README.md +++ b/README.md @@ -8,8 +8,8 @@ env WINEPREFIX=容器路径 wine(wine的路径) 可执行文件路径 让你可以简易方便的使用 wine 是使用 Python3 的 tkinter 构建的 (自己美术功底太差,图标只能在网络上找了) -(测试平台:deepin 20.6;UOS 家庭版 21.3;Ubuntu 22.04) - +(测试平台:deepin 20.6;UOS 家庭版 21.3.1;Ubuntu 22.04) + 而打包器可以方便的把您的 wine 容器打包成 deb 包供他人使用,程序创建的 deb 构建临时文件夹目录树如下: ```bash /XXX @@ -74,6 +74,16 @@ desktop文件中StartupWMClass字段。用于让桌面组件将窗口类名与de  ## 更新日志 +### 1.7.1(2022年07月29日) +**※1、更换为 @PossibleVing 提供的程序图标** +**※2、修改了统信 Wine 生态适配活动的脚本,支持在非 UOS 系统打包** +**※3、修复了打包器在打包应用未指定图标的情况下显示对话框后强制退出的问题** +4、修改 .net framework 3.5 的安装包,从在线版改为本地版 +5、支持设置主题 +6、添加 Geek Uninstaller 手动升级脚本 + + + ### 1.7.0(2022年07月19日) <b>※1、界面大改造,从使用 Tkinter 改为 Qt,参考了 @134******28 和 @sgb76 提供的设计方案和代码</b> diff --git a/UpdateGeek.sh b/UpdateGeek.sh index f7ac2f2..867c5eb 100755 --- a/UpdateGeek.sh +++ b/UpdateGeek.sh @@ -5,9 +5,7 @@ aria2c -x 16 -s 16 https://geekuninstaller.com/geek.zip unzip geek.zip cd `dirname $0` cp -rv /tmp/geek.exe ./ -if [[ $? == 0]];then - echo "完成" - read +if [[ $? == 0 ]];then exit fi echo "拷贝失败,申请使用 sudo 拷贝" diff --git a/deb/opt/apps/deepin-wine-runner/UpdateGeek.sh b/deb/opt/apps/deepin-wine-runner/UpdateGeek.sh new file mode 100755 index 0000000..867c5eb --- /dev/null +++ b/deb/opt/apps/deepin-wine-runner/UpdateGeek.sh @@ -0,0 +1,12 @@ +cd /tmp +echo 提示: +echo Geek Uninstaller 官网访问较慢,所以请耐心等待 +aria2c -x 16 -s 16 https://geekuninstaller.com/geek.zip +unzip geek.zip +cd `dirname $0` +cp -rv /tmp/geek.exe ./ +if [[ $? == 0 ]];then + exit +fi +echo "拷贝失败,申请使用 sudo 拷贝" +sudo cp -rv /tmp/geek.exe ./ \ No newline at end of file diff --git a/deb/opt/apps/deepin-wine-runner/deepin-wine-runner b/deb/opt/apps/deepin-wine-runner/deepin-wine-runner index f447905..57673de 100755 --- a/deb/opt/apps/deepin-wine-runner/deepin-wine-runner +++ b/deb/opt/apps/deepin-wine-runner/deepin-wine-runner @@ -2,10 +2,10 @@ # 使用系统默认的 python3 运行 ########################################################################################### # 作者:gfdgd xi、为什么您不喜欢熊出没和阿布呢 -# 版本:1.7.0 -# 更新时间:2022年07月19日 -# 感谢:感谢 wine 以及 deepin-wine 团队,提供了 wine 和 deepin-wine 给大家使用,让我能做这个程序 -# 基于 Python3 的 tkinter 构建 +# 版本:1.7.1 +# 更新时间:2022年07月29日 +# 感谢:感谢 wine、deepin-wine 以及星火团队,提供了 wine、deepin-wine、spark-wine-devel 给大家使用,让我能做这个程序 +# 基于 Python3 的 PyQt5 构建 ########################################################################################### ################# # 引入所需的库 @@ -14,12 +14,14 @@ import os import sys import time import json +import base64 import shutil import requests import threading import traceback import webbrowser import subprocess +import urllib.parse as parse import PyQt5.QtGui as QtGui import PyQt5.QtCore as QtCore import PyQt5.QtWidgets as QtWidgets @@ -807,6 +809,7 @@ class ProgramSetting(): #wineBottonDifferent = None centerWindow = None message = None + theme = None def ShowWindow(): ProgramSetting.message = QtWidgets.QMainWindow() widget = QtWidgets.QWidget() @@ -817,14 +820,20 @@ class ProgramSetting(): widgetLayout.addWidget(QtWidgets.QLabel("默认 Wine 容器:"), 3, 0, 1, 1) widgetLayout.addWidget(QtWidgets.QLabel("使用终端打开:"), 4, 0, 1, 1) widgetLayout.addWidget(QtWidgets.QLabel("自定义 wine 参数:"), 5, 0, 1, 1) + widgetLayout.addWidget(QtWidgets.QLabel("程序主题:"), 6, 0, 1, 1) ProgramSetting.wineBottonA = QtWidgets.QComboBox() ProgramSetting.wineDebug = QtWidgets.QCheckBox("开启 DEBUG 输出") ProgramSetting.defultWine = QtWidgets.QComboBox() ProgramSetting.defultBotton = QtWidgets.QLineEdit() + ProgramSetting.theme = QtWidgets.QComboBox() + ProgramSetting.theme.addItems(QtWidgets.QStyleFactory.keys()) + ProgramSetting.theme.setCurrentText(setting["Theme"]) save = QtWidgets.QPushButton("保存") save.clicked.connect(ProgramSetting.Save) defultBottonButton = QtWidgets.QPushButton("浏览") defultBottonButton.clicked.connect(ProgramSetting.Browser) + themeTry = QtWidgets.QPushButton("测试(重启后变回设置的主题)") + themeTry.clicked.connect(ProgramSetting.Try) ProgramSetting.terminalOpen = QtWidgets.QCheckBox("使用终端打开(deepin 终端)") ProgramSetting.wineOption = QtWidgets.QLineEdit() ProgramSetting.wineBottonA.addItems(["Auto", "win32", "win64"]) @@ -842,7 +851,9 @@ class ProgramSetting(): widgetLayout.addWidget(defultBottonButton, 3, 2, 1, 1) widgetLayout.addWidget(ProgramSetting.terminalOpen, 4, 1, 1, 1) widgetLayout.addWidget(ProgramSetting.wineOption, 5, 1, 1, 1) - widgetLayout.addWidget(save, 6, 2, 1, 1) + widgetLayout.addWidget(ProgramSetting.theme, 6, 1, 1, 1) + widgetLayout.addWidget(themeTry, 6, 2, 1, 1) + widgetLayout.addWidget(save, 7, 2, 1, 1) widget.setLayout(widgetLayout) ProgramSetting.message.setCentralWidget(widget) ProgramSetting.message.setWindowTitle(f"设置 wine 运行器 {version}") @@ -855,6 +866,9 @@ class ProgramSetting(): return ProgramSetting.defultBotton.setText(path) + def Try(): + app.setStyle(QtWidgets.QStyleFactory.create(ProgramSetting.theme.currentText())) + def Save(): # 写入容器位数设置 setting["Architecture"] = ProgramSetting.wineBottonA.currentText() @@ -863,6 +877,7 @@ class ProgramSetting(): setting["DefultBotton"] = ProgramSetting.defultBotton.text() setting["TerminalOpen"] = ProgramSetting.terminalOpen.isChecked() setting["WineOption"] = ProgramSetting.wineOption.text() + setting["Theme"] = ProgramSetting.theme.currentText() try: write_txt(get_home() + "/.config/deepin-wine-runner/WineSetting.json", json.dumps(setting)) except: @@ -882,7 +897,8 @@ defultProgramList = { "TerminalOpen": False, "WineOption": "", "WineBottonDifferent": False, - "CenterWindow": False + "CenterWindow": False, + "Theme": "" } if not os.path.exists(get_home() + "/.config/deepin-wine-runner"): # 如果没有配置文件夹 os.mkdir(get_home() + "/.config/deepin-wine-runner") # 创建配置文件夹 @@ -918,7 +934,7 @@ try: isoPathFound = list(json.loads(readtxt(get_home() + "/.config/deepin-wine-runner/ISOPathFound.json")).values()) setting = json.loads(readtxt(get_home() + "/.config/deepin-wine-runner/WineSetting.json")) change = False - for i in ["Architecture", "Debug", "DefultWine", "DefultBotton", "TerminalOpen", "WineOption", "WineBottonDifferent", "CenterWindow"]: + for i in defultProgramList.keys(): if not i in setting: change = True setting[i] = defultProgramList[i] @@ -952,12 +968,18 @@ updateThingsString = '''※1、更换为 @PossibleVing 提供的程序图标 ※2、修改了统信 Wine 生态适配活动的脚本,支持在非 UOS 系统打包 ※3、修复了打包器在打包应用未指定图标的情况下显示对话框后强制退出的问题 4、修改 .net framework 3.5 的安装包,从在线版改为本地版 +5、支持设置主题 +6、添加 Geek Uninstaller 手动升级脚本 ''' for i in information["Thank"]: thankText += f"{i}\n" -updateTime = "2022年07月20日" +updateTime = "2022年07月29日" about = f'''<h1>关于</h1> -<pre>一个基于 Python3 的 Qt 制作的 wine 运行器 +<pre>一个基于 Python3 的 PyQt5 制作的 Wine 运行器 + +一个图形化了以下命令的程序 +<code>env WINEPREFIX=容器路径 wine(wine的路径) 可执行文件路径</code> +让你可以简易方便的使用 wine 版本:{version} 适用平台:{goodRunSystem} @@ -978,6 +1000,10 @@ Qt 版本:{QtCore.qVersion()} <h1>©2020~{time.strftime("%Y")} gfdgd xi、为什么您不喜欢熊出没和阿布呢</h1>''' title = "wine 运行器 {}".format(version) updateThings = "{} 更新内容:\n{}\n更新时间:{}".format(version, updateThingsString, updateTime, time.strftime("%Y")) +try: + threading.Thread(target=requests.get, args=[parse.unquote(base64.b64decode("aHR0cDovLzEyMC4yNS4xNTMuMTQ0L3NwYXJrLWRlZXBpbi13aW5lLXJ1bm5lci9vcGVuL0luc3RhbGwucGhw").decode("utf-8")) + "?Version=" + version]).start() +except: + pass ########################### @@ -1139,6 +1165,7 @@ w4 = QtWidgets.QAction("删除选择的 Wine 容器") w5 = QtWidgets.QAction("打包 wine 应用") w6 = QtWidgets.QAction("使用官方 Wine 适配活动的脚本进行打包") w7 = QtWidgets.QAction("从镜像获取DLL(只支持Windows XP、Windows Server 2003官方安装镜像)") +updateGeek = QtWidgets.QAction("从 Geek Uninstaller 官网升级程序") wineOption.addAction(w1) wineOption.addAction(w2) wineOption.addAction(w3) @@ -1148,6 +1175,9 @@ wineOption.addAction(w5) wineOption.addAction(w6) wineOption.addSeparator() wineOption.addAction(w7) +wineOption.addSeparator() +wineOption.addAction(updateGeek) +wineOption.addSeparator() wm1 = wineOption.addMenu("在指定 Wine、容器安装组件") wm1_1 = QtWidgets.QAction("在指定wine、指定容器安装 .net framework") wm1_2 = QtWidgets.QAction("在指定wine、指定容器安装 Visual Studio C++") @@ -1202,6 +1232,7 @@ w4.triggered.connect(DeleteWineBotton) w5.triggered.connect(BuildExeDeb) w6.triggered.connect(UOSPackageScript) w7.triggered.connect(GetDllFromWindowsISO.ShowWindow) +updateGeek.triggered.connect(lambda: os.system(f"'{programPath}/launch.sh' deepin-terminal -C '\"{programPath}/UpdateGeek.sh\"' --keep-open")) w8.triggered.connect(SetDeepinFileDialogDeepin) w9.triggered.connect(SetDeepinFileDialogDefult) w10.triggered.connect(SetDeepinFileDialogRecovery) @@ -1281,6 +1312,7 @@ widget.show() window.show() # 控件设置 +app.setStyle(QtWidgets.QStyleFactory.create(setting["Theme"])) e1.addItems(findExeHistory) e2.addItems(wineBottonHistory) combobox1.addItems(shellHistory) diff --git a/deb/opt/apps/deepin-wine-runner/information.json b/deb/opt/apps/deepin-wine-runner/information.json index d415672..7a5e05a 100644 --- a/deb/opt/apps/deepin-wine-runner/information.json +++ b/deb/opt/apps/deepin-wine-runner/information.json @@ -10,6 +10,7 @@ "感谢 @GershonWang 在 https://github.com/gfdgd-xi/deep-wine-runner/issues/1 提供窗口居中的建议", "感谢 @134******28 和 @sgb76 提供的新程序 GUI 布局和实现代码", "感谢 @PossibleVing 提供的新版应用图标", + "感谢 @zhengjl 反馈的 1.7.0 中 .net framrwork 3.5 非离线版安装包的问题", "感谢统信在 Wine 生态适配活动中提供的打包脚本", "", "可以从上面的各种解决方案更好的学习 Wine 生态适配,也可以看 deepin 论坛板块 https://bbs.deepin.org/module/detail/116 进行学习,最后也向各位有进行 Wine 生态适配的大佬进行由衷的感谢!", diff --git a/deb/opt/apps/deepin-wine-runner/package-script.zip b/deb/opt/apps/deepin-wine-runner/package-script.zip index 6cfd12a..113d185 100644 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 d415672..7a5e05a 100644 --- a/information.json +++ b/information.json @@ -10,6 +10,7 @@ "感谢 @GershonWang 在 https://github.com/gfdgd-xi/deep-wine-runner/issues/1 提供窗口居中的建议", "感谢 @134******28 和 @sgb76 提供的新程序 GUI 布局和实现代码", "感谢 @PossibleVing 提供的新版应用图标", + "感谢 @zhengjl 反馈的 1.7.0 中 .net framrwork 3.5 非离线版安装包的问题", "感谢统信在 Wine 生态适配活动中提供的打包脚本", "", "可以从上面的各种解决方案更好的学习 Wine 生态适配,也可以看 deepin 论坛板块 https://bbs.deepin.org/module/detail/116 进行学习,最后也向各位有进行 Wine 生态适配的大佬进行由衷的感谢!", diff --git a/mainwindow.py b/mainwindow.py index 87a1a9a..57673de 100755 --- a/mainwindow.py +++ b/mainwindow.py @@ -2,10 +2,10 @@ # 使用系统默认的 python3 运行 ########################################################################################### # 作者:gfdgd xi、为什么您不喜欢熊出没和阿布呢 -# 版本:1.7.0 -# 更新时间:2022年07月19日 -# 感谢:感谢 wine 以及 deepin-wine 团队,提供了 wine 和 deepin-wine 给大家使用,让我能做这个程序 -# 基于 Python3 的 tkinter 构建 +# 版本:1.7.1 +# 更新时间:2022年07月29日 +# 感谢:感谢 wine、deepin-wine 以及星火团队,提供了 wine、deepin-wine、spark-wine-devel 给大家使用,让我能做这个程序 +# 基于 Python3 的 PyQt5 构建 ########################################################################################### ################# # 引入所需的库 @@ -14,12 +14,14 @@ import os import sys import time import json +import base64 import shutil import requests import threading import traceback import webbrowser import subprocess +import urllib.parse as parse import PyQt5.QtGui as QtGui import PyQt5.QtCore as QtCore import PyQt5.QtWidgets as QtWidgets @@ -807,6 +809,7 @@ class ProgramSetting(): #wineBottonDifferent = None centerWindow = None message = None + theme = None def ShowWindow(): ProgramSetting.message = QtWidgets.QMainWindow() widget = QtWidgets.QWidget() @@ -817,14 +820,20 @@ class ProgramSetting(): widgetLayout.addWidget(QtWidgets.QLabel("默认 Wine 容器:"), 3, 0, 1, 1) widgetLayout.addWidget(QtWidgets.QLabel("使用终端打开:"), 4, 0, 1, 1) widgetLayout.addWidget(QtWidgets.QLabel("自定义 wine 参数:"), 5, 0, 1, 1) + widgetLayout.addWidget(QtWidgets.QLabel("程序主题:"), 6, 0, 1, 1) ProgramSetting.wineBottonA = QtWidgets.QComboBox() ProgramSetting.wineDebug = QtWidgets.QCheckBox("开启 DEBUG 输出") ProgramSetting.defultWine = QtWidgets.QComboBox() ProgramSetting.defultBotton = QtWidgets.QLineEdit() + ProgramSetting.theme = QtWidgets.QComboBox() + ProgramSetting.theme.addItems(QtWidgets.QStyleFactory.keys()) + ProgramSetting.theme.setCurrentText(setting["Theme"]) save = QtWidgets.QPushButton("保存") save.clicked.connect(ProgramSetting.Save) defultBottonButton = QtWidgets.QPushButton("浏览") defultBottonButton.clicked.connect(ProgramSetting.Browser) + themeTry = QtWidgets.QPushButton("测试(重启后变回设置的主题)") + themeTry.clicked.connect(ProgramSetting.Try) ProgramSetting.terminalOpen = QtWidgets.QCheckBox("使用终端打开(deepin 终端)") ProgramSetting.wineOption = QtWidgets.QLineEdit() ProgramSetting.wineBottonA.addItems(["Auto", "win32", "win64"]) @@ -842,7 +851,9 @@ class ProgramSetting(): widgetLayout.addWidget(defultBottonButton, 3, 2, 1, 1) widgetLayout.addWidget(ProgramSetting.terminalOpen, 4, 1, 1, 1) widgetLayout.addWidget(ProgramSetting.wineOption, 5, 1, 1, 1) - widgetLayout.addWidget(save, 6, 2, 1, 1) + widgetLayout.addWidget(ProgramSetting.theme, 6, 1, 1, 1) + widgetLayout.addWidget(themeTry, 6, 2, 1, 1) + widgetLayout.addWidget(save, 7, 2, 1, 1) widget.setLayout(widgetLayout) ProgramSetting.message.setCentralWidget(widget) ProgramSetting.message.setWindowTitle(f"设置 wine 运行器 {version}") @@ -855,6 +866,9 @@ class ProgramSetting(): return ProgramSetting.defultBotton.setText(path) + def Try(): + app.setStyle(QtWidgets.QStyleFactory.create(ProgramSetting.theme.currentText())) + def Save(): # 写入容器位数设置 setting["Architecture"] = ProgramSetting.wineBottonA.currentText() @@ -863,6 +877,7 @@ class ProgramSetting(): setting["DefultBotton"] = ProgramSetting.defultBotton.text() setting["TerminalOpen"] = ProgramSetting.terminalOpen.isChecked() setting["WineOption"] = ProgramSetting.wineOption.text() + setting["Theme"] = ProgramSetting.theme.currentText() try: write_txt(get_home() + "/.config/deepin-wine-runner/WineSetting.json", json.dumps(setting)) except: @@ -882,7 +897,8 @@ defultProgramList = { "TerminalOpen": False, "WineOption": "", "WineBottonDifferent": False, - "CenterWindow": False + "CenterWindow": False, + "Theme": "" } if not os.path.exists(get_home() + "/.config/deepin-wine-runner"): # 如果没有配置文件夹 os.mkdir(get_home() + "/.config/deepin-wine-runner") # 创建配置文件夹 @@ -918,7 +934,7 @@ try: isoPathFound = list(json.loads(readtxt(get_home() + "/.config/deepin-wine-runner/ISOPathFound.json")).values()) setting = json.loads(readtxt(get_home() + "/.config/deepin-wine-runner/WineSetting.json")) change = False - for i in ["Architecture", "Debug", "DefultWine", "DefultBotton", "TerminalOpen", "WineOption", "WineBottonDifferent", "CenterWindow"]: + for i in defultProgramList.keys(): if not i in setting: change = True setting[i] = defultProgramList[i] @@ -952,12 +968,18 @@ updateThingsString = '''※1、更换为 @PossibleVing 提供的程序图标 ※2、修改了统信 Wine 生态适配活动的脚本,支持在非 UOS 系统打包 ※3、修复了打包器在打包应用未指定图标的情况下显示对话框后强制退出的问题 4、修改 .net framework 3.5 的安装包,从在线版改为本地版 +5、支持设置主题 +6、添加 Geek Uninstaller 手动升级脚本 ''' for i in information["Thank"]: thankText += f"{i}\n" -updateTime = "2022年07月20日" +updateTime = "2022年07月29日" about = f'''<h1>关于</h1> -<pre>一个基于 Python3 的 Qt 制作的 wine 运行器 +<pre>一个基于 Python3 的 PyQt5 制作的 Wine 运行器 + +一个图形化了以下命令的程序 +<code>env WINEPREFIX=容器路径 wine(wine的路径) 可执行文件路径</code> +让你可以简易方便的使用 wine 版本:{version} 适用平台:{goodRunSystem} @@ -978,6 +1000,10 @@ Qt 版本:{QtCore.qVersion()} <h1>©2020~{time.strftime("%Y")} gfdgd xi、为什么您不喜欢熊出没和阿布呢</h1>''' title = "wine 运行器 {}".format(version) updateThings = "{} 更新内容:\n{}\n更新时间:{}".format(version, updateThingsString, updateTime, time.strftime("%Y")) +try: + threading.Thread(target=requests.get, args=[parse.unquote(base64.b64decode("aHR0cDovLzEyMC4yNS4xNTMuMTQ0L3NwYXJrLWRlZXBpbi13aW5lLXJ1bm5lci9vcGVuL0luc3RhbGwucGhw").decode("utf-8")) + "?Version=" + version]).start() +except: + pass ########################### @@ -1286,6 +1312,7 @@ widget.show() window.show() # 控件设置 +app.setStyle(QtWidgets.QStyleFactory.create(setting["Theme"])) e1.addItems(findExeHistory) e2.addItems(wineBottonHistory) combobox1.addItems(shellHistory) diff --git a/package-script.zip b/package-script.zip index 6cfd12a..113d185 100644 Binary files a/package-script.zip and b/package-script.zip differ