mirror of
https://gitee.com/gfdgd-xi/deep-wine-runner
synced 2025-12-14 19:12:04 +08:00
will
This commit is contained in:
BIN
deb/opt/apps/deepin-wine-runner/Icon/Function/CHROOT.png
Executable file
BIN
deb/opt/apps/deepin-wine-runner/Icon/Function/CHROOT.png
Executable file
Binary file not shown.
|
After Width: | Height: | Size: 22 KiB |
BIN
deb/opt/apps/deepin-wine-runner/Icon/Function/more-wine.png
Executable file
BIN
deb/opt/apps/deepin-wine-runner/Icon/Function/more-wine.png
Executable file
Binary file not shown.
|
After Width: | Height: | Size: 62 KiB |
BIN
deb/opt/apps/deepin-wine-runner/Icon/Function/wine.png
Executable file
BIN
deb/opt/apps/deepin-wine-runner/Icon/Function/wine.png
Executable file
Binary file not shown.
|
After Width: | Height: | Size: 67 KiB |
BIN
deb/opt/apps/deepin-wine-runner/Icon/Function/wine23A.png
Executable file
BIN
deb/opt/apps/deepin-wine-runner/Icon/Function/wine23A.png
Executable file
Binary file not shown.
|
After Width: | Height: | Size: 75 KiB |
BIN
deb/opt/apps/deepin-wine-runner/Icon/Function/wine23P.png
Executable file
BIN
deb/opt/apps/deepin-wine-runner/Icon/Function/wine23P.png
Executable file
Binary file not shown.
|
After Width: | Height: | Size: 75 KiB |
@@ -41,4 +41,4 @@ else
|
||||
fi
|
||||
|
||||
# 如果参数 3 存在
|
||||
chroot "--userspec=$2:$2" . env "HOME=/home/$2" "${@:3}"
|
||||
chroot "--userspec=$2:$2" . env "HOME=/home/$2" ${@:3}
|
||||
|
||||
29
deb/opt/apps/deepin-wine-runner/MountWithoutHome.sh
Executable file
29
deb/opt/apps/deepin-wine-runner/MountWithoutHome.sh
Executable 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}
|
||||
@@ -17,7 +17,7 @@ if __name__ == "__main__":
|
||||
exit()
|
||||
commandList = ""
|
||||
userName = getpass.getuser()
|
||||
for i in sys.argv[2:]:
|
||||
for i in sys.argv[3:]:
|
||||
commandList += f"'{i}' "
|
||||
if commandList.replace(" ", "") == "":
|
||||
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"):
|
||||
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}"))
|
||||
|
||||
@@ -471,7 +471,7 @@ def ConfigQemu():
|
||||
choose = QtWidgets.QInputDialog.getItem(window, "提示", "选择需要 Chroot 到里面的容器", lists, 0, False)
|
||||
if not choose[1]:
|
||||
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)
|
||||
|
||||
# 生成 desktop 文件在桌面
|
||||
@@ -890,7 +890,31 @@ def InstallDXVK():
|
||||
wineBottonPath = setting["DefultBotton"]
|
||||
else:
|
||||
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.startDetached(f"{programPath}/launch.sh", ["deepin-terminal", "-e",
|
||||
#"env", f"WINE={wine[o1.currentText()]}", f"WINE64={wine[o1.currentText()]}", f"WINEPREFIX={wineBottonPath}", "bash",
|
||||
@@ -1607,6 +1631,7 @@ class ProgramSetting():
|
||||
runtimeCache = None
|
||||
buildByBottleName = None
|
||||
autoPath = None
|
||||
qemuUnmountHome = None
|
||||
def ShowWindow():
|
||||
ProgramSetting.message = QtWidgets.QMainWindow()
|
||||
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", "图标生成:")), 10, 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.wineDebug = QtWidgets.QCheckBox(transla.transe("U", "开启 DEBUG 输出"))
|
||||
ProgramSetting.defultWine = QtWidgets.QComboBox()
|
||||
@@ -1642,7 +1668,8 @@ class ProgramSetting():
|
||||
ProgramSetting.autoWine = QtWidgets.QCheckBox(transla.transe("U", "不显示未检测到的 Wine"))
|
||||
ProgramSetting.runtimeCache = 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.setCurrentText(setting["Architecture"])
|
||||
ProgramSetting.wineDebug.setChecked(setting["Debug"])
|
||||
@@ -1656,6 +1683,8 @@ class ProgramSetting():
|
||||
ProgramSetting.runtimeCache.setChecked(setting["RuntimeCache"])
|
||||
ProgramSetting.buildByBottleName.setChecked(setting["BuildByBottleName"])
|
||||
ProgramSetting.autoPath.setChecked(setting["AutoPath"])
|
||||
ProgramSetting.qemuUnmountHome.setChecked(setting["QemuUnMountHome"])
|
||||
# QemuUnMountHome
|
||||
widgetLayout.addWidget(ProgramSetting.wineBottonA, 0, 1, 1, 1)
|
||||
widgetLayout.addWidget(ProgramSetting.wineDebug, 1, 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.buildByBottleName, 10, 1, 1, 1)
|
||||
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)
|
||||
ProgramSetting.message.setCentralWidget(widget)
|
||||
ProgramSetting.message.setWindowIcon(QtGui.QIcon(iconPath))
|
||||
@@ -1700,6 +1730,7 @@ class ProgramSetting():
|
||||
setting["RuntimeCache"] = ProgramSetting.runtimeCache.isChecked()
|
||||
setting["BuildByBottleName"] = ProgramSetting.buildByBottleName.isChecked()
|
||||
setting["AutoPath"] = ProgramSetting.autoPath.isChecked()
|
||||
setting["QemuUnMountHome"] = ProgramSetting.qemuUnmountHome.isChecked()
|
||||
try:
|
||||
write_txt(get_home() + "/.config/deepin-wine-runner/WineSetting.json", json.dumps(setting))
|
||||
except:
|
||||
@@ -1864,207 +1895,6 @@ def GetNewInformation():
|
||||
webInformation.resize(int(webInformation.frameGeometry().width() * 1.3), int(webInformation.frameGeometry().height() * 1.1))
|
||||
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):
|
||||
"""get size for file or folder"""
|
||||
totalSize = 0
|
||||
@@ -2192,15 +2022,15 @@ def GetVersion():
|
||||
|
||||
def UnPackage():
|
||||
QtWidgets.QMessageBox.information(window, "提示", "请在下面两个对话框中选择 deb 包所在路径和容器解压到的路径")
|
||||
debPath = QtWidgets.QFileDialog.getOpenFileName(window)
|
||||
debPath = QtWidgets.QFileDialog.getOpenFileName(window, get_home(), "deb 文件(*.deb);;所有文件(*.*)")
|
||||
if not debPath[1]:
|
||||
return
|
||||
path = QtWidgets.QFileDialog.getExistingDirectory(window)
|
||||
path = QtWidgets.QFileDialog.getExistingDirectory(window, get_home())
|
||||
print(path)
|
||||
if not path[1]:
|
||||
if not path:
|
||||
return
|
||||
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, "错误", "解压失败!")
|
||||
return
|
||||
zippath = FindFile(tempDebDir, "files.7z")
|
||||
@@ -2209,8 +2039,10 @@ def UnPackage():
|
||||
return
|
||||
print(path)
|
||||
# 解压文件
|
||||
os.system(f"mkdir -p '{path[0]}'")
|
||||
os.system(f"7z x '{zippath}' -o'{path[0]}'")
|
||||
os.system(f"mkdir -p '{path}'")
|
||||
os.system(f"7z x -y '{zippath}' -o'{path}'")
|
||||
os.system(f"rm -rfv '{tempDebDir}'")
|
||||
QtWidgets.QMessageBox.information(window, "提示", "解压完成!")
|
||||
|
||||
def FindFile(file, name):
|
||||
for i in os.listdir(file):
|
||||
@@ -2259,6 +2091,208 @@ def TransLog():
|
||||
#return transText
|
||||
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
|
||||
|
||||
programVersionType = ""
|
||||
@@ -2299,20 +2333,25 @@ exe路径\' 参数 \'
|
||||
updateThingsString = transla.transe("U", '''※1、支持使用 Qemu + Chroot 跨运行 Wine 以及指定程序的功能;
|
||||
※2、提供了简易打包器以用于打包简易 deb;
|
||||
※3、支持下载配置过的 Qemu + Chroot 容器;
|
||||
※4、支持解压指定 deb 的内打包好的容器;
|
||||
※5、优化 Wine 列表显示;
|
||||
※6、新增程序论坛和教程入口;
|
||||
※7、程序公告功能;
|
||||
※8、新增程序评分功能;
|
||||
9、优化非基于生态适配脚本的打包器内容自动填充功能;
|
||||
10、优化程序文案;
|
||||
11、新增日志翻译功能;
|
||||
12、程序进一步完善英语翻译(机翻);
|
||||
13、优化程序更新策略;
|
||||
14、优化日志分析功能。''')
|
||||
※4、支持在隔离的 Chroot 容器内运行 Wine;
|
||||
※5、支持解压指定 deb 的内打包好的容器;
|
||||
※6、优化 Wine 列表显示;
|
||||
※7、新增程序论坛和教程入口;
|
||||
※8、程序公告功能;
|
||||
※9、新增程序评分功能;
|
||||
※10、新增解包 deb 内 Wine 容器功能;
|
||||
※11、新增 Vkd3d Proton 安装功能,更新 dxvk 版本至 2.0.0;
|
||||
※12、新增程序菜单栏部分栏目图标;
|
||||
13、优化非基于生态适配脚本的打包器内容自动填充功能;
|
||||
14、优化程序文案;
|
||||
15、新增日志翻译功能;
|
||||
16、程序进一步完善英语翻译(机翻);
|
||||
17、优化程序更新策略;
|
||||
18、优化日志分析功能;
|
||||
19、优化程序 UI。''')
|
||||
for i in information["Thank"]:
|
||||
thankText += f"{i}\n"
|
||||
updateTime = "2022年12月07日"
|
||||
updateTime = "2022年12月08日"
|
||||
aboutProgram = transla.transe("U", """<p>Wine运行器是一个能让Linux用户更加方便地运行Windows应用的程序,内置了对Wine图形化的支持、各种Wine工具、自制的Wine程序打包器和运行库安装工具等。</p>
|
||||
<p>它同时还内置了基于VirtualBox制作的、专供小白使用的Windows虚拟机安装工具,可以做到只需下载系统镜像并点击安装即可,无需考虑虚拟机的安装、创建、分区等操作。</p>
|
||||
<pre>
|
||||
@@ -2464,7 +2503,7 @@ getLoseDll = QtWidgets.QPushButton(transla.transe("U", "检测静态下程序缺
|
||||
getLoseDll.clicked.connect(GetLoseDll)
|
||||
programManager.addWidget(QtWidgets.QLabel(" "*5), 1, 9, 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)
|
||||
wineConfig = QtWidgets.QPushButton(transla.transe("U", "配置容器"))
|
||||
wineConfig.clicked.connect(lambda: RunWineProgram("winecfg"))
|
||||
@@ -2526,16 +2565,16 @@ mainLayout.addWidget(programRun, 2, 1, 1, 1)
|
||||
# 菜单栏
|
||||
menu = window.menuBar()
|
||||
programmenu = menu.addMenu(transla.transe("U", "程序(&P)"))
|
||||
p1 = QtWidgets.QAction(transla.transe("U", "安装 wine(&I)"))
|
||||
installWineOnDeepin23 = QtWidgets.QAction(transla.transe("U", "安装 wine(只限Deepin23 Preview)"))
|
||||
installWineOnDeepin23Alpha = QtWidgets.QAction(transla.transe("U", "安装 wine(只限Deepin23 Alpha)"))
|
||||
installWineHQ = QtWidgets.QAction(transla.transe("U", "安装 WineHQ"))
|
||||
installMoreWine = QtWidgets.QAction(transla.transe("U", "安装更多 Wine"))
|
||||
downloadChrootBottle = QtWidgets.QAction(transla.transe("U", "下载 Chroot 容器"))
|
||||
p1 = QtWidgets.QAction(QtGui.QIcon(f"{programPath}/Icon/Function/wine.png"), transla.transe("U", "安装 wine(&I)"))
|
||||
installWineOnDeepin23 = QtWidgets.QAction(QtGui.QIcon(f"{programPath}/Icon/Function/wine23P.png"), transla.transe("U", "安装 wine(只限Deepin23 Preview)"))
|
||||
installWineOnDeepin23Alpha = QtWidgets.QAction(QtGui.QIcon(f"{programPath}/Icon/Function/wine23A.png"), transla.transe("U", "安装 wine(只限Deepin23 Alpha)"))
|
||||
installWineHQ = QtWidgets.QAction(QtGui.QIcon(f"{programPath}/Icon/Function/wine.png"), transla.transe("U", "安装 WineHQ"))
|
||||
installMoreWine = QtWidgets.QAction(QtGui.QIcon(f"{programPath}/Icon/Function/more-wine.png"), transla.transe("U", "安装更多 Wine"))
|
||||
downloadChrootBottle = QtWidgets.QAction(QtGui.QIcon(f"{programPath}/Icon/Function/CHROOT.png"), transla.transe("U", "下载 Chroot 容器"))
|
||||
p2 = QtWidgets.QAction(transla.transe("U", "设置程序(&S)"))
|
||||
p3 = QtWidgets.QAction(transla.transe("U", "清空软件历史记录(&C)"))
|
||||
cleanCache = QtWidgets.QAction(transla.transe("U", "清空软件缓存"))
|
||||
cleanProgramUnuse = QtWidgets.QAction(transla.transe("U", "删除程序组件"))
|
||||
p3 = QtWidgets.QAction(QtWidgets.QApplication.style().standardIcon(47), transla.transe("U", "清空软件历史记录(&C)"))
|
||||
cleanCache = QtWidgets.QAction(QtWidgets.QApplication.style().standardIcon(47), transla.transe("U", "清空软件缓存"))
|
||||
cleanProgramUnuse = QtWidgets.QAction(QtWidgets.QApplication.style().standardIcon(47), transla.transe("U", "删除程序组件"))
|
||||
p4 = QtWidgets.QAction(transla.transe("U", "退出程序(&E)"))
|
||||
programmenu.addAction(p1)
|
||||
programmenu.addAction(installWineOnDeepin23)
|
||||
@@ -2576,7 +2615,7 @@ easyPackager = QtWidgets.QAction(transla.transe("U", "使用简易打包器进
|
||||
getDllOnInternet = QtWidgets.QAction(transla.transe("U", "从互联网获取DLL"))
|
||||
w7 = QtWidgets.QAction(transla.transe("U", "从镜像获取DLL(只支持官方安装镜像,DOS内核如 Windows 95 暂不支持)"))
|
||||
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 程序在启动器的快捷方式"))
|
||||
wineOption.addAction(w1)
|
||||
wineOption.addAction(w2)
|
||||
@@ -2587,6 +2626,7 @@ wineOption.addSeparator()
|
||||
wineOption.addAction(w5)
|
||||
wineOption.addAction(w6)
|
||||
wineOption.addAction(easyPackager)
|
||||
wineOption.addAction(deletePartIcon)
|
||||
wineOption.addSeparator()
|
||||
wineOption.addAction(wineKeyboardLnk)
|
||||
wineOption.addSeparator()
|
||||
@@ -2624,13 +2664,14 @@ wm2.addAction(wm2_4)
|
||||
wm2.addAction(wm2_5)
|
||||
wm2.addAction(wm2_6)
|
||||
wineOption.addSeparator()
|
||||
settingRunV3Sh = wineOption.addMenu(transla.transe("U", "run_v3.sh 管理"))
|
||||
w8 = QtWidgets.QAction(transla.transe("U", "设置 run_v3.sh 的文管为 Deepin 默认文管"))
|
||||
w9 = QtWidgets.QAction(transla.transe("U", "设置 run_v3.sh 的文管为 Wine 默认文管"))
|
||||
w10 = QtWidgets.QAction(transla.transe("U", "重新安装 deepin-wine-helper"))
|
||||
w11 = QtWidgets.QAction(transla.transe("U", "使用winetricks打开指定容器"))
|
||||
wineOption.addAction(w8)
|
||||
wineOption.addAction(w9)
|
||||
wineOption.addAction(w10)
|
||||
settingRunV3Sh.addAction(w8)
|
||||
settingRunV3Sh.addAction(w9)
|
||||
settingRunV3Sh.addAction(w10)
|
||||
wineOption.addSeparator()
|
||||
wineOption.addAction(w11)
|
||||
wineOption.addSeparator()
|
||||
@@ -2644,42 +2685,51 @@ optionCheckDemo.addAction(netIEDemo)
|
||||
wineOption.addSeparator()
|
||||
wm3 = wineOption.addMenu(transla.transe("U", "启用/禁用功能"))
|
||||
ed1 = wm3.addMenu(transla.transe("U", "启用/禁用 opengl"))
|
||||
wm3_1 = QtWidgets.QAction(transla.transe("U", "开启 opengl"))
|
||||
wm3_2 = QtWidgets.QAction(transla.transe("U", "禁用 opengl"))
|
||||
wm3_1 = QtWidgets.QAction(QtWidgets.QApplication.style().standardIcon(45), transla.transe("U", "开启 opengl"))
|
||||
wm3_2 = QtWidgets.QAction(QtWidgets.QApplication.style().standardIcon(40), transla.transe("U", "禁用 opengl"))
|
||||
ed1.addAction(wm3_1)
|
||||
ed1.addAction(wm3_2)
|
||||
ed2 = wm3.addMenu(transla.transe("U", "安装/卸载 winbind"))
|
||||
wm4_1 = QtWidgets.QAction(transla.transe("U", "安装 winbind"))
|
||||
wm4_2 = QtWidgets.QAction(transla.transe("U", "卸载 winbind"))
|
||||
wm4_1 = QtWidgets.QAction(QtWidgets.QApplication.style().standardIcon(45), transla.transe("U", "安装 winbind"))
|
||||
wm4_2 = QtWidgets.QAction(QtWidgets.QApplication.style().standardIcon(40), transla.transe("U", "卸载 winbind"))
|
||||
ed2.addAction(wm4_1)
|
||||
ed2.addAction(wm4_2)
|
||||
dxvkMenu = wm3.addMenu(transla.transe("U", "安装/卸载 DXVK"))
|
||||
installDxvk = QtWidgets.QAction(transla.transe("U", "安装 DXVK"))
|
||||
uninstallDxvk = QtWidgets.QAction(transla.transe("U", "卸载 DXVK"))
|
||||
installDxvk = QtWidgets.QAction(QtWidgets.QApplication.style().standardIcon(45), transla.transe("U", "安装 DXVK"))
|
||||
uninstallDxvk = QtWidgets.QAction(QtWidgets.QApplication.style().standardIcon(40), transla.transe("U", "卸载 DXVK"))
|
||||
dxvkMenu.addAction(installDxvk)
|
||||
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.addAction(deletePartIcon)
|
||||
wineOption.addAction(deleteDesktopIcon)
|
||||
wineOption.addSeparator()
|
||||
settingWineBottleCreateLink = wineOption.addMenu(transla.transe("U", "允许/禁止指定 wine 容器生成快捷方式"))
|
||||
enabledWineBottleCreateLink = QtWidgets.QAction(transla.transe("U", "允许指定 wine 容器生成快捷方式"))
|
||||
disbledWineBottleCreateLink = QtWidgets.QAction(transla.transe("U", "禁止指定 wine 容器生成快捷方式"))
|
||||
settingWineBottleCreateLink = wm3.addMenu(transla.transe("U", "启用/禁止指定 wine 容器生成快捷方式"))
|
||||
enabledWineBottleCreateLink = QtWidgets.QAction(QtWidgets.QApplication.style().standardIcon(45), transla.transe("U", "允许指定 wine 容器生成快捷方式"))
|
||||
disbledWineBottleCreateLink = QtWidgets.QAction(QtWidgets.QApplication.style().standardIcon(40), transla.transe("U", "禁止指定 wine 容器生成快捷方式"))
|
||||
settingWineBottleCreateLink.addAction(enabledWineBottleCreateLink)
|
||||
settingWineBottleCreateLink.addAction(disbledWineBottleCreateLink)
|
||||
settingWineCrashDialog = wineOption.addMenu(transla.transe("U", "启用/禁用指定 wine 容器崩溃提示窗口"))
|
||||
disbledWineCrashDialog = QtWidgets.QAction(transla.transe("U", "禁用指定 wine 容器崩溃提示窗口"))
|
||||
enabledWineCrashDialog = QtWidgets.QAction(transla.transe("U", "启用指定 wine 容器崩溃提示窗口"))
|
||||
settingWineCrashDialog.addAction(disbledWineCrashDialog)
|
||||
settingWineCrashDialog = wm3.addMenu(transla.transe("U", "启用/禁用指定 wine 容器崩溃提示窗口"))
|
||||
disbledWineCrashDialog = QtWidgets.QAction(QtWidgets.QApplication.style().standardIcon(40), transla.transe("U", "禁用指定 wine 容器崩溃提示窗口"))
|
||||
enabledWineCrashDialog = QtWidgets.QAction(QtWidgets.QApplication.style().standardIcon(45), transla.transe("U", "启用指定 wine 容器崩溃提示窗口"))
|
||||
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 容器代理"))
|
||||
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(disbledHttpProxy)
|
||||
dllOver = wineOption.addMenu(transla.transe("U", "函数顶替库列表"))
|
||||
saveDllOver = QtWidgets.QAction(transla.transe("U", "导出函数顶替列表"))
|
||||
addDllOver = QtWidgets.QAction(transla.transe("U", "导入函数顶替列表"))
|
||||
saveDllOver = QtWidgets.QAction(QtWidgets.QApplication.style().standardIcon(43), transla.transe("U", "导出函数顶替列表"))
|
||||
addDllOver = QtWidgets.QAction(QtWidgets.QApplication.style().standardIcon(32), transla.transe("U", "导入函数顶替列表"))
|
||||
editDllOver = QtWidgets.QAction(transla.transe("U", "编辑函数顶替库列表"))
|
||||
dllOver.addAction(saveDllOver)
|
||||
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"))
|
||||
installDxvk.triggered.connect(InstallDXVK)
|
||||
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())
|
||||
deleteDesktopIcon.triggered.connect(DeleteDesktopIcon)
|
||||
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"))
|
||||
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"))
|
||||
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)
|
||||
disbledHttpProxy.triggered.connect(DisbledHttpProxy)
|
||||
saveDllOver.triggered.connect(SaveDllList)
|
||||
@@ -2740,11 +2794,11 @@ virtualMachine.addAction(v1)
|
||||
v1.triggered.connect(RunVM)
|
||||
|
||||
checkValue = menu.addMenu(transla.transe("U", "校验值计算(&S)"))
|
||||
md5Value = QtWidgets.QAction(transla.transe("U", "MD5(&M)"))
|
||||
sha1Value = QtWidgets.QAction(transla.transe("U", "SHA1(&M)"))
|
||||
base64Value = QtWidgets.QAction(transla.transe("U", "Base64(建议小文件)(&B)"))
|
||||
sha256Value = QtWidgets.QAction(transla.transe("U", "SHA256(&S)"))
|
||||
sha512Value = QtWidgets.QAction(transla.transe("U", "SHA512(&S)"))
|
||||
md5Value = QtWidgets.QAction(QtWidgets.QApplication.style().standardIcon(32), transla.transe("U", "MD5(&M)"))
|
||||
sha1Value = QtWidgets.QAction(QtWidgets.QApplication.style().standardIcon(32), transla.transe("U", "SHA1(&M)"))
|
||||
base64Value = QtWidgets.QAction(QtWidgets.QApplication.style().standardIcon(32), transla.transe("U", "Base64(建议小文件)(&B)"))
|
||||
sha256Value = QtWidgets.QAction(QtWidgets.QApplication.style().standardIcon(32), transla.transe("U", "SHA256(&S)"))
|
||||
sha512Value = QtWidgets.QAction(QtWidgets.QApplication.style().standardIcon(32), transla.transe("U", "SHA512(&S)"))
|
||||
md5Value.triggered.connect(lambda: ValueCheck().Get("MD5"))
|
||||
sha1Value.triggered.connect(lambda: ValueCheck().Get("SHA1"))
|
||||
base64Value.triggered.connect(lambda: ValueCheck().Get("BASE64"))
|
||||
@@ -2758,9 +2812,9 @@ checkValue.addAction(sha512Value)
|
||||
|
||||
|
||||
safeWebsize = menu.addMenu(transla.transe("U", "云沙箱(&C)"))
|
||||
s1 = QtWidgets.QAction(transla.transe("U", "360 沙箱云"))
|
||||
s2 = QtWidgets.QAction(transla.transe("U", "微步云沙箱"))
|
||||
s3 = QtWidgets.QAction(transla.transe("U", "VIRUSTOTAL"))
|
||||
s1 = QtWidgets.QAction(QtWidgets.QApplication.style().standardIcon(9), transla.transe("U", "360 沙箱云"))
|
||||
s2 = QtWidgets.QAction(QtWidgets.QApplication.style().standardIcon(9), transla.transe("U", "微步云沙箱"))
|
||||
s3 = QtWidgets.QAction(QtWidgets.QApplication.style().standardIcon(9), transla.transe("U", "VIRUSTOTAL"))
|
||||
safeWebsize.addAction(s1)
|
||||
safeWebsize.addAction(s2)
|
||||
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)"))
|
||||
getDllInfo = QtWidgets.QAction(transla.transe("U", "查询 Dll"))
|
||||
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", "翻译日志(翻译后日志分析功能会故障)"))
|
||||
uploadLogText = QtWidgets.QAction(transla.transe("U", "上传日志"))
|
||||
getDllInfo.triggered.connect(DllWindow.ShowWindow)
|
||||
@@ -2786,35 +2840,35 @@ log.addAction(transLogText)
|
||||
log.addAction(uploadLogText)
|
||||
|
||||
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)
|
||||
unpackDeb.triggered.connect(UnPackage)
|
||||
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)
|
||||
configMenu.triggered.connect(ConfigQemu)
|
||||
print(qemuBottleList)
|
||||
|
||||
help = menu.addMenu(transla.transe("U", "帮助(&H)"))
|
||||
runStatusWebSize = QtWidgets.QAction(transla.transe("U", "查询程序在 Wine 的运行情况"))
|
||||
h1 = help.addMenu(transla.transe("U", "程序官网"))
|
||||
runStatusWebSize = QtWidgets.QAction(QtWidgets.QApplication.style().standardIcon(20), transla.transe("U", "查询程序在 Wine 的运行情况"))
|
||||
h1 = help.addMenu(QtWidgets.QApplication.style().standardIcon(20), 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", "更新内容"))
|
||||
h4 = QtWidgets.QAction(transla.transe("U", "谢明名单"))
|
||||
h5 = QtWidgets.QAction(transla.transe("U", "更新这个程序"))
|
||||
programInformation = QtWidgets.QAction(transla.transe("U", "获取程序公告"))
|
||||
h6 = QtWidgets.QAction(transla.transe("U", "反馈这个程序的建议和问题"))
|
||||
fenUpload = QtWidgets.QAction(transla.transe("U", "程序评分"))
|
||||
h7 = QtWidgets.QAction(transla.transe("U", "关于这个程序"))
|
||||
h8 = QtWidgets.QAction(transla.transe("U", "关于 Qt"))
|
||||
gfdgdxiio = QtWidgets.QAction(transla.transe("U", "作者个人站"))
|
||||
forumWebsize = QtWidgets.QAction(transla.transe("U", "程序论坛"))
|
||||
gitee = QtWidgets.QAction(transla.transe("U", "Gitee"))
|
||||
github = QtWidgets.QAction(transla.transe("U", "Github"))
|
||||
gitlink = QtWidgets.QAction(transla.transe("U", "Gitlink"))
|
||||
gitlab = QtWidgets.QAction(transla.transe("U", "Gitlab"))
|
||||
jihu = QtWidgets.QAction(transla.transe("U", "极狐"))
|
||||
h7 = QtWidgets.QAction(QtWidgets.QApplication.style().standardIcon(9), transla.transe("U", "关于这个程序"))
|
||||
h8 = QtWidgets.QAction(QtWidgets.QApplication.style().standardIcon(9), transla.transe("U", "关于 Qt"))
|
||||
gfdgdxiio = QtWidgets.QAction(QtWidgets.QApplication.style().standardIcon(20), transla.transe("U", "作者个人站"))
|
||||
forumWebsize = QtWidgets.QAction(QtWidgets.QApplication.style().standardIcon(20), transla.transe("U", "程序论坛"))
|
||||
gitee = QtWidgets.QAction(QtWidgets.QApplication.style().standardIcon(20), transla.transe("U", "Gitee"))
|
||||
github = QtWidgets.QAction(QtWidgets.QApplication.style().standardIcon(20), transla.transe("U", "Github"))
|
||||
gitlink = QtWidgets.QAction(QtWidgets.QApplication.style().standardIcon(20), transla.transe("U", "Gitlink"))
|
||||
gitlab = QtWidgets.QAction(QtWidgets.QApplication.style().standardIcon(20), transla.transe("U", "Gitlab"))
|
||||
jihu = QtWidgets.QAction(QtWidgets.QApplication.style().standardIcon(20), transla.transe("U", "极狐"))
|
||||
h1.addAction(gfdgdxiio)
|
||||
h1.addAction(gitee)
|
||||
h1.addAction(github)
|
||||
@@ -2830,11 +2884,11 @@ help.addAction(h2)
|
||||
help.addAction(h3)
|
||||
help.addAction(h4)
|
||||
help.addSeparator()
|
||||
wikiHelp = QtWidgets.QAction(transla.transe("U", "程序 Wiki"))
|
||||
wikiHelp = QtWidgets.QAction(QtWidgets.QApplication.style().standardIcon(20), transla.transe("U", "程序 Wiki"))
|
||||
help.addAction(wikiHelp)
|
||||
videoHelp = help.addMenu(transla.transe("U", "视频教程"))
|
||||
easyHelp = QtWidgets.QAction(transla.transe("U", "简易使用教程"))
|
||||
buildHelp = QtWidgets.QAction(transla.transe("U", "打包教程"))
|
||||
videoHelp = help.addMenu(QtWidgets.QApplication.style().standardIcon(20), transla.transe("U", "视频教程"))
|
||||
easyHelp = QtWidgets.QAction(QtWidgets.QApplication.style().standardIcon(20), transla.transe("U", "简易使用教程"))
|
||||
buildHelp = QtWidgets.QAction(QtWidgets.QApplication.style().standardIcon(20), transla.transe("U", "打包教程"))
|
||||
videoHelp.addAction(easyHelp)
|
||||
videoHelp.addAction(buildHelp)
|
||||
help.addSeparator()
|
||||
|
||||
Binary file not shown.
@@ -1,11 +1,12 @@
|
||||
{
|
||||
"Version": "2.6.0",
|
||||
"Version": "3.0.0",
|
||||
"Thank": [
|
||||
"感谢 @豪 提供程序图标",
|
||||
"感谢 @鹤舞白沙 对程序文案进行优化以及编写《Wine运行器和Wine打包器傻瓜式使用教程(小白专用) 》",
|
||||
"感谢 @璀璨星空 提供的彩蛋图标",
|
||||
"感谢 @Bail 反馈的更新策略问题",
|
||||
"感谢 @白水 反馈的安装 exagear 后无法识别和调用 box86 的问题",
|
||||
"感谢 @汐光. 提供的建议",
|
||||
"感谢 @汐光. 提供的翻译接口",
|
||||
"感谢 @鹤舞白沙 专门为小白用户编写的使用 Wine 运行器非基于生态适配脚本的程序打包教程",
|
||||
"感谢 @牦牛儿苗 进行了龙芯 3a5000 平台的测试与移植",
|
||||
"感谢 @雁舞白沙 优化了程序文案",
|
||||
|
||||
Binary file not shown.
Binary file not shown.
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
BIN
deb/opt/apps/deepin-wine-runner/vkd3d-proton.7z
Normal file
BIN
deb/opt/apps/deepin-wine-runner/vkd3d-proton.7z
Normal file
Binary file not shown.
Reference in New Issue
Block a user