This commit is contained in:
gfdgd xi 2022-12-09 10:37:50 +08:00
parent efa2c65886
commit 38544a72f0
25 changed files with 484 additions and 389 deletions

159
Makefile
View File

@ -3,92 +3,93 @@ build:
#cd VM-source && make #cd VM-source && make
#cd wine && make #cd wine && make
cp -rv helperset deb/opt/apps/deepin-wine-runner/ cp -rv helperset deb/opt/apps/deepin-wine-runner/
cp -rv VM-source/VirtualMachine VM cp -rv VM-source/VirtualMachine VM
cp -rv VM-source/deepin-wine-runner.svg VM cp -rv VM-source/deepin-wine-runner.svg VM
cp -rv VM-source/api VM cp -rv VM-source/api VM
cp -rv VM-source/Windows7X64Auto.iso VM cp -rv VM-source/Windows7X64Auto.iso VM
cp -rv VM-source/Windows7X86Auto.iso VM cp -rv VM-source/Windows7X86Auto.iso VM
cp -rv VM-source/run.py VM cp -rv VM-source/run.py VM
cp -rv wine/ deb/opt/apps/deepin-wine-runner/ cp -rv wine/ deb/opt/apps/deepin-wine-runner/
cp -rv Test/ deb/opt/apps/deepin-wine-runner/ cp -rv Test/ deb/opt/apps/deepin-wine-runner/
zip -v -q -r package-script.zip package-script zip -v -q -r package-script.zip package-script
cp -rv VM deb/opt/apps/deepin-wine-runner cp -rv VM deb/opt/apps/deepin-wine-runner
cp -rv Download.py deb/opt/apps/deepin-wine-runner/ cp -rv Download.py deb/opt/apps/deepin-wine-runner/
cp -rv AllInstall.py deb/opt/apps/deepin-wine-runner cp -rv AllInstall.py deb/opt/apps/deepin-wine-runner
cp -rv ShellList deb/opt/apps/deepin-wine-runner cp -rv ShellList deb/opt/apps/deepin-wine-runner
cp -rv QemuDownload.py deb/opt/apps/deepin-wine-runner cp -rv QemuDownload.py deb/opt/apps/deepin-wine-runner
cp -rv QemuRun.py deb/opt/apps/deepin-wine-runner cp -rv QemuRun.py deb/opt/apps/deepin-wine-runner
cp -rv kill.sh deb/opt/apps/deepin-wine-runner cp -rv kill.sh deb/opt/apps/deepin-wine-runner
cp -rv InstallWineOnDeepin23Alpha.py deb/opt/apps/deepin-wine-runner cp -rv InstallWineOnDeepin23Alpha.py deb/opt/apps/deepin-wine-runner
cp -rv wrestool deb/opt/apps/deepin-wine-runner cp -rv wrestool deb/opt/apps/deepin-wine-runner
cp -rv Mount.sh deb/opt/apps/deepin-wine-runner cp -rv Mount.sh deb/opt/apps/deepin-wine-runner
cp -rv UnMount.sh deb/opt/apps/deepin-wine-runner cp -rv UnMount.sh deb/opt/apps/deepin-wine-runner
cp -rv vkd3d-proton.7z deb/opt/apps/deepin-wine-runner cp -rv vkd3d-proton.7z deb/opt/apps/deepin-wine-runner
cp -rv deepin-wine-easy-packager.py deb/opt/apps/deepin-wine-runner cp -rv deepin-wine-easy-packager.py deb/opt/apps/deepin-wine-runner
cp -rv IconList.json deb/opt/apps/deepin-wine-runner cp -rv IconList.json deb/opt/apps/deepin-wine-runner
cp -rv GetEXEVersion.exe deb/opt/apps/deepin-wine-runner cp -rv GetEXEVersion.exe deb/opt/apps/deepin-wine-runner
cp -rv MountWithoutHome.sh deb/opt/apps/deepin-wine-runner
echo "[]" > deb/opt/apps/deepin-wine-runner/wine/winelist.json echo "[]" > deb/opt/apps/deepin-wine-runner/wine/winelist.json
rm -rfv deb/opt/apps/deepin-wine-runner/wine/winelist.json rm -rfv deb/opt/apps/deepin-wine-runner/wine/winelist.json
cp -rv req deb/opt/apps/deepin-wine-runner cp -rv req deb/opt/apps/deepin-wine-runner
cp -rv BuildDesktop.py deb/opt/apps/deepin-wine-runner cp -rv BuildDesktop.py deb/opt/apps/deepin-wine-runner
cp -rv ChangePassword.sh deb/opt/apps/deepin-wine-runner cp -rv ChangePassword.sh deb/opt/apps/deepin-wine-runner
cp -rv trans deb/opt/apps/deepin-wine-runner cp -rv trans deb/opt/apps/deepin-wine-runner
cp -rv RegShot deb/opt/apps/deepin-wine-runner cp -rv RegShot deb/opt/apps/deepin-wine-runner
cp -rv BeCyIconGrabber.exe deb/opt/apps/deepin-wine-runner cp -rv BeCyIconGrabber.exe deb/opt/apps/deepin-wine-runner
cp -rv AutoShell deb/opt/apps/deepin-wine-runner cp -rv AutoShell deb/opt/apps/deepin-wine-runner
cp -rv deepin-wine-packager-with-script.py deb/opt/apps/deepin-wine-runner cp -rv deepin-wine-packager-with-script.py deb/opt/apps/deepin-wine-runner
cp -rv deepin-wine-packager.py deb/opt/apps/deepin-wine-runner cp -rv deepin-wine-packager.py deb/opt/apps/deepin-wine-runner
cp -rv deepin-wine-runner-update-bug deb/opt/apps/deepin-wine-runner cp -rv deepin-wine-runner-update-bug deb/opt/apps/deepin-wine-runner
cp -rv deepin-wine-runner.svg deb/opt/apps/deepin-wine-runner cp -rv deepin-wine-runner.svg deb/opt/apps/deepin-wine-runner
cp -rv deepin-wine-venturi-setter.py deb/opt/apps/deepin-wine-runner cp -rv deepin-wine-venturi-setter.py deb/opt/apps/deepin-wine-runner
cp -rv InstallVisualBasicRuntime.py deb/opt/apps/deepin-wine-runner cp -rv InstallVisualBasicRuntime.py deb/opt/apps/deepin-wine-runner
cp -rv DisabledOpengl.reg deb/opt/apps/deepin-wine-runner cp -rv DisabledOpengl.reg deb/opt/apps/deepin-wine-runner
cp -rv EnabledOpengl.reg deb/opt/apps/deepin-wine-runner cp -rv EnabledOpengl.reg deb/opt/apps/deepin-wine-runner
cp -rv geek.exe deb/opt/apps/deepin-wine-runner cp -rv geek.exe deb/opt/apps/deepin-wine-runner
cp -rv ProgramFen.py deb/opt/apps/deepin-wine-runner cp -rv ProgramFen.py deb/opt/apps/deepin-wine-runner
cp -rv information.json deb/opt/apps/deepin-wine-runner cp -rv information.json deb/opt/apps/deepin-wine-runner
cp -rv InstallMono.py deb/opt/apps/deepin-wine-runner cp -rv InstallMono.py deb/opt/apps/deepin-wine-runner
cp -rv InstallMsxml.py deb/opt/apps/deepin-wine-runner cp -rv InstallMsxml.py deb/opt/apps/deepin-wine-runner
cp -rv InstallNetFramework.py deb/opt/apps/deepin-wine-runner cp -rv InstallNetFramework.py deb/opt/apps/deepin-wine-runner
cp -rv InstallOther.py deb/opt/apps/deepin-wine-runner cp -rv InstallOther.py deb/opt/apps/deepin-wine-runner
cp -rv InstallVisualCPlusPlus.py deb/opt/apps/deepin-wine-runner cp -rv InstallVisualCPlusPlus.py deb/opt/apps/deepin-wine-runner
cp -rv launch.sh deb/opt/apps/deepin-wine-runner cp -rv launch.sh deb/opt/apps/deepin-wine-runner
cp -rv LICENSE deb/opt/apps/deepin-wine-runner cp -rv LICENSE deb/opt/apps/deepin-wine-runner
cp -rv mainwindow.py deb/opt/apps/deepin-wine-runner/deepin-wine-runner cp -rv mainwindow.py deb/opt/apps/deepin-wine-runner/deepin-wine-runner
cp -rv package-script.zip deb/opt/apps/deepin-wine-runner cp -rv package-script.zip deb/opt/apps/deepin-wine-runner
cp -rv Run.bat deb/opt/apps/deepin-wine-runner cp -rv Run.bat deb/opt/apps/deepin-wine-runner
cp -rv RunVM.sh deb/opt/apps/deepin-wine-runner cp -rv RunVM.sh deb/opt/apps/deepin-wine-runner
cp -rv "wine install" deb/opt/apps/deepin-wine-runner cp -rv "wine install" deb/opt/apps/deepin-wine-runner
cp -rv 窗体透明度设置工具.exe deb/opt/apps/deepin-wine-runner cp -rv 窗体透明度设置工具.exe deb/opt/apps/deepin-wine-runner
cp -rv UpdateGeek.sh deb/opt/apps/deepin-wine-runner cp -rv UpdateGeek.sh deb/opt/apps/deepin-wine-runner
cp -rv AppStore.py deb/opt/apps/deepin-wine-runner cp -rv AppStore.py deb/opt/apps/deepin-wine-runner
cp -rv InstallWineOnDeepin23.py deb/opt/apps/deepin-wine-runner cp -rv InstallWineOnDeepin23.py deb/opt/apps/deepin-wine-runner
cp -rv dxvk.7z deb/opt/apps/deepin-wine-runner cp -rv dxvk.7z deb/opt/apps/deepin-wine-runner
cp -rv InstallFont.py deb/opt/apps/deepin-wine-runner cp -rv InstallFont.py deb/opt/apps/deepin-wine-runner
cp -rv CheckDLL deb/opt/apps/deepin-wine-runner cp -rv CheckDLL deb/opt/apps/deepin-wine-runner
#cp -rv exagear.7z deb/opt/apps/deepin-wine-runner #cp -rv exagear.7z deb/opt/apps/deepin-wine-runner
cp -rv dlls-arm.7z deb/opt/apps/deepin-wine-runner cp -rv dlls-arm.7z deb/opt/apps/deepin-wine-runner
cp -rv deepin.list deb/opt/apps/deepin-wine-runner cp -rv deepin.list deb/opt/apps/deepin-wine-runner
cp -rv sparkstore.list deb/opt/apps/deepin-wine-runner cp -rv sparkstore.list deb/opt/apps/deepin-wine-runner
cp -rv arm-package.7z deb/opt/apps/deepin-wine-runner cp -rv arm-package.7z deb/opt/apps/deepin-wine-runner
#cp -rv exa.7z deb/opt/apps/deepin-wine-runner #cp -rv exa.7z deb/opt/apps/deepin-wine-runner
cp -rv clean-unuse-program.py deb/opt/apps/deepin-wine-runner cp -rv clean-unuse-program.py deb/opt/apps/deepin-wine-runner
cp -rv InstallNewWineHQ.sh deb/opt/apps/deepin-wine-runner cp -rv InstallNewWineHQ.sh deb/opt/apps/deepin-wine-runner
cp -rv cleanbottle.sh deb/opt/apps/deepin-wine-runner cp -rv cleanbottle.sh deb/opt/apps/deepin-wine-runner
cp -rv StartVM.sh deb/opt/apps/deepin-wine-runner cp -rv StartVM.sh deb/opt/apps/deepin-wine-runner
#cp -rv deepin-wine-runner-create-botton.py deb/opt/apps/deepin-wine-runner #cp -rv deepin-wine-runner-create-botton.py deb/opt/apps/deepin-wine-runner
cp -rv Icon deb/opt/apps/deepin-wine-runner cp -rv Icon deb/opt/apps/deepin-wine-runner
cp -rv ConfigLanguareRunner-help.json deb/opt/apps/deepin-wine-runner cp -rv ConfigLanguareRunner-help.json deb/opt/apps/deepin-wine-runner
cp -rv gtkGetFileNameDlg deb/opt/apps/deepin-wine-runner cp -rv gtkGetFileNameDlg deb/opt/apps/deepin-wine-runner
cp -rv LANG/*.qm deb/opt/apps/deepin-wine-runner/LANG cp -rv LANG/*.qm deb/opt/apps/deepin-wine-runner/LANG
cp -rv InstallDll.py deb/opt/apps/deepin-wine-runner/LANG cp -rv InstallDll.py deb/opt/apps/deepin-wine-runner/LANG
cp -rv ConfigLanguareRunner.py deb/opt/apps/deepin-wine-runner cp -rv ConfigLanguareRunner.py deb/opt/apps/deepin-wine-runner
cp -rv AutoConfig.py deb/opt/apps/deepin-wine-runner cp -rv AutoConfig.py deb/opt/apps/deepin-wine-runner
cp -rv UI deb/opt/apps/deepin-wine-runner/ cp -rv UI deb/opt/apps/deepin-wine-runner/
cp -rv InstallDll.py deb/opt/apps/deepin-wine-runner cp -rv InstallDll.py deb/opt/apps/deepin-wine-runner
cp -rv Model deb/opt/apps/deepin-wine-runner cp -rv Model deb/opt/apps/deepin-wine-runner
cp -rv API deb/opt/apps/deepin-wine-runner cp -rv API deb/opt/apps/deepin-wine-runner
cp -rv key deb/opt/apps/deepin-wine-runner cp -rv key deb/opt/apps/deepin-wine-runner
dpkg -b deb spark-deepin-wine-runner.deb dpkg -b deb spark-deepin-wine-runner.deb

View File

@ -1,5 +1,5 @@
Package: spark-deepin-wine-runner Package: spark-deepin-wine-runner
Version: 2.6.0 Version: 3.0.0
Maintainer: gfdgd xi <3025613752@qq.com>, 为什么您不喜欢熊出没和阿布呢 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 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 Architecture: all
@ -9,21 +9,27 @@ Recommends: winbind, wimtools, python3-pyqt5.qtwebengine
Section: utils Section: utils
Conflicts: spark.deepin-venturi-setter, spark-deepin-wine5-application-packer Conflicts: spark.deepin-venturi-setter, spark-deepin-wine5-application-packer
Replaces: spark.deepin-venturi-setter, spark-deepin-wine5-application-packer Replaces: spark.deepin-venturi-setter, spark-deepin-wine5-application-packer
Installed-Size: 23912 Installed-Size: 25836
Description: gfdgd xi、为什么您不喜欢熊出没和阿布呢 制作的 wine 运行器 Description: gfdgd xi、为什么您不喜欢熊出没和阿布呢 制作的 wine 运行器
2.5.0 更新内容: 3.0.0 更新内容:
※1、容器自动配置脚本 GUI 查看介绍使用 QWebEngineWidget支持图片非强制依赖只做推荐 ※1、支持使用 Qemu + Chroot 跨运行 Wine 以及指定程序的功能;
※2、不基于生态适配活动脚本打包器跟进 arm 架构 2022年11月11日的 Wine 微信打包方式; ※2、提供了简易打包器以用于打包简易 deb
※3、支持多图标的程序打包 ※3、支持下载配置过的 Qemu + Chroot 容器;
※4、修复了安装更多 Wine 换源换了个寂寞的问题; ※4、支持在隔离的 Chroot 容器内运行 Wine
※5、修复安装更多 Wine 重新安装后列表丢失的问题; ※5、支持解压指定 deb 的内打包好的容器;
※6、新增了对 Deepin 23 Alpha 优化的 Wine 安装器; ※6、优化 Wine 列表显示;
※7、新增 Dll 名称查询功能,可以查询对应 Dll 的作用; ※7、新增程序论坛和教程入口
※8、支持静态获取可执行文件可以调用的 Dll 并提供解决方案; ※8、程序公告功能
※9、支持移除指定的 .desktop 快捷方式; ※9、新增程序评分功能
※10、新增日志分析功能以及导出、上传日志功能 ※10、新增解包 deb 内 Wine 容器功能;
11、修复了不基于生态适配活动脚本打包器在选择 arm 打包架构下容器自动删除脚本取消勾选无用的问题; ※11、新增 Vkd3d Proton 安装功能,更新 dxvk 版本至 2.0.0
12、优化文案、新增友链 ※12、新增程序菜单栏部分栏目图标
13、提供了部分组件的测试功能。 13、优化非基于生态适配脚本的打包器内容自动填充功能
更新时间2022年11月25日 14、优化程序文案
15、新增日志翻译功能
16、程序进一步完善英语翻译机翻
17、优化程序更新策略
18、优化日志分析功能
19、优化程序 UI。
更新时间2022年12月09日
作者gfdgd xi、为什么您不喜欢熊出没和阿布呢 作者gfdgd xi、为什么您不喜欢熊出没和阿布呢

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 62 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 67 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 75 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 75 KiB

View File

@ -41,4 +41,4 @@ else
fi fi
# 如果参数 3 存在 # 如果参数 3 存在
chroot "--userspec=$2:$2" . env "HOME=/home/$2" "${@:3}" chroot "--userspec=$2:$2" . env "HOME=/home/$2" ${@:3}

View File

@ -0,0 +1,29 @@
#!/bin/bash
if [ ` whoami ` != "root" ]; then
echo "Only root can run me"
exit 1
fi
if [ ! -d "$1" ]; then
echo "路径不存在!"
exit 1
fi
echo $0
echo $1
echo $2
echo $3
# 挂载必备目录
cd "$1"
# 拷贝 Qemu Static
cp -r /usr/bin/qemu-*-static ./usr/bin
# 挂载目录
mount --bind /dev ./dev
#mount --bind /dev/pts ./dev/pts
mount -t proc /proc ./proc
mount --bind /etc/resolv.conf ./etc/resolv.conf
mount -t sysfs /sys ./sys
#mount --bind /dev/shm ./dev/shm
chmod 777 -R root
xhost +
# 如果参数 3 存在
chroot ${@:3}

View File

@ -17,7 +17,7 @@ if __name__ == "__main__":
exit() exit()
commandList = "" commandList = ""
userName = getpass.getuser() userName = getpass.getuser()
for i in sys.argv[2:]: for i in sys.argv[3:]:
commandList += f"'{i}' " commandList += f"'{i}' "
if commandList.replace(" ", "") == "": if commandList.replace(" ", "") == "":
commandList = "bash" commandList = "bash"
@ -37,5 +37,8 @@ if __name__ == "__main__":
# 判断是否挂载 # 判断是否挂载
if not os.path.ismount(f"{homePath}/.deepin-wine-runner-ubuntu-images/{sys.argv[1]}/dev"): if not os.path.ismount(f"{homePath}/.deepin-wine-runner-ubuntu-images/{sys.argv[1]}/dev"):
print("文件暂未挂载,开始挂载") print("文件暂未挂载,开始挂载")
sys.exit(os.system(f"pkexec env DISPLAY=$DISPLAY XAUTHORITY=$XAUTHORITY bash '{programPath}/Mount.sh' '{homePath}/.deepin-wine-runner-ubuntu-images/{sys.argv[1]}' '{userName}' {commandList}")) if int(sys.argv[2]):
sys.exit(os.system(f"pkexec env DISPLAY=$DISPLAY XAUTHORITY=$XAUTHORITY bash '{programPath}/MountWithoutHome.sh' '{homePath}/.deepin-wine-runner-ubuntu-images/{sys.argv[1]}' '{userName}' {commandList}"))
else:
sys.exit(os.system(f"pkexec env DISPLAY=$DISPLAY XAUTHORITY=$XAUTHORITY bash '{programPath}/Mount.sh' '{homePath}/.deepin-wine-runner-ubuntu-images/{sys.argv[1]}' '{userName}' {commandList}"))
sys.exit(os.system(f"pkexec env DISPLAY=$DISPLAY XAUTHORITY=$XAUTHORITY chroot '--userspec={userName}:{userName}' '{homePath}/.deepin-wine-runner-ubuntu-images/{sys.argv[1]}/' env 'HOME=/home/{userName}' {commandList}")) sys.exit(os.system(f"pkexec env DISPLAY=$DISPLAY XAUTHORITY=$XAUTHORITY chroot '--userspec={userName}:{userName}' '{homePath}/.deepin-wine-runner-ubuntu-images/{sys.argv[1]}/' env 'HOME=/home/{userName}' {commandList}"))

View File

@ -471,7 +471,7 @@ def ConfigQemu():
choose = QtWidgets.QInputDialog.getItem(window, "提示", "选择需要 Chroot 到里面的容器", lists, 0, False) choose = QtWidgets.QInputDialog.getItem(window, "提示", "选择需要 Chroot 到里面的容器", lists, 0, False)
if not choose[1]: if not choose[1]:
return return
threading.Thread(target=OpenTerminal, args=[f"python3 '{programPath}/QemuRun.py' '{choose[0]}' "]).start() threading.Thread(target=OpenTerminal, args=[f"python3 '{programPath}/QemuRun.py' '{int(setting['QemuUnMountHome'])}' '{choose[0]}' "]).start()
print(choose) print(choose)
# 生成 desktop 文件在桌面 # 生成 desktop 文件在桌面
@ -890,7 +890,31 @@ def InstallDXVK():
wineBottonPath = setting["DefultBotton"] wineBottonPath = setting["DefultBotton"]
else: else:
wineBottonPath = e1.currentText() wineBottonPath = e1.currentText()
OpenTerminal(f"env WINE='{wine[o1.currentText()]}' WINE64='{wine[o1.currentText()]}' WINEPREFIX='{wineBottonPath}' '{programPath}/dxvk/setup_dxvk.sh' install") OpenTerminal(f"env WINE='{wine[o1.currentText()]}' WINE64='{wine[o1.currentText()]}' WINEPREFIX='{wineBottonPath}' '{programPath}/dxvk/setup_dxvk.sh' uninstall")
def InstallVkd3d():
if not os.path.exists(f"{programPath}/vkd3d-proton"):
if os.system(f"7z x -y \"{programPath}/vkd3d-proton.7z\" -o\"{programPath}\""):
QtWidgets.QMessageBox.critical(widget, "错误", "无法解压资源")
return
os.remove(f"{programPath}/vkd3d-proton.7z")
if e1.currentText() == "":
wineBottonPath = setting["DefultBotton"]
else:
wineBottonPath = e1.currentText()
OpenTerminal(f"env WINE='{wine[o1.currentText()]}' WINE64='{wine[o1.currentText()]}' WINEPREFIX='{wineBottonPath}' '{programPath}/vkd3d-proton/setup_vkd3d_proton.sh' install")
def UninstallVkd3d():
if not os.path.exists(f"{programPath}/vkd3d-proton"):
if os.system(f"7z x -y \"{programPath}/vkd3d-proton.7z\" -o\"{programPath}\""):
QtWidgets.QMessageBox.critical(widget, "错误", "无法解压资源")
return
os.remove(f"{programPath}/vkd3d-proton.7z")
if e1.currentText() == "":
wineBottonPath = setting["DefultBotton"]
else:
wineBottonPath = e1.currentText()
OpenTerminal(f"env WINE='{wine[o1.currentText()]}' WINE64='{wine[o1.currentText()]}' WINEPREFIX='{wineBottonPath}' '{programPath}/vkd3d-proton/setup_vkd3d_proton.sh' uninstall")
#process = QtCore.QProcess() #process = QtCore.QProcess()
#process.startDetached(f"{programPath}/launch.sh", ["deepin-terminal", "-e", #process.startDetached(f"{programPath}/launch.sh", ["deepin-terminal", "-e",
#"env", f"WINE={wine[o1.currentText()]}", f"WINE64={wine[o1.currentText()]}", f"WINEPREFIX={wineBottonPath}", "bash", #"env", f"WINE={wine[o1.currentText()]}", f"WINE64={wine[o1.currentText()]}", f"WINEPREFIX={wineBottonPath}", "bash",
@ -1607,6 +1631,7 @@ class ProgramSetting():
runtimeCache = None runtimeCache = None
buildByBottleName = None buildByBottleName = None
autoPath = None autoPath = None
qemuUnmountHome = None
def ShowWindow(): def ShowWindow():
ProgramSetting.message = QtWidgets.QMainWindow() ProgramSetting.message = QtWidgets.QMainWindow()
widget = QtWidgets.QWidget() widget = QtWidgets.QWidget()
@ -1623,6 +1648,7 @@ class ProgramSetting():
widgetLayout.addWidget(QtWidgets.QLabel(transla.transe("U", "下载缓存:")), 9, 0, 1, 1) widgetLayout.addWidget(QtWidgets.QLabel(transla.transe("U", "下载缓存:")), 9, 0, 1, 1)
widgetLayout.addWidget(QtWidgets.QLabel(transla.transe("U", "图标生成:")), 10, 0, 1, 1) widgetLayout.addWidget(QtWidgets.QLabel(transla.transe("U", "图标生成:")), 10, 0, 1, 1)
widgetLayout.addWidget(QtWidgets.QLabel(transla.transe("U", "自动根据EXE名称生成路径")), 11, 0, 1, 1) widgetLayout.addWidget(QtWidgets.QLabel(transla.transe("U", "自动根据EXE名称生成路径")), 11, 0, 1, 1)
widgetLayout.addWidget(QtWidgets.QLabel(transla.transe("U", "Qemu + Chroot 挂载用户目录:")), 12, 0, 1, 1)
ProgramSetting.wineBottonA = QtWidgets.QComboBox() ProgramSetting.wineBottonA = QtWidgets.QComboBox()
ProgramSetting.wineDebug = QtWidgets.QCheckBox(transla.transe("U", "开启 DEBUG 输出")) ProgramSetting.wineDebug = QtWidgets.QCheckBox(transla.transe("U", "开启 DEBUG 输出"))
ProgramSetting.defultWine = QtWidgets.QComboBox() ProgramSetting.defultWine = QtWidgets.QComboBox()
@ -1642,7 +1668,8 @@ class ProgramSetting():
ProgramSetting.autoWine = QtWidgets.QCheckBox(transla.transe("U", "不显示未检测到的 Wine")) ProgramSetting.autoWine = QtWidgets.QCheckBox(transla.transe("U", "不显示未检测到的 Wine"))
ProgramSetting.runtimeCache = QtWidgets.QCheckBox(transla.transe("U", "开启下载缓存")) ProgramSetting.runtimeCache = QtWidgets.QCheckBox(transla.transe("U", "开启下载缓存"))
ProgramSetting.buildByBottleName = QtWidgets.QCheckBox(transla.transe("U", "本软件构建的图标后面添加容器名")) ProgramSetting.buildByBottleName = QtWidgets.QCheckBox(transla.transe("U", "本软件构建的图标后面添加容器名"))
ProgramSetting.autoPath = QtWidgets.QCheckBox(transla.transe("U", "自动根据文件名生成容器路径开启后必须通过修改默认wine容器路径才可指定其它路径重启后生效")) ProgramSetting.autoPath = QtWidgets.QCheckBox(transla.transe("U", "自动根据文件名生成容器路径开启后必须通过修改默认wine容器路径才可指定其它路径重启程序后生效"))
ProgramSetting.qemuUnmountHome = QtWidgets.QCheckBox(transla.transe("U", "使用 Qemu + Chroot 时不挂载用户目录并与系统隔离(修改后重启操作系统生效)"))
ProgramSetting.wineBottonA.addItems(["Auto", "win32", "win64"]) ProgramSetting.wineBottonA.addItems(["Auto", "win32", "win64"])
ProgramSetting.wineBottonA.setCurrentText(setting["Architecture"]) ProgramSetting.wineBottonA.setCurrentText(setting["Architecture"])
ProgramSetting.wineDebug.setChecked(setting["Debug"]) ProgramSetting.wineDebug.setChecked(setting["Debug"])
@ -1656,6 +1683,8 @@ class ProgramSetting():
ProgramSetting.runtimeCache.setChecked(setting["RuntimeCache"]) ProgramSetting.runtimeCache.setChecked(setting["RuntimeCache"])
ProgramSetting.buildByBottleName.setChecked(setting["BuildByBottleName"]) ProgramSetting.buildByBottleName.setChecked(setting["BuildByBottleName"])
ProgramSetting.autoPath.setChecked(setting["AutoPath"]) ProgramSetting.autoPath.setChecked(setting["AutoPath"])
ProgramSetting.qemuUnmountHome.setChecked(setting["QemuUnMountHome"])
# QemuUnMountHome
widgetLayout.addWidget(ProgramSetting.wineBottonA, 0, 1, 1, 1) widgetLayout.addWidget(ProgramSetting.wineBottonA, 0, 1, 1, 1)
widgetLayout.addWidget(ProgramSetting.wineDebug, 1, 1, 1, 1) widgetLayout.addWidget(ProgramSetting.wineDebug, 1, 1, 1, 1)
widgetLayout.addWidget(ProgramSetting.defultWine, 2, 1, 1, 1) widgetLayout.addWidget(ProgramSetting.defultWine, 2, 1, 1, 1)
@ -1670,7 +1699,8 @@ class ProgramSetting():
widgetLayout.addWidget(ProgramSetting.runtimeCache, 9, 1, 1, 1) widgetLayout.addWidget(ProgramSetting.runtimeCache, 9, 1, 1, 1)
widgetLayout.addWidget(ProgramSetting.buildByBottleName, 10, 1, 1, 1) widgetLayout.addWidget(ProgramSetting.buildByBottleName, 10, 1, 1, 1)
widgetLayout.addWidget(ProgramSetting.autoPath, 11, 1, 1, 2) widgetLayout.addWidget(ProgramSetting.autoPath, 11, 1, 1, 2)
widgetLayout.addWidget(save, 12, 2, 1, 1) widgetLayout.addWidget(ProgramSetting.qemuUnmountHome, 12, 1, 1, 2)
widgetLayout.addWidget(save, 13, 2, 1, 1)
widget.setLayout(widgetLayout) widget.setLayout(widgetLayout)
ProgramSetting.message.setCentralWidget(widget) ProgramSetting.message.setCentralWidget(widget)
ProgramSetting.message.setWindowIcon(QtGui.QIcon(iconPath)) ProgramSetting.message.setWindowIcon(QtGui.QIcon(iconPath))
@ -1700,6 +1730,7 @@ class ProgramSetting():
setting["RuntimeCache"] = ProgramSetting.runtimeCache.isChecked() setting["RuntimeCache"] = ProgramSetting.runtimeCache.isChecked()
setting["BuildByBottleName"] = ProgramSetting.buildByBottleName.isChecked() setting["BuildByBottleName"] = ProgramSetting.buildByBottleName.isChecked()
setting["AutoPath"] = ProgramSetting.autoPath.isChecked() setting["AutoPath"] = ProgramSetting.autoPath.isChecked()
setting["QemuUnMountHome"] = ProgramSetting.qemuUnmountHome.isChecked()
try: try:
write_txt(get_home() + "/.config/deepin-wine-runner/WineSetting.json", json.dumps(setting)) write_txt(get_home() + "/.config/deepin-wine-runner/WineSetting.json", json.dumps(setting))
except: except:
@ -1864,207 +1895,6 @@ def GetNewInformation():
webInformation.resize(int(webInformation.frameGeometry().width() * 1.3), int(webInformation.frameGeometry().height() * 1.1)) webInformation.resize(int(webInformation.frameGeometry().width() * 1.3), int(webInformation.frameGeometry().height() * 1.1))
webInformation.show() webInformation.show()
###########################
# 加载配置
###########################
defultProgramList = {
"Architecture": "Auto",
"Debug": True,
"DefultWine": "deepin-wine6 stable",
"DefultBotton" : get_home() + "/.wine",
"TerminalOpen": False,
"WineOption": "",
"WineBottonDifferent": False,
"CenterWindow": False,
"Theme": "",
"MonoGeckoInstaller": True,
"AutoWine": True,
"RuntimeCache": True,
"MustRead": False,
"BuildByBottleName": False,
"AutoPath": False
}
if not os.path.exists(get_home() + "/.config/"): # 如果没有配置文件夹
os.mkdir(get_home() + "/.config/") # 创建配置文件夹
if not os.path.exists(get_home() + "/.config/deepin-wine-runner"): # 如果没有配置文件夹
os.mkdir(get_home() + "/.config/deepin-wine-runner") # 创建配置文件夹
if not os.path.exists(get_home() + "/.config/deepin-wine-runner/ShellHistory.json"): # 如果没有配置文件
write_txt(get_home() + "/.config/deepin-wine-runner/ShellHistory.json", json.dumps({})) # 创建配置文件
if not os.path.exists(get_home() + "/.config/deepin-wine-runner/FindExeHistory.json"): # 如果没有配置文件
write_txt(get_home() + "/.config/deepin-wine-runner/FindExeHistory.json", json.dumps({})) # 创建配置文件
if not os.path.exists(get_home() + "/.config/deepin-wine-runner/WineBottonHistory.json"): # 如果没有配置文件
write_txt(get_home() + "/.config/deepin-wine-runner/WineBottonHistory.json", json.dumps({})) # 创建配置文件
if not os.path.exists(get_home() + "/.config/deepin-wine-runner/ISOPath.json"): # 如果没有配置文件
write_txt(get_home() + "/.config/deepin-wine-runner/ISOPath.json", json.dumps({})) # 写入(创建)一个配置文件
if not os.path.exists(get_home() + "/.config/deepin-wine-runner/ISOPathFound.json"): # 如果没有配置文件
write_txt(get_home() + "/.config/deepin-wine-runner/ISOPathFound.json", json.dumps({})) # 写入(创建)一个配置文件
if not os.path.exists(get_home() + "/.config/deepin-wine-runner/FindExe.json"): # 如果没有配置文件
write_txt(get_home() + "/.config/deepin-wine-runner/FindExe.json", json.dumps({"path": "~"})) # 写入(创建)一个配置文件
if not os.path.exists(get_home() + "/.config/deepin-wine-runner/FindISO.json"): # 如果没有配置文件
write_txt(get_home() + "/.config/deepin-wine-runner/FindISO.json", json.dumps({"path": "~"})) # 写入(创建)一个配置文件
if not os.path.exists(get_home() + "/.config/deepin-wine-runner/WineBotton.json"): # 如果没有配置文件
write_txt(get_home() + "/.config/deepin-wine-runner/WineBotton.json", json.dumps({"path": "~/.deepinwine"})) # 写入(创建)一个配置文件
if not os.path.exists(get_home() + "/.config/deepin-wine-runner/WineSetting.json"): # 如果没有配置文件
write_txt(get_home() + "/.config/deepin-wine-runner/WineSetting.json", json.dumps(defultProgramList)) # 写入(创建)一个配置文件
###########################
# 设置变量
###########################
programPath = os.path.split(os.path.realpath(__file__))[0] # 返回 string
# 如果要添加其他 wine请使用安装更多 Wine 功能
#############
# 检测 Wine
#############
try:
wine = {
"基于 UOS 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 ",
"基于 UOS exagear 的 deepin-wine6-stable": f"WINEPREDLL='{programPath}/dlls-arm' 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",
"deepin-wine": "deepin-wine",
"deepin-wine5": "deepin-wine5",
"wine": "wine",
"wine64": "wine64",
"ukylin-wine": "ukylin-wine",
"mono这不是 wine但可以实现初步调用运行 .net 应用)": "mono",
"基于 linglong 的 deepin-wine6-stable不推荐": f"ll-cli run '' --exec '/bin/deepin-wine6-stable'"
}
untipsWine = ["基于 exagear 的 deepin-wine6-stable", "基于 UOS box86 的 deepin-wine6-stable", "基于 UOS exagear 的 deepin-wine6-stable", "基于 linglong 的 deepin-wine6-stable不推荐"]
canUseWine = []
if os.path.exists("/opt/deepin-box86/box86") and os.path.exists("/opt/deepin-wine6-stable/bin/wine"):
canUseWine.append("基于 UOS box86 的 deepin-wine6-stable")
if os.path.exists("/opt/exagear/bin/ubt_x64a64_al") and os.path.exists("/opt/deepin-wine6-stable/bin/wine"):
canUseWine.append("基于 UOS exagear 的 deepin-wine6-stable")
if not os.system("which exagear") and os.path.exists("/opt/deepin-wine6-stable/bin/wine"):
canUseWine.append("基于 exagear 的 deepin-wine6-stable")
for i in wine.keys():
if not os.system(f"which '{wine[i]}'"):
canUseWine.append(i)
if os.path.exists("/persistent/linglong/layers/"): # 判断是否使用 linglong
for i in os.listdir("/persistent/linglong/layers/"):
try:
dire = os.listdir(f"/persistent/linglong/layers/{i}")[-1]
arch = os.listdir(f"/persistent/linglong/layers/{i}/{dire}")[-1]
if os.path.exists(f"/persistent/linglong/layers/{i}/{dire}/{arch}/runtime/bin/deepin-wine6-stable"):
wine["基于 linglong 的 deepin-wine6-stable不推荐"] = f"ll-cli run {i} --exec '/bin/deepin-wine6-stable'"
canUseWine.append("基于 linglong 的 deepin-wine6-stable不推荐")
break
except:
pass
# 读取自定义安装的 Wine需要解包的才能使用
qemuBottleList = []
qemuPath = f"{get_home()}/.deepin-wine-runner-ubuntu-images"
if not os.system("which qemu-i386-static"):
if os.path.exists(qemuPath):
for g in os.listdir(qemuPath):
archPath = f"{qemuPath}/{g}"
arch = g
if os.path.isdir(archPath):
for d in os.listdir(archPath):
bottlePath = f"{archPath}/{d}"
if os.path.isdir(bottlePath):
qemuBottleList.append([
arch,
d,
bottlePath
])
try:
# 不再从列表读取,直接读目录
for i in os.listdir(f"{programPath}/wine/"):
#for i in json.loads(readtxt(f"{programPath}/wine/winelist.json")):
if os.path.exists(f"{programPath}/wine/{i}") and os.path.isdir(f"{programPath}/wine/{i}"):
name = ""
qemuInstall = False
nameValue = [["", ""]]
try:
if os.path.exists("/opt/deepin-box86/box86"):
nameValue.append(
[
"基于 UOS box86 的 ",
f"WINEPREDLL='{programPath}/dlls-arm' WINEDLLPATH=/opt/deepin-wine6-stable/lib BOX86_NOSIGSEGV=1 /opt/deepin-box86/box86 "
]
)
if os.system("which box86") == 0:
nameValue.append(
[
"基于 box86 的 ",
f"box86 "
]
)
if os.system("which box64") == 0:
nameValue.append(
[
"基于 box64 的 ",
f"box64 "
]
)
if os.system("which exagear") == 0:
nameValue.append(
[
"基于 exagear 的 ",
f"exagear "
]
)
if os.path.exists("/opt/exagear/bin/ubt_x64a64_al"):
nameValue.append(
[
"基于 UOS exagear 的 ",
f"WINEPREDLL='{programPath}/dlls-arm' 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 -- "
]
)
for g in qemuBottleList:
nameValue.append([
f"使用qemu-{g[0]}-static 调用容器{g[1]}运行 ",
f"python3 '{programPath}/QemuRun.py' '{g[0]}/{g[1]}' "
])
except:
pass
for k in nameValue:
print(k)
if "qemu" in k[0]:
chrootProgramPath = "/opt/apps/deepin-wine-runner"
else:
chrootProgramPath = programPath
if os.path.exists(f"{programPath}/wine/{i}/bin/wine"):
wine[f"{k[0]}{chrootProgramPath}/wine/{i}/bin/wine"] = f"{k[1]}{chrootProgramPath}/wine/{i}/bin/wine"
canUseWine.append(f"{k[0]}{chrootProgramPath}/wine/{i}/bin/wine")
untipsWine.append(f"{k[0]}{chrootProgramPath}/wine/{i}/bin/wine")
if os.path.exists(f"{programPath}/wine/{i}/bin/wine64"):
wine[f"{k[0]}{chrootProgramPath}/wine/{i}/bin/wine64"] = f"{k[1]}{chrootProgramPath}/wine/{i}/bin/wine64"
canUseWine.append(f"{k[0]}{chrootProgramPath}/wine/{i}/bin/wine64")
untipsWine.append(f"{k[0]}{chrootProgramPath}/wine/{i}/bin/wine64")
except:
pass
try:
for i in os.listdir(f"{get_home()}/.deepinwine/"):
if os.path.exists(f"{get_home()}/.deepinwine/{i}/bin/wine"):
wine[f"{get_home()}/.deepinwine/{i}/bin/wine"] = f"{get_home()}/.deepinwine/{i}/bin/wine"
canUseWine.append(f"{get_home()}/.deepinwine/{i}/bin/wine")
if os.path.exists(f"{get_home()}/.deepinwine/{i}/bin/wine64"):
wine[f"{get_home()}/.deepinwine/{i}/bin/wine64"] = f"{get_home()}/.deepinwine/{i}/bin/wine64"
canUseWine.append(f"{get_home()}/.deepinwine/{i}/bin/wine64")
except:
pass
shellHistory = list(json.loads(readtxt(get_home() + "/.config/deepin-wine-runner/ShellHistory.json")).values())
findExeHistory = list(json.loads(readtxt(get_home() + "/.config/deepin-wine-runner/FindExeHistory.json")).values())
wineBottonHistory = list(json.loads(readtxt(get_home() + "/.config/deepin-wine-runner/WineBottonHistory.json")).values())
isoPath = list(json.loads(readtxt(get_home() + "/.config/deepin-wine-runner/ISOPath.json")).values())
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 defultProgramList.keys():
if not i in setting:
change = True
setting[i] = defultProgramList[i]
if change:
write_txt(get_home() + "/.config/deepin-wine-runner/WineSetting.json", json.dumps(setting))
except:
traceback.print_exc()
app = QtWidgets.QApplication(sys.argv)
QtWidgets.QMessageBox.critical(None, "错误", f"无法读取配置,无法继续\n{traceback.format_exc()}")
sys.exit(1)
def getFileFolderSize(fileOrFolderPath): def getFileFolderSize(fileOrFolderPath):
"""get size for file or folder""" """get size for file or folder"""
totalSize = 0 totalSize = 0
@ -2192,15 +2022,15 @@ def GetVersion():
def UnPackage(): def UnPackage():
QtWidgets.QMessageBox.information(window, "提示", "请在下面两个对话框中选择 deb 包所在路径和容器解压到的路径") QtWidgets.QMessageBox.information(window, "提示", "请在下面两个对话框中选择 deb 包所在路径和容器解压到的路径")
debPath = QtWidgets.QFileDialog.getOpenFileName(window) debPath = QtWidgets.QFileDialog.getOpenFileName(window, get_home(), "deb 文件(*.deb);;所有文件(*.*)")
if not debPath[1]: if not debPath[1]:
return return
path = QtWidgets.QFileDialog.getExistingDirectory(window) path = QtWidgets.QFileDialog.getExistingDirectory(window, get_home())
print(path) print(path)
if not path[1]: if not path:
return return
tempDebDir = f"/tmp/wine-runner-unpack-deb-{random.randint(0, 1000)}" tempDebDir = f"/tmp/wine-runner-unpack-deb-{random.randint(0, 1000)}"
if os.system(f"dpkg -b '{debPath}' '{tempDebDir}'"): if os.system(f"dpkg -x '{debPath[0]}' '{tempDebDir}'"):
QtWidgets.QMessageBox.critical(window, "错误", "解压失败!") QtWidgets.QMessageBox.critical(window, "错误", "解压失败!")
return return
zippath = FindFile(tempDebDir, "files.7z") zippath = FindFile(tempDebDir, "files.7z")
@ -2209,8 +2039,10 @@ def UnPackage():
return return
print(path) print(path)
# 解压文件 # 解压文件
os.system(f"mkdir -p '{path[0]}'") os.system(f"mkdir -p '{path}'")
os.system(f"7z x '{zippath}' -o'{path[0]}'") os.system(f"7z x -y '{zippath}' -o'{path}'")
os.system(f"rm -rfv '{tempDebDir}'")
QtWidgets.QMessageBox.information(window, "提示", "解压完成!")
def FindFile(file, name): def FindFile(file, name):
for i in os.listdir(file): for i in os.listdir(file):
@ -2259,6 +2091,208 @@ def TransLog():
#return transText #return transText
returnText.setText(transText.replace("\n\n", "\n")) returnText.setText(transText.replace("\n\n", "\n"))
###########################
# 加载配置
###########################
defultProgramList = {
"Architecture": "Auto",
"Debug": True,
"DefultWine": "deepin-wine6 stable",
"DefultBotton" : get_home() + "/.wine",
"TerminalOpen": False,
"WineOption": "",
"WineBottonDifferent": False,
"CenterWindow": False,
"Theme": "",
"MonoGeckoInstaller": True,
"AutoWine": True,
"RuntimeCache": True,
"MustRead": False,
"BuildByBottleName": False,
"AutoPath": False,
"QemuUnMountHome": False
}
if not os.path.exists(get_home() + "/.config/"): # 如果没有配置文件夹
os.mkdir(get_home() + "/.config/") # 创建配置文件夹
if not os.path.exists(get_home() + "/.config/deepin-wine-runner"): # 如果没有配置文件夹
os.mkdir(get_home() + "/.config/deepin-wine-runner") # 创建配置文件夹
if not os.path.exists(get_home() + "/.config/deepin-wine-runner/ShellHistory.json"): # 如果没有配置文件
write_txt(get_home() + "/.config/deepin-wine-runner/ShellHistory.json", json.dumps({})) # 创建配置文件
if not os.path.exists(get_home() + "/.config/deepin-wine-runner/FindExeHistory.json"): # 如果没有配置文件
write_txt(get_home() + "/.config/deepin-wine-runner/FindExeHistory.json", json.dumps({})) # 创建配置文件
if not os.path.exists(get_home() + "/.config/deepin-wine-runner/WineBottonHistory.json"): # 如果没有配置文件
write_txt(get_home() + "/.config/deepin-wine-runner/WineBottonHistory.json", json.dumps({})) # 创建配置文件
if not os.path.exists(get_home() + "/.config/deepin-wine-runner/ISOPath.json"): # 如果没有配置文件
write_txt(get_home() + "/.config/deepin-wine-runner/ISOPath.json", json.dumps({})) # 写入(创建)一个配置文件
if not os.path.exists(get_home() + "/.config/deepin-wine-runner/ISOPathFound.json"): # 如果没有配置文件
write_txt(get_home() + "/.config/deepin-wine-runner/ISOPathFound.json", json.dumps({})) # 写入(创建)一个配置文件
if not os.path.exists(get_home() + "/.config/deepin-wine-runner/FindExe.json"): # 如果没有配置文件
write_txt(get_home() + "/.config/deepin-wine-runner/FindExe.json", json.dumps({"path": "~"})) # 写入(创建)一个配置文件
if not os.path.exists(get_home() + "/.config/deepin-wine-runner/FindISO.json"): # 如果没有配置文件
write_txt(get_home() + "/.config/deepin-wine-runner/FindISO.json", json.dumps({"path": "~"})) # 写入(创建)一个配置文件
if not os.path.exists(get_home() + "/.config/deepin-wine-runner/WineBotton.json"): # 如果没有配置文件
write_txt(get_home() + "/.config/deepin-wine-runner/WineBotton.json", json.dumps({"path": "~/.deepinwine"})) # 写入(创建)一个配置文件
if not os.path.exists(get_home() + "/.config/deepin-wine-runner/WineSetting.json"): # 如果没有配置文件
write_txt(get_home() + "/.config/deepin-wine-runner/WineSetting.json", json.dumps(defultProgramList)) # 写入(创建)一个配置文件
###########################
# 设置变量
###########################
programPath = os.path.split(os.path.realpath(__file__))[0] # 返回 string
# 如果要添加其他 wine请使用安装更多 Wine 功能
#############
# 检测 Wine
#############
try:
wine = {
"基于 UOS 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 ",
"基于 UOS exagear 的 deepin-wine6-stable": f"WINEPREDLL='{programPath}/dlls-arm' 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",
"deepin-wine": "deepin-wine",
"deepin-wine5": "deepin-wine5",
"wine": "wine",
"wine64": "wine64",
"ukylin-wine": "ukylin-wine",
"mono这不是 wine但可以实现初步调用运行 .net 应用)": "mono",
"基于 linglong 的 deepin-wine6-stable不推荐": f"ll-cli run '' --exec '/bin/deepin-wine6-stable'"
}
untipsWine = ["基于 exagear 的 deepin-wine6-stable", "基于 UOS box86 的 deepin-wine6-stable", "基于 UOS exagear 的 deepin-wine6-stable", "基于 linglong 的 deepin-wine6-stable不推荐"]
canUseWine = []
if os.path.exists("/opt/deepin-box86/box86") and os.path.exists("/opt/deepin-wine6-stable/bin/wine"):
canUseWine.append("基于 UOS box86 的 deepin-wine6-stable")
if os.path.exists("/opt/exagear/bin/ubt_x64a64_al") and os.path.exists("/opt/deepin-wine6-stable/bin/wine"):
canUseWine.append("基于 UOS exagear 的 deepin-wine6-stable")
if not os.system("which exagear") and os.path.exists("/opt/deepin-wine6-stable/bin/wine"):
canUseWine.append("基于 exagear 的 deepin-wine6-stable")
for i in wine.keys():
if not os.system(f"which '{wine[i]}'"):
canUseWine.append(i)
if os.path.exists("/persistent/linglong/layers/"): # 判断是否使用 linglong
for i in os.listdir("/persistent/linglong/layers/"):
try:
dire = os.listdir(f"/persistent/linglong/layers/{i}")[-1]
arch = os.listdir(f"/persistent/linglong/layers/{i}/{dire}")[-1]
if os.path.exists(f"/persistent/linglong/layers/{i}/{dire}/{arch}/runtime/bin/deepin-wine6-stable"):
wine["基于 linglong 的 deepin-wine6-stable不推荐"] = f"ll-cli run {i} --exec '/bin/deepin-wine6-stable'"
canUseWine.append("基于 linglong 的 deepin-wine6-stable不推荐")
break
except:
pass
# 读取自定义安装的 Wine需要解包的才能使用
qemuBottleList = []
qemuPath = f"{get_home()}/.deepin-wine-runner-ubuntu-images"
if not os.system("which qemu-i386-static"):
if os.path.exists(qemuPath):
for g in os.listdir(qemuPath):
archPath = f"{qemuPath}/{g}"
arch = g
if os.path.isdir(archPath):
for d in os.listdir(archPath):
bottlePath = f"{archPath}/{d}"
if os.path.isdir(bottlePath):
qemuBottleList.append([
arch,
d,
bottlePath
])
shellHistory = list(json.loads(readtxt(get_home() + "/.config/deepin-wine-runner/ShellHistory.json")).values())
findExeHistory = list(json.loads(readtxt(get_home() + "/.config/deepin-wine-runner/FindExeHistory.json")).values())
wineBottonHistory = list(json.loads(readtxt(get_home() + "/.config/deepin-wine-runner/WineBottonHistory.json")).values())
isoPath = list(json.loads(readtxt(get_home() + "/.config/deepin-wine-runner/ISOPath.json")).values())
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 defultProgramList.keys():
if not i in setting:
change = True
setting[i] = defultProgramList[i]
if change:
write_txt(get_home() + "/.config/deepin-wine-runner/WineSetting.json", json.dumps(setting))
try:
# 不再从列表读取,直接读目录
for i in os.listdir(f"{programPath}/wine/"):
#for i in json.loads(readtxt(f"{programPath}/wine/winelist.json")):
if os.path.exists(f"{programPath}/wine/{i}") and os.path.isdir(f"{programPath}/wine/{i}"):
name = ""
qemuInstall = False
nameValue = [["", ""]]
try:
if os.path.exists("/opt/deepin-box86/box86"):
nameValue.append(
[
"基于 UOS box86 的 ",
f"WINEPREDLL='{programPath}/dlls-arm' WINEDLLPATH=/opt/deepin-wine6-stable/lib BOX86_NOSIGSEGV=1 /opt/deepin-box86/box86 "
]
)
if os.system("which box86") == 0:
nameValue.append(
[
"基于 box86 的 ",
f"box86 "
]
)
if os.system("which box64") == 0:
nameValue.append(
[
"基于 box64 的 ",
f"box64 "
]
)
if os.system("which exagear") == 0:
nameValue.append(
[
"基于 exagear 的 ",
f"exagear "
]
)
if os.path.exists("/opt/exagear/bin/ubt_x64a64_al"):
nameValue.append(
[
"基于 UOS exagear 的 ",
f"WINEPREDLL='{programPath}/dlls-arm' 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 -- "
]
)
for g in qemuBottleList:
nameValue.append([
f"使用qemu-{g[0]}-static 调用容器{g[1]}运行 ",
f"python3 '{programPath}/QemuRun.py' {int(setting['QemuUnMountHome'])} '{g[0]}/{g[1]}' "
])
except:
traceback.print_exc()
for k in nameValue:
print(k)
if "qemu" in k[0]:
chrootProgramPath = "/opt/apps/deepin-wine-runner"
else:
chrootProgramPath = programPath
if os.path.exists(f"{programPath}/wine/{i}/bin/wine"):
wine[f"{k[0]}{chrootProgramPath}/wine/{i}/bin/wine"] = f"{k[1]}{chrootProgramPath}/wine/{i}/bin/wine"
canUseWine.append(f"{k[0]}{chrootProgramPath}/wine/{i}/bin/wine")
untipsWine.append(f"{k[0]}{chrootProgramPath}/wine/{i}/bin/wine")
if os.path.exists(f"{programPath}/wine/{i}/bin/wine64"):
wine[f"{k[0]}{chrootProgramPath}/wine/{i}/bin/wine64"] = f"{k[1]}{chrootProgramPath}/wine/{i}/bin/wine64"
canUseWine.append(f"{k[0]}{chrootProgramPath}/wine/{i}/bin/wine64")
untipsWine.append(f"{k[0]}{chrootProgramPath}/wine/{i}/bin/wine64")
except:
pass
try:
for i in os.listdir(f"{get_home()}/.deepinwine/"):
if os.path.exists(f"{get_home()}/.deepinwine/{i}/bin/wine"):
wine[f"{get_home()}/.deepinwine/{i}/bin/wine"] = f"{get_home()}/.deepinwine/{i}/bin/wine"
canUseWine.append(f"{get_home()}/.deepinwine/{i}/bin/wine")
if os.path.exists(f"{get_home()}/.deepinwine/{i}/bin/wine64"):
wine[f"{get_home()}/.deepinwine/{i}/bin/wine64"] = f"{get_home()}/.deepinwine/{i}/bin/wine64"
canUseWine.append(f"{get_home()}/.deepinwine/{i}/bin/wine64")
except:
pass
except:
traceback.print_exc()
app = QtWidgets.QApplication(sys.argv)
QtWidgets.QMessageBox.critical(None, "错误", f"无法读取配置,无法继续\n{traceback.format_exc()}")
sys.exit(1)
# transla.transe # transla.transe
programVersionType = "" programVersionType = ""
@ -2299,20 +2333,25 @@ exe路径\' 参数 \'
updateThingsString = transla.transe("U", '''※1、支持使用 Qemu + Chroot 跨运行 Wine 以及指定程序的功能; updateThingsString = transla.transe("U", '''※1、支持使用 Qemu + Chroot 跨运行 Wine 以及指定程序的功能;
※2、提供了简易打包器以用于打包简易 deb ※2、提供了简易打包器以用于打包简易 deb
※3、支持下载配置过的 Qemu + Chroot 容器; ※3、支持下载配置过的 Qemu + Chroot 容器;
※4、支持解压指定 deb 的内打包好的容器; ※4、支持在隔离的 Chroot 容器内运行 Wine
※5、优化 Wine 列表显示; ※5、支持解压指定 deb 的内打包好的容器;
※6、新增程序论坛和教程入口 ※6、优化 Wine 列表显示;
※7、程序公告功能 ※7、新增程序论坛和教程入口
※8、新增程序评分功能 ※8、程序公告功能
9、优化非基于生态适配脚本的打包器内容自动填充功能 ※9、新增程序评分功能
10、优化程序文案 ※10、新增解包 deb 内 Wine 容器功能;
11、新增日志翻译功能 ※11、新增 Vkd3d Proton 安装功能,更新 dxvk 版本至 2.0.0
12、程序进一步完善英语翻译机翻 ※12、新增程序菜单栏部分栏目图标
13、优化程序更新策略 13、优化非基于生态适配脚本的打包器内容自动填充功能
14、优化日志分析功能。''') 14、优化程序文案
15、新增日志翻译功能
16、程序进一步完善英语翻译机翻
17、优化程序更新策略
18、优化日志分析功能
19、优化程序 UI。''')
for i in information["Thank"]: for i in information["Thank"]:
thankText += f"{i}\n" thankText += f"{i}\n"
updateTime = "2022年12月07日" updateTime = "2022年12月08日"
aboutProgram = transla.transe("U", """<p>Wine运行器是一个能让Linux用户更加方便地运行Windows应用的程序内置了对Wine图形化的支持、各种Wine工具、自制的Wine程序打包器和运行库安装工具等。</p> aboutProgram = transla.transe("U", """<p>Wine运行器是一个能让Linux用户更加方便地运行Windows应用的程序内置了对Wine图形化的支持、各种Wine工具、自制的Wine程序打包器和运行库安装工具等。</p>
<p>它同时还内置了基于VirtualBox制作的、专供小白使用的Windows虚拟机安装工具可以做到只需下载系统镜像并点击安装即可无需考虑虚拟机的安装、创建、分区等操作。</p> <p>它同时还内置了基于VirtualBox制作的、专供小白使用的Windows虚拟机安装工具可以做到只需下载系统镜像并点击安装即可无需考虑虚拟机的安装、创建、分区等操作。</p>
<pre> <pre>
@ -2464,7 +2503,7 @@ getLoseDll = QtWidgets.QPushButton(transla.transe("U", "检测静态下程序缺
getLoseDll.clicked.connect(GetLoseDll) getLoseDll.clicked.connect(GetLoseDll)
programManager.addWidget(QtWidgets.QLabel(" "*5), 1, 9, 1, 1) programManager.addWidget(QtWidgets.QLabel(" "*5), 1, 9, 1, 1)
programManager.addWidget(getLoseDll, 1, 10, 1, 1) programManager.addWidget(getLoseDll, 1, 10, 1, 1)
programManager.addItem(QtWidgets.QSpacerItem(20, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum), 1, 9, 1, 1) programManager.addItem(QtWidgets.QSpacerItem(20, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum), 1, 11, 1, 1)
programManager.addWidget(QtWidgets.QLabel(transla.transe("U", "WINE配置")), 2, 0, 1, 1) programManager.addWidget(QtWidgets.QLabel(transla.transe("U", "WINE配置")), 2, 0, 1, 1)
wineConfig = QtWidgets.QPushButton(transla.transe("U", "配置容器")) wineConfig = QtWidgets.QPushButton(transla.transe("U", "配置容器"))
wineConfig.clicked.connect(lambda: RunWineProgram("winecfg")) wineConfig.clicked.connect(lambda: RunWineProgram("winecfg"))
@ -2526,16 +2565,16 @@ mainLayout.addWidget(programRun, 2, 1, 1, 1)
# 菜单栏 # 菜单栏
menu = window.menuBar() menu = window.menuBar()
programmenu = menu.addMenu(transla.transe("U", "程序(&P)")) programmenu = menu.addMenu(transla.transe("U", "程序(&P)"))
p1 = QtWidgets.QAction(transla.transe("U", "安装 wine(&I)")) p1 = QtWidgets.QAction(QtGui.QIcon(f"{programPath}/Icon/Function/wine.png"), transla.transe("U", "安装 wine(&I)"))
installWineOnDeepin23 = QtWidgets.QAction(transla.transe("U", "安装 wine(只限Deepin23 Preview)")) installWineOnDeepin23 = QtWidgets.QAction(QtGui.QIcon(f"{programPath}/Icon/Function/wine23P.png"), transla.transe("U", "安装 wine(只限Deepin23 Preview)"))
installWineOnDeepin23Alpha = QtWidgets.QAction(transla.transe("U", "安装 wine(只限Deepin23 Alpha)")) installWineOnDeepin23Alpha = QtWidgets.QAction(QtGui.QIcon(f"{programPath}/Icon/Function/wine23A.png"), transla.transe("U", "安装 wine(只限Deepin23 Alpha)"))
installWineHQ = QtWidgets.QAction(transla.transe("U", "安装 WineHQ")) installWineHQ = QtWidgets.QAction(QtGui.QIcon(f"{programPath}/Icon/Function/wine.png"), transla.transe("U", "安装 WineHQ"))
installMoreWine = QtWidgets.QAction(transla.transe("U", "安装更多 Wine")) installMoreWine = QtWidgets.QAction(QtGui.QIcon(f"{programPath}/Icon/Function/more-wine.png"), transla.transe("U", "安装更多 Wine"))
downloadChrootBottle = QtWidgets.QAction(transla.transe("U", "下载 Chroot 容器")) downloadChrootBottle = QtWidgets.QAction(QtGui.QIcon(f"{programPath}/Icon/Function/CHROOT.png"), transla.transe("U", "下载 Chroot 容器"))
p2 = QtWidgets.QAction(transla.transe("U", "设置程序(&S)")) p2 = QtWidgets.QAction(transla.transe("U", "设置程序(&S)"))
p3 = QtWidgets.QAction(transla.transe("U", "清空软件历史记录(&C)")) p3 = QtWidgets.QAction(QtWidgets.QApplication.style().standardIcon(47), transla.transe("U", "清空软件历史记录(&C)"))
cleanCache = QtWidgets.QAction(transla.transe("U", "清空软件缓存")) cleanCache = QtWidgets.QAction(QtWidgets.QApplication.style().standardIcon(47), transla.transe("U", "清空软件缓存"))
cleanProgramUnuse = QtWidgets.QAction(transla.transe("U", "删除程序组件")) cleanProgramUnuse = QtWidgets.QAction(QtWidgets.QApplication.style().standardIcon(47), transla.transe("U", "删除程序组件"))
p4 = QtWidgets.QAction(transla.transe("U", "退出程序(&E)")) p4 = QtWidgets.QAction(transla.transe("U", "退出程序(&E)"))
programmenu.addAction(p1) programmenu.addAction(p1)
programmenu.addAction(installWineOnDeepin23) programmenu.addAction(installWineOnDeepin23)
@ -2576,7 +2615,7 @@ easyPackager = QtWidgets.QAction(transla.transe("U", "使用简易打包器进
getDllOnInternet = QtWidgets.QAction(transla.transe("U", "从互联网获取DLL")) getDllOnInternet = QtWidgets.QAction(transla.transe("U", "从互联网获取DLL"))
w7 = QtWidgets.QAction(transla.transe("U", "从镜像获取DLL只支持官方安装镜像DOS内核如 Windows 95 暂不支持)")) w7 = QtWidgets.QAction(transla.transe("U", "从镜像获取DLL只支持官方安装镜像DOS内核如 Windows 95 暂不支持)"))
updateGeek = QtWidgets.QAction(transla.transe("U", "从 Geek Uninstaller 官网升级程序")) updateGeek = QtWidgets.QAction(transla.transe("U", "从 Geek Uninstaller 官网升级程序"))
deletePartIcon = QtWidgets.QAction(transla.transe("U", "删除部分 Wine 程序在启动器的快捷方式")) deletePartIcon = QtWidgets.QAction(transla.transe("U", "快捷方式管理工具"))
deleteDesktopIcon = QtWidgets.QAction(transla.transe("U", "删除所有 Wine 程序在启动器的快捷方式")) deleteDesktopIcon = QtWidgets.QAction(transla.transe("U", "删除所有 Wine 程序在启动器的快捷方式"))
wineOption.addAction(w1) wineOption.addAction(w1)
wineOption.addAction(w2) wineOption.addAction(w2)
@ -2587,6 +2626,7 @@ wineOption.addSeparator()
wineOption.addAction(w5) wineOption.addAction(w5)
wineOption.addAction(w6) wineOption.addAction(w6)
wineOption.addAction(easyPackager) wineOption.addAction(easyPackager)
wineOption.addAction(deletePartIcon)
wineOption.addSeparator() wineOption.addSeparator()
wineOption.addAction(wineKeyboardLnk) wineOption.addAction(wineKeyboardLnk)
wineOption.addSeparator() wineOption.addSeparator()
@ -2624,13 +2664,14 @@ wm2.addAction(wm2_4)
wm2.addAction(wm2_5) wm2.addAction(wm2_5)
wm2.addAction(wm2_6) wm2.addAction(wm2_6)
wineOption.addSeparator() wineOption.addSeparator()
settingRunV3Sh = wineOption.addMenu(transla.transe("U", "run_v3.sh 管理"))
w8 = QtWidgets.QAction(transla.transe("U", "设置 run_v3.sh 的文管为 Deepin 默认文管")) w8 = QtWidgets.QAction(transla.transe("U", "设置 run_v3.sh 的文管为 Deepin 默认文管"))
w9 = QtWidgets.QAction(transla.transe("U", "设置 run_v3.sh 的文管为 Wine 默认文管")) w9 = QtWidgets.QAction(transla.transe("U", "设置 run_v3.sh 的文管为 Wine 默认文管"))
w10 = QtWidgets.QAction(transla.transe("U", "重新安装 deepin-wine-helper")) w10 = QtWidgets.QAction(transla.transe("U", "重新安装 deepin-wine-helper"))
w11 = QtWidgets.QAction(transla.transe("U", "使用winetricks打开指定容器")) w11 = QtWidgets.QAction(transla.transe("U", "使用winetricks打开指定容器"))
wineOption.addAction(w8) settingRunV3Sh.addAction(w8)
wineOption.addAction(w9) settingRunV3Sh.addAction(w9)
wineOption.addAction(w10) settingRunV3Sh.addAction(w10)
wineOption.addSeparator() wineOption.addSeparator()
wineOption.addAction(w11) wineOption.addAction(w11)
wineOption.addSeparator() wineOption.addSeparator()
@ -2644,42 +2685,51 @@ optionCheckDemo.addAction(netIEDemo)
wineOption.addSeparator() wineOption.addSeparator()
wm3 = wineOption.addMenu(transla.transe("U", "启用/禁用功能")) wm3 = wineOption.addMenu(transla.transe("U", "启用/禁用功能"))
ed1 = wm3.addMenu(transla.transe("U", "启用/禁用 opengl")) ed1 = wm3.addMenu(transla.transe("U", "启用/禁用 opengl"))
wm3_1 = QtWidgets.QAction(transla.transe("U", "开启 opengl")) wm3_1 = QtWidgets.QAction(QtWidgets.QApplication.style().standardIcon(45), transla.transe("U", "开启 opengl"))
wm3_2 = QtWidgets.QAction(transla.transe("U", "禁用 opengl")) wm3_2 = QtWidgets.QAction(QtWidgets.QApplication.style().standardIcon(40), transla.transe("U", "禁用 opengl"))
ed1.addAction(wm3_1) ed1.addAction(wm3_1)
ed1.addAction(wm3_2) ed1.addAction(wm3_2)
ed2 = wm3.addMenu(transla.transe("U", "安装/卸载 winbind")) ed2 = wm3.addMenu(transla.transe("U", "安装/卸载 winbind"))
wm4_1 = QtWidgets.QAction(transla.transe("U", "安装 winbind")) wm4_1 = QtWidgets.QAction(QtWidgets.QApplication.style().standardIcon(45), transla.transe("U", "安装 winbind"))
wm4_2 = QtWidgets.QAction(transla.transe("U", "卸载 winbind")) wm4_2 = QtWidgets.QAction(QtWidgets.QApplication.style().standardIcon(40), transla.transe("U", "卸载 winbind"))
ed2.addAction(wm4_1) ed2.addAction(wm4_1)
ed2.addAction(wm4_2) ed2.addAction(wm4_2)
dxvkMenu = wm3.addMenu(transla.transe("U", "安装/卸载 DXVK")) dxvkMenu = wm3.addMenu(transla.transe("U", "安装/卸载 DXVK"))
installDxvk = QtWidgets.QAction(transla.transe("U", "安装 DXVK")) installDxvk = QtWidgets.QAction(QtWidgets.QApplication.style().standardIcon(45), transla.transe("U", "安装 DXVK"))
uninstallDxvk = QtWidgets.QAction(transla.transe("U", "卸载 DXVK")) uninstallDxvk = QtWidgets.QAction(QtWidgets.QApplication.style().standardIcon(40), transla.transe("U", "卸载 DXVK"))
dxvkMenu.addAction(installDxvk) dxvkMenu.addAction(installDxvk)
dxvkMenu.addAction(uninstallDxvk) dxvkMenu.addAction(uninstallDxvk)
vkd3dMenu = wm3.addMenu(transla.transe("U", "安装/卸载 Vkd3d"))
installvkd3d = QtWidgets.QAction(QtWidgets.QApplication.style().standardIcon(45), transla.transe("U", "安装 Vkd3d"))
uninstallvkd3d = QtWidgets.QAction(QtWidgets.QApplication.style().standardIcon(40), transla.transe("U", "卸载 Vkd3d"))
vkd3dMenu.addAction(installvkd3d)
vkd3dMenu.addAction(uninstallvkd3d)
wineOption.addSeparator() wineOption.addSeparator()
wineOption.addAction(deletePartIcon)
wineOption.addAction(deleteDesktopIcon) wineOption.addAction(deleteDesktopIcon)
wineOption.addSeparator() wineOption.addSeparator()
settingWineBottleCreateLink = wineOption.addMenu(transla.transe("U", "允许/禁止指定 wine 容器生成快捷方式")) settingWineBottleCreateLink = wm3.addMenu(transla.transe("U", "启用/禁止指定 wine 容器生成快捷方式"))
enabledWineBottleCreateLink = QtWidgets.QAction(transla.transe("U", "允许指定 wine 容器生成快捷方式")) enabledWineBottleCreateLink = QtWidgets.QAction(QtWidgets.QApplication.style().standardIcon(45), transla.transe("U", "允许指定 wine 容器生成快捷方式"))
disbledWineBottleCreateLink = QtWidgets.QAction(transla.transe("U", "禁止指定 wine 容器生成快捷方式")) disbledWineBottleCreateLink = QtWidgets.QAction(QtWidgets.QApplication.style().standardIcon(40), transla.transe("U", "禁止指定 wine 容器生成快捷方式"))
settingWineBottleCreateLink.addAction(enabledWineBottleCreateLink) settingWineBottleCreateLink.addAction(enabledWineBottleCreateLink)
settingWineBottleCreateLink.addAction(disbledWineBottleCreateLink) settingWineBottleCreateLink.addAction(disbledWineBottleCreateLink)
settingWineCrashDialog = wineOption.addMenu(transla.transe("U", "启用/禁用指定 wine 容器崩溃提示窗口")) settingWineCrashDialog = wm3.addMenu(transla.transe("U", "启用/禁用指定 wine 容器崩溃提示窗口"))
disbledWineCrashDialog = QtWidgets.QAction(transla.transe("U", "禁用指定 wine 容器崩溃提示窗口")) disbledWineCrashDialog = QtWidgets.QAction(QtWidgets.QApplication.style().standardIcon(40), transla.transe("U", "禁用指定 wine 容器崩溃提示窗口"))
enabledWineCrashDialog = QtWidgets.QAction(transla.transe("U", "启用指定 wine 容器崩溃提示窗口")) enabledWineCrashDialog = QtWidgets.QAction(QtWidgets.QApplication.style().standardIcon(45), transla.transe("U", "启用指定 wine 容器崩溃提示窗口"))
settingWineCrashDialog.addAction(disbledWineCrashDialog)
settingWineCrashDialog.addAction(enabledWineCrashDialog) settingWineCrashDialog.addAction(enabledWineCrashDialog)
settingWineCrashDialog.addAction(disbledWineCrashDialog)
settingOpenProgram = wm3.addMenu(transla.transe("U", "启用/禁止指定 wine 容器创建文件关联"))
enabledOpenProgram = QtWidgets.QAction(QtWidgets.QApplication.style().standardIcon(45), transla.transe("U", "允许指定 wine 容器创建文件关联"))
disbledOpenProgram = QtWidgets.QAction(QtWidgets.QApplication.style().standardIcon(40), transla.transe("U", "禁止指定 wine 容器创建文件关联"))
settingOpenProgram.addAction(enabledOpenProgram)
settingOpenProgram.addAction(disbledOpenProgram)
settingHttpProxy = wineOption.addMenu(transla.transe("U", "设置指定 Wine 容器代理")) settingHttpProxy = wineOption.addMenu(transla.transe("U", "设置指定 Wine 容器代理"))
enabledHttpProxy = QtWidgets.QAction(transla.transe("U", "设置指定 wine 容器的代理")) enabledHttpProxy = QtWidgets.QAction(transla.transe("U", "设置指定 wine 容器的代理"))
disbledHttpProxy = QtWidgets.QAction(transla.transe("U", "禁用指定 wine 容器的代理")) disbledHttpProxy = QtWidgets.QAction(QtWidgets.QApplication.style().standardIcon(40), transla.transe("U", "禁用指定 wine 容器的代理"))
settingHttpProxy.addAction(enabledHttpProxy) settingHttpProxy.addAction(enabledHttpProxy)
settingHttpProxy.addAction(disbledHttpProxy) settingHttpProxy.addAction(disbledHttpProxy)
dllOver = wineOption.addMenu(transla.transe("U", "函数顶替库列表")) dllOver = wineOption.addMenu(transla.transe("U", "函数顶替库列表"))
saveDllOver = QtWidgets.QAction(transla.transe("U", "导出函数顶替列表")) saveDllOver = QtWidgets.QAction(QtWidgets.QApplication.style().standardIcon(43), transla.transe("U", "导出函数顶替列表"))
addDllOver = QtWidgets.QAction(transla.transe("U", "导入函数顶替列表")) addDllOver = QtWidgets.QAction(QtWidgets.QApplication.style().standardIcon(32), transla.transe("U", "导入函数顶替列表"))
editDllOver = QtWidgets.QAction(transla.transe("U", "编辑函数顶替库列表")) editDllOver = QtWidgets.QAction(transla.transe("U", "编辑函数顶替库列表"))
dllOver.addAction(saveDllOver) dllOver.addAction(saveDllOver)
dllOver.addAction(addDllOver) dllOver.addAction(addDllOver)
@ -2719,12 +2769,16 @@ wm4_1.triggered.connect(lambda: os.system(f"'{programPath}/launch.sh' deepin-ter
wm4_2.triggered.connect(lambda: os.system(f"'{programPath}/launch.sh' deepin-terminal -C 'pkexec apt purge winbind -y' --keep-open")) wm4_2.triggered.connect(lambda: os.system(f"'{programPath}/launch.sh' deepin-terminal -C 'pkexec apt purge winbind -y' --keep-open"))
installDxvk.triggered.connect(InstallDXVK) installDxvk.triggered.connect(InstallDXVK)
uninstallDxvk.triggered.connect(UninstallDXVK) uninstallDxvk.triggered.connect(UninstallDXVK)
installvkd3d.triggered.connect(InstallVkd3d)
uninstallvkd3d.triggered.connect(UninstallVkd3d)
deletePartIcon.triggered.connect(lambda: threading.Thread(target=os.system, args=[f"python3 '{programPath}/BuildDesktop.py'"]).start()) deletePartIcon.triggered.connect(lambda: threading.Thread(target=os.system, args=[f"python3 '{programPath}/BuildDesktop.py'"]).start())
deleteDesktopIcon.triggered.connect(DeleteDesktopIcon) deleteDesktopIcon.triggered.connect(DeleteDesktopIcon)
enabledWineBottleCreateLink.triggered.connect(lambda: RunWineProgram("reg' delete 'HKEY_CURRENT_USER\Software\Wine\DllOverrides' /v winemenubuilder.exe '/f")) enabledWineBottleCreateLink.triggered.connect(lambda: RunWineProgram("reg' delete 'HKEY_CURRENT_USER\Software\Wine\DllOverrides' /v winemenubuilder.exe '/f"))
disbledWineBottleCreateLink.triggered.connect(lambda: RunWineProgram("reg' add 'HKEY_CURRENT_USER\Software\Wine\DllOverrides' /v winemenubuilder.exe '/f")) disbledWineBottleCreateLink.triggered.connect(lambda: RunWineProgram("reg' add 'HKEY_CURRENT_USER\Software\Wine\DllOverrides' /v winemenubuilder.exe '/f"))
disbledWineCrashDialog.triggered.connect(lambda: RunWineProgram("reg' add 'HKEY_CURRENT_USER\Software\Wine\WineDbg' /v ShowCrashDialog /t REG_DWORD /d 00000000 '/f")) disbledWineCrashDialog.triggered.connect(lambda: RunWineProgram("reg' add 'HKEY_CURRENT_USER\Software\Wine\WineDbg' /v ShowCrashDialog /t REG_DWORD /d 00000000 '/f"))
enabledWineCrashDialog.triggered.connect(lambda: RunWineProgram("reg' add 'HKEY_CURRENT_USER\Software\Wine\WineDbg' /v ShowCrashDialog /t REG_DWORD /d 00000001 '/f")) enabledWineCrashDialog.triggered.connect(lambda: RunWineProgram("reg' add 'HKEY_CURRENT_USER\Software\Wine\WineDbg' /v ShowCrashDialog /t REG_DWORD /d 00000001 '/f"))
disbledOpenProgram.triggered.connect(lambda: RunWineProgram("reg' add 'HKEY_CURRENT_USER\Software\Wine\FileOpenAssociations' /v Enable /d N '/f"))
enabledOpenProgram.triggered.connect(lambda: RunWineProgram("reg' add 'HKEY_CURRENT_USER\Software\Wine\FileOpenAssociations' /v Enable /d Y '/f"))
enabledHttpProxy.triggered.connect(SetHttpProxy) enabledHttpProxy.triggered.connect(SetHttpProxy)
disbledHttpProxy.triggered.connect(DisbledHttpProxy) disbledHttpProxy.triggered.connect(DisbledHttpProxy)
saveDllOver.triggered.connect(SaveDllList) saveDllOver.triggered.connect(SaveDllList)
@ -2740,11 +2794,11 @@ virtualMachine.addAction(v1)
v1.triggered.connect(RunVM) v1.triggered.connect(RunVM)
checkValue = menu.addMenu(transla.transe("U", "校验值计算(&S)")) checkValue = menu.addMenu(transla.transe("U", "校验值计算(&S)"))
md5Value = QtWidgets.QAction(transla.transe("U", "MD5(&M)")) md5Value = QtWidgets.QAction(QtWidgets.QApplication.style().standardIcon(32), transla.transe("U", "MD5(&M)"))
sha1Value = QtWidgets.QAction(transla.transe("U", "SHA1(&M)")) sha1Value = QtWidgets.QAction(QtWidgets.QApplication.style().standardIcon(32), transla.transe("U", "SHA1(&M)"))
base64Value = QtWidgets.QAction(transla.transe("U", "Base64(建议小文件)(&B)")) base64Value = QtWidgets.QAction(QtWidgets.QApplication.style().standardIcon(32), transla.transe("U", "Base64(建议小文件)(&B)"))
sha256Value = QtWidgets.QAction(transla.transe("U", "SHA256(&S)")) sha256Value = QtWidgets.QAction(QtWidgets.QApplication.style().standardIcon(32), transla.transe("U", "SHA256(&S)"))
sha512Value = QtWidgets.QAction(transla.transe("U", "SHA512(&S)")) sha512Value = QtWidgets.QAction(QtWidgets.QApplication.style().standardIcon(32), transla.transe("U", "SHA512(&S)"))
md5Value.triggered.connect(lambda: ValueCheck().Get("MD5")) md5Value.triggered.connect(lambda: ValueCheck().Get("MD5"))
sha1Value.triggered.connect(lambda: ValueCheck().Get("SHA1")) sha1Value.triggered.connect(lambda: ValueCheck().Get("SHA1"))
base64Value.triggered.connect(lambda: ValueCheck().Get("BASE64")) base64Value.triggered.connect(lambda: ValueCheck().Get("BASE64"))
@ -2758,9 +2812,9 @@ checkValue.addAction(sha512Value)
safeWebsize = menu.addMenu(transla.transe("U", "云沙箱(&C)")) safeWebsize = menu.addMenu(transla.transe("U", "云沙箱(&C)"))
s1 = QtWidgets.QAction(transla.transe("U", "360 沙箱云")) s1 = QtWidgets.QAction(QtWidgets.QApplication.style().standardIcon(9), transla.transe("U", "360 沙箱云"))
s2 = QtWidgets.QAction(transla.transe("U", "微步云沙箱")) s2 = QtWidgets.QAction(QtWidgets.QApplication.style().standardIcon(9), transla.transe("U", "微步云沙箱"))
s3 = QtWidgets.QAction(transla.transe("U", "VIRUSTOTAL")) s3 = QtWidgets.QAction(QtWidgets.QApplication.style().standardIcon(9), transla.transe("U", "VIRUSTOTAL"))
safeWebsize.addAction(s1) safeWebsize.addAction(s1)
safeWebsize.addAction(s2) safeWebsize.addAction(s2)
safeWebsize.addAction(s3) safeWebsize.addAction(s3)
@ -2771,7 +2825,7 @@ s3.triggered.connect(lambda: webbrowser.open_new_tab("https://www.virustotal.com
log = menu.addMenu(transla.transe("U", "日志(&L)")) log = menu.addMenu(transla.transe("U", "日志(&L)"))
getDllInfo = QtWidgets.QAction(transla.transe("U", "查询 Dll")) getDllInfo = QtWidgets.QAction(transla.transe("U", "查询 Dll"))
checkLogText = QtWidgets.QAction(transla.transe("U", "日志分析")) checkLogText = QtWidgets.QAction(transla.transe("U", "日志分析"))
saveLogText = QtWidgets.QAction(transla.transe("U", "另存为日志")) saveLogText = QtWidgets.QAction(QtWidgets.QApplication.style().standardIcon(16), transla.transe("U", "另存为日志"))
transLogText = QtWidgets.QAction(transla.transe("U", "翻译日志(翻译后日志分析功能会故障)")) transLogText = QtWidgets.QAction(transla.transe("U", "翻译日志(翻译后日志分析功能会故障)"))
uploadLogText = QtWidgets.QAction(transla.transe("U", "上传日志")) uploadLogText = QtWidgets.QAction(transla.transe("U", "上传日志"))
getDllInfo.triggered.connect(DllWindow.ShowWindow) getDllInfo.triggered.connect(DllWindow.ShowWindow)
@ -2786,35 +2840,35 @@ log.addAction(transLogText)
log.addAction(uploadLogText) log.addAction(uploadLogText)
qemuMenu = menu.addMenu(transla.transe("U", "容器(&C)")) qemuMenu = menu.addMenu(transla.transe("U", "容器(&C)"))
unpackDeb = QtWidgets.QAction(transla.transe("U", "解包 deb 提取容器")) unpackDeb = QtWidgets.QAction(QtWidgets.QApplication.style().standardIcon(32), transla.transe("U", "解包 deb 提取容器"))
qemuMenu.addAction(unpackDeb) qemuMenu.addAction(unpackDeb)
unpackDeb.triggered.connect(UnPackage) unpackDeb.triggered.connect(UnPackage)
if len(qemuBottleList) >= 1: if len(qemuBottleList) >= 1:
configMenu = QtWidgets.QAction(transla.transe("U", "配置指定 Chroot 容器")) configMenu = QtWidgets.QAction(QtGui.QIcon(f"{programPath}/Icon/Function/CHROOT.png"), transla.transe("U", "配置指定 Chroot 容器"))
qemuMenu.addAction(configMenu) qemuMenu.addAction(configMenu)
configMenu.triggered.connect(ConfigQemu) configMenu.triggered.connect(ConfigQemu)
print(qemuBottleList) print(qemuBottleList)
help = menu.addMenu(transla.transe("U", "帮助(&H)")) help = menu.addMenu(transla.transe("U", "帮助(&H)"))
runStatusWebSize = QtWidgets.QAction(transla.transe("U", "查询程序在 Wine 的运行情况")) runStatusWebSize = QtWidgets.QAction(QtWidgets.QApplication.style().standardIcon(20), transla.transe("U", "查询程序在 Wine 的运行情况"))
h1 = help.addMenu(transla.transe("U", "程序官网")) h1 = help.addMenu(QtWidgets.QApplication.style().standardIcon(20), transla.transe("U", "程序官网"))
h2 = QtWidgets.QAction(transla.transe("U", "小提示")) h2 = QtWidgets.QAction(transla.transe("U", "小提示"))
wineRunnerHelp = QtWidgets.QAction(transla.transe("U", "Wine运行器和Wine打包器傻瓜式使用教程小白专用 By 鹤舞白沙")) wineRunnerHelp = QtWidgets.QAction(QtWidgets.QApplication.style().standardIcon(20), transla.transe("U", "Wine运行器和Wine打包器傻瓜式使用教程小白专用 By 鹤舞白沙"))
h3 = QtWidgets.QAction(transla.transe("U", "更新内容")) h3 = QtWidgets.QAction(transla.transe("U", "更新内容"))
h4 = QtWidgets.QAction(transla.transe("U", "谢明名单")) h4 = QtWidgets.QAction(transla.transe("U", "谢明名单"))
h5 = QtWidgets.QAction(transla.transe("U", "更新这个程序")) h5 = QtWidgets.QAction(transla.transe("U", "更新这个程序"))
programInformation = QtWidgets.QAction(transla.transe("U", "获取程序公告")) programInformation = QtWidgets.QAction(transla.transe("U", "获取程序公告"))
h6 = QtWidgets.QAction(transla.transe("U", "反馈这个程序的建议和问题")) h6 = QtWidgets.QAction(transla.transe("U", "反馈这个程序的建议和问题"))
fenUpload = QtWidgets.QAction(transla.transe("U", "程序评分")) fenUpload = QtWidgets.QAction(transla.transe("U", "程序评分"))
h7 = QtWidgets.QAction(transla.transe("U", "关于这个程序")) h7 = QtWidgets.QAction(QtWidgets.QApplication.style().standardIcon(9), transla.transe("U", "关于这个程序"))
h8 = QtWidgets.QAction(transla.transe("U", "关于 Qt")) h8 = QtWidgets.QAction(QtWidgets.QApplication.style().standardIcon(9), transla.transe("U", "关于 Qt"))
gfdgdxiio = QtWidgets.QAction(transla.transe("U", "作者个人站")) gfdgdxiio = QtWidgets.QAction(QtWidgets.QApplication.style().standardIcon(20), transla.transe("U", "作者个人站"))
forumWebsize = QtWidgets.QAction(transla.transe("U", "程序论坛")) forumWebsize = QtWidgets.QAction(QtWidgets.QApplication.style().standardIcon(20), transla.transe("U", "程序论坛"))
gitee = QtWidgets.QAction(transla.transe("U", "Gitee")) gitee = QtWidgets.QAction(QtWidgets.QApplication.style().standardIcon(20), transla.transe("U", "Gitee"))
github = QtWidgets.QAction(transla.transe("U", "Github")) github = QtWidgets.QAction(QtWidgets.QApplication.style().standardIcon(20), transla.transe("U", "Github"))
gitlink = QtWidgets.QAction(transla.transe("U", "Gitlink")) gitlink = QtWidgets.QAction(QtWidgets.QApplication.style().standardIcon(20), transla.transe("U", "Gitlink"))
gitlab = QtWidgets.QAction(transla.transe("U", "Gitlab")) gitlab = QtWidgets.QAction(QtWidgets.QApplication.style().standardIcon(20), transla.transe("U", "Gitlab"))
jihu = QtWidgets.QAction(transla.transe("U", "极狐")) jihu = QtWidgets.QAction(QtWidgets.QApplication.style().standardIcon(20), transla.transe("U", "极狐"))
h1.addAction(gfdgdxiio) h1.addAction(gfdgdxiio)
h1.addAction(gitee) h1.addAction(gitee)
h1.addAction(github) h1.addAction(github)
@ -2830,11 +2884,11 @@ help.addAction(h2)
help.addAction(h3) help.addAction(h3)
help.addAction(h4) help.addAction(h4)
help.addSeparator() help.addSeparator()
wikiHelp = QtWidgets.QAction(transla.transe("U", "程序 Wiki")) wikiHelp = QtWidgets.QAction(QtWidgets.QApplication.style().standardIcon(20), transla.transe("U", "程序 Wiki"))
help.addAction(wikiHelp) help.addAction(wikiHelp)
videoHelp = help.addMenu(transla.transe("U", "视频教程")) videoHelp = help.addMenu(QtWidgets.QApplication.style().standardIcon(20), transla.transe("U", "视频教程"))
easyHelp = QtWidgets.QAction(transla.transe("U", "简易使用教程")) easyHelp = QtWidgets.QAction(QtWidgets.QApplication.style().standardIcon(20), transla.transe("U", "简易使用教程"))
buildHelp = QtWidgets.QAction(transla.transe("U", "打包教程")) buildHelp = QtWidgets.QAction(QtWidgets.QApplication.style().standardIcon(20), transla.transe("U", "打包教程"))
videoHelp.addAction(easyHelp) videoHelp.addAction(easyHelp)
videoHelp.addAction(buildHelp) videoHelp.addAction(buildHelp)
help.addSeparator() help.addSeparator()

View File

@ -1,11 +1,12 @@
{ {
"Version": "2.6.0", "Version": "3.0.0",
"Thank": [ "Thank": [
"感谢 @豪 提供程序图标",
"感谢 @鹤舞白沙 对程序文案进行优化以及编写《Wine运行器和Wine打包器傻瓜式使用教程小白专用 》", "感谢 @鹤舞白沙 对程序文案进行优化以及编写《Wine运行器和Wine打包器傻瓜式使用教程小白专用 》",
"感谢 @璀璨星空 提供的彩蛋图标", "感谢 @璀璨星空 提供的彩蛋图标",
"感谢 @Bail 反馈的更新策略问题", "感谢 @Bail 反馈的更新策略问题",
"感谢 @白水 反馈的安装 exagear 后无法识别和调用 box86 的问题", "感谢 @白水 反馈的安装 exagear 后无法识别和调用 box86 的问题",
"感谢 @汐光. 提供的建议", "感谢 @汐光. 提供的翻译接口",
"感谢 @鹤舞白沙 专门为小白用户编写的使用 Wine 运行器非基于生态适配脚本的程序打包教程", "感谢 @鹤舞白沙 专门为小白用户编写的使用 Wine 运行器非基于生态适配脚本的程序打包教程",
"感谢 @牦牛儿苗 进行了龙芯 3a5000 平台的测试与移植", "感谢 @牦牛儿苗 进行了龙芯 3a5000 平台的测试与移植",
"感谢 @雁舞白沙 优化了程序文案", "感谢 @雁舞白沙 优化了程序文案",

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

Binary file not shown.

View File

@ -1,11 +1,12 @@
{ {
"Version": "2.6.0", "Version": "3.0.0",
"Thank": [ "Thank": [
"感谢 @豪 提供程序图标",
"感谢 @鹤舞白沙 对程序文案进行优化以及编写《Wine运行器和Wine打包器傻瓜式使用教程小白专用 》", "感谢 @鹤舞白沙 对程序文案进行优化以及编写《Wine运行器和Wine打包器傻瓜式使用教程小白专用 》",
"感谢 @璀璨星空 提供的彩蛋图标", "感谢 @璀璨星空 提供的彩蛋图标",
"感谢 @Bail 反馈的更新策略问题", "感谢 @Bail 反馈的更新策略问题",
"感谢 @白水 反馈的安装 exagear 后无法识别和调用 box86 的问题", "感谢 @白水 反馈的安装 exagear 后无法识别和调用 box86 的问题",
"感谢 @汐光. 提供的建议", "感谢 @汐光. 提供的翻译接口",
"感谢 @鹤舞白沙 专门为小白用户编写的使用 Wine 运行器非基于生态适配脚本的程序打包教程", "感谢 @鹤舞白沙 专门为小白用户编写的使用 Wine 运行器非基于生态适配脚本的程序打包教程",
"感谢 @牦牛儿苗 进行了龙芯 3a5000 平台的测试与移植", "感谢 @牦牛儿苗 进行了龙芯 3a5000 平台的测试与移植",
"感谢 @雁舞白沙 优化了程序文案", "感谢 @雁舞白沙 优化了程序文案",

Binary file not shown.

View File

@ -1,3 +1,3 @@
{ {
"Version": "2.5.0" "Version": "3.0.0"
} }

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long