From daa04ec6fda9a6ad46ac938df93e154c5f75d66e Mon Sep 17 00:00:00 2001 From: gfdgd_xi <3025613752@qq.com> Date: Mon, 22 Aug 2022 17:30:42 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E7=A8=8B=E5=BA=8F=E7=BF=BB?= =?UTF-8?q?=E8=AF=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- LANG/deepin-wine-runner-en_US.qm | Bin 0 -> 13387 bytes LANG/deepin-wine-runner-en_US.ts | 664 +++++++++++++++++++++++++++++++ LANG/installwine-en_US.qm | Bin 0 -> 503 bytes LANG/installwine-en_US.ts | 32 ++ deepin-wine-packager.py | 43 +- en_US.qph | 3 + information.json | 2 +- mainwindow.py | 314 ++++++++------- package-script/information.json | 2 +- wine/installwine | Bin 92736 -> 12738 bytes wine/installwine.out | Bin 0 -> 92736 bytes wine/installwine.py | 18 - wine/mainwindowui.py | 258 ------------ 13 files changed, 902 insertions(+), 434 deletions(-) create mode 100644 LANG/deepin-wine-runner-en_US.qm create mode 100644 LANG/deepin-wine-runner-en_US.ts create mode 100644 LANG/installwine-en_US.qm create mode 100644 LANG/installwine-en_US.ts create mode 100644 en_US.qph mode change 100755 => 100644 wine/installwine create mode 100755 wine/installwine.out delete mode 100644 wine/installwine.py delete mode 100644 wine/mainwindowui.py diff --git a/LANG/deepin-wine-runner-en_US.qm b/LANG/deepin-wine-runner-en_US.qm new file mode 100644 index 0000000000000000000000000000000000000000..64ce5e47dd155c9bd53eff4f6c01eee6b9b58d8f GIT binary patch literal 13387 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 literal 0 HcmV?d00001 diff --git a/LANG/deepin-wine-runner-en_US.ts b/LANG/deepin-wine-runner-en_US.ts new file mode 100644 index 0000000..e561084 --- /dev/null +++ b/LANG/deepin-wine-runner-en_US.ts @@ -0,0 +1,664 @@ + + + + + U + + + ???? + Fast Run + + + + 确定 + OK + + + + 如果安装字体?只需要把字体文件复制到此字体目录 +按下“OK”按钮可以打开字体目录 + If you want to install Font, you only copy font files to this directory +Check "OK " to open fonts directory + + + + 更新(更新过程中会关闭所有Python应用,包括这个应用) + Update (it will kill all python program when you're installing) + + + + 此为最新版本,无需更新 + It's newest program now, you don't need to update program + + + + 错误 + Error + + + + 无法连接服务器! + Can't connect the Program Server! + + + + 检查更新 + Check Update + + + + ISO镜像: + ISO Image FIle: + + + + 浏览 + Browser + + + + 读取/挂载ISO镜像 + Read/Mount ISO Image File + + + + 关闭/卸载ISO镜像 + Close/Unmount ISO Image File + + + + 查找 + Find + + + + 保存到 wine 容器中 + Save DLL for wine botton + + + + 设置 wine 容器 + Setting Wine Botton + + + + 查找DLL +(为空则代表不查找, +将显示全部内容): + Find DLL +(Nothing means don't find,will show all dlls): + + + + 提示 + Tips + + + + 关闭/卸载成功! + Close/Remove Success! + + + + 暂时还没有该软件的运行情况信息 +是否自己上传该软件的运行情况? + No body update this program running status now +Do you want to update first? + + + + 点此上传运行情况 + Click here to update + + + + 综合评价: + User Thinking: + + + + 上传 + Update + + + + 如果这个程序和程序名确实是合法还是检测到敏感词,改为“NULL”即可 + You can try press "NULL" if you can't to update because program name + + + + 程序名: + Program Name: + + + + 上传程序运行情况 + Fast Run + + + + 数据上传失败! + Update Error! + + + + 选择 Wine 容器版本: + Choose Wine Version: + + + + wine DEBUG 信息输出: + Show Wine Debug Information: + + + + 默认 Wine: + Default Wine Version: + + + + 默认 Wine 容器: + Defualt Wine Botton: + + + + 使用终端打开: + Use Terminal To Open Program: + + + + 自定义 wine 参数: + More Wine Command Option: + + + + 程序主题: + Program Theme: + + + + Wine 默认 Mono 和 Gecko 安装器: + Using Wine Defult Mono And Gecko Installer: + + + + 忽略未安装的 Wine: + Unsee Not Install Wine Version: + + + + 下载缓存: + Download Cache: + + + + 开启 DEBUG 输出 + Show Wine Debug Info + + + + 保存 + Save + + + + 测试(重启后变回设置的主题) + Test(Restarting will show setting themes) + + + + 使用终端打开(deepin 终端) + Use Terminal To Open(Deepin Terminal) + + + + 屏蔽 Wine 默认 Mono 和 Gecko 安装器 + Don't Use Wine Default Mono And Gecko Installer + + + + 不显示未检测到的 Wine + Don't Show Unknown Wine Version + + + + 开启下载缓存 + Start Download Cache + + + + 选择 Wine 容器 + Choose Wine Botton + + + + 快速启动 + Fast Run + + + + 请选择容器路径: + Choose Wine Botton Path: + + + + 请选择要执行的程序: + Choose EXE Files: + + + + 请选择WINE版本: + Choose Wine Version: + + + + 高级功能 + More Function + + + + 创建快捷方式(Desktop文件): + Create Program Link(.desktop file): + + + + 创建到桌面 + Create To Desktop + + + + 创建到开始菜单 + Create To Launcher + + + + 程序管理: + Program Manager: + + + + 提取图标 + Get Program Icon + + + + 窗口透明工具 + Window Transparent Tools + + + + 卸载程序 + Remove Program + + + + 微型应用商店 + Mini App Store + + + + 获取该程序运行情况 + Get Choosed Program Running Status + + + + WINE配置: + Wine Config: + + + + 配置容器 + Config Wine + + + + 字体商店 + Fonts Store + + + + 安装自定义字体 + Install More Fonts + + + + 星火wine配置 + Spark Wine Config + + + + 在此可以看到wine安装应用时的终端输出内容 + You can see wine running return things here + + + + 运行程序 + Run Program + + + + 终止程序 + Stop Program + + + + 程序(&P) + Program(&P) + + + + 安装 wine(&I) + Install Wine(&I) + + + + 安装 wine(只限Deepin23) + Install Wine(Only For Deepin 23) + + + + 安装 WineHQ + Install WineHQ + + + + 安装更多 Wine + Install More Wine + + + + 设置程序(&S) + Setting Program(&S) + + + + 清空软件历史记录(&C) + Clean Program History Data(&C) + + + + 清空软件缓存 + Clean Program Cache + + + + 删除程序组件 + Remove Program Function + + + + 退出程序(&E) + Exit Program(&E) + + + + Wine(&W) + Wine(&W) + + + + 打开 Wine 容器目录 + Open Wine Botton Directory + + + + 安装常见字体 + Install Fonts + + + + 删除选择的 Wine 容器 + Delete Choose Wine Botton + + + + 清理 Wine 容器(基于 Wine 适配活动脚本) + Clean Wine Botton(By UOS Wine Activity Shell) + + + + 打包 wine 应用 + Build Windows Program Installer For Linux By Wine + + + + 使用官方 Wine 适配活动的脚本进行打包 + Build Windows Program Installer For Linux By Wine(By UOS Wine Activity Shell) + + + + 从镜像获取DLL(只支持Windows XP、Windows Server 2003官方安装镜像) + Get Dll For ISO Images(Only Support Windows XP And Windows Server 2003 Microsoft Installer) + + + + 从 Geek Uninstaller 官网升级程序 + Update Geek Uninstaller From Geek Websize + + + + 删除所有 Wine 程序在启动器的快捷方式 + Delete All Wine Program Links On Launcher + + + + 在指定 Wine、容器安装组件 + Install Runtime With Choose Wine Botton And Version + + + + 在指定wine、指定容器安装 .net framework + Install .Net Framework + + + + 在指定wine、指定容器安装 Visual Studio C++ + Install Visual Studio C++ Runtime + + + + 在指定wine、指定容器安装 MSXML + Install MSXML + + + + 在指定wine、指定容器安装 gecko + Install Gecko + + + + 在指定wine、指定容器安装 mono + Install Mono + + + + 在指定wine、指定容器安装其它运行库 + Install Other Runtime + + + + 在指定 Wine、容器运行基础应用 + Run Basic Program + + + + 打开指定wine、指定容器的控制面板 + Run Control + + + + 打开指定wine、指定容器的浏览器 + Run Web Browser + + + + 打开指定wine、指定容器的注册表 + Run Regedit + + + + 打开指定wine、指定容器的任务管理器 + Run Taskmgr + + + + 打开指定wine、指定容器的资源管理器 + Run File Explorer + + + + 打开指定wine、指定容器的关于 wine + Run About Wine + + + + 设置 run_v3.sh 的文管为 Deepin 默认文管 + Set Deepin File Dialog Defult On run_v3.sh + + + + 设置 run_v3.sh 的文管为 Wine 默认文管 + Set Wine File Dialog Defult On run_v3.sh + + + + 重新安装 deepin-wine-helper + Reinstall deepin-wine-helper + + + + 使用winetricks打开指定容器 + Using Winetricks + + + + 启用/禁用 opengl + Enabled/Disbled OpenGL + + + + 开启 opengl + Enabled OpenGL + + + + 禁用 opengl + Disbled OpenGL + + + + 安装/卸载 winbind + Install/Uninstall Winbind + + + + 安装 winbind + Install Winbind + + + + 卸载 winbind + Uninstall Winbind + + + + 安装/卸载 DXVK + Install/Uninstall DXVK + + + + 安装 DXVK + Install DXVK + + + + 卸载 DXVK + Uninstall DXVK + + + + 虚拟机(&V) + Virtual Machine(&V) + + + + 使用 Virtualbox 虚拟机运行 Windows 应用 + Run Windows Program By VirtualBox + + + + 云沙箱(&C) + Cloud Sandbox(&C) + + + + 360 沙箱云 + 360 Cloud Sandbox + + + + 微步云沙箱 + ThreatBook Cloud Sandbox + + + + VIRUSTOTAL + VIRUSTOTAL + + + + 帮助(&H) + Help(&H) + + + + 程序官网 + Program Websize + + + + 小提示 + Program Tips + + + + 更新内容 + Program New Things + + + + 谢明名单 + Thank List + + + + 更新这个程序 + UPdate This Program + + + + 反馈这个程序的建议和问题 + Update Advices And Problem + + + + 关于这个程序 + About This Program + + + + 关于 Qt + About Qt + + + + 更多生态适配应用 + More Deepin/UOS Program + + + + 运行 Android 应用:UEngine 运行器 + Run Android Program: UEngine Runner + + + diff --git a/LANG/installwine-en_US.qm b/LANG/installwine-en_US.qm new file mode 100644 index 0000000000000000000000000000000000000000..8b60acebfcabe165c504ccfeee45d6a7a91c348e GIT binary patch literal 503 zcmcE7ks@*G{hX<16=n7(EZlo{IRgU&YgI_CdkH!(9WJTosPznl@G z$d17dp~%h-n<6O&7lwR>a)vyH93Y*@kiwwA5YCVZ5azEM8{bKK41)$lf*v!xZ zn~}$$&QJo>9SYQ21vH@mVG@w#1{BFbGE?%&j@}o`7eDRm2ATR|Ys<4;6P`_Lf3kZU zHXHnaHl%{|18qnJnuh7-D5#B4dw^;jf$jkL#vkmrN+1jFGPuwDo^~vFIdcibf6r&N zK-}@Pr}h1wo~Qk*AP#)8f9~_CGvDv&c(Mbia@EU*&X)^!zHHtLWIUg} + + + + MainWindow + + + 下载 Wine + Download Wine + + + + << + << + + + + >> + >> + + + + 不解压Wine资源文件 + Don't Unzip Wine File + + + + 删除下载的资源包,只解压保留(两个选项都选相互抵消) + Delete Download Zip File And Only Unzip + + + diff --git a/deepin-wine-packager.py b/deepin-wine-packager.py index 81cf0a1..8a7ad6d 100755 --- a/deepin-wine-packager.py +++ b/deepin-wine-packager.py @@ -1,7 +1,7 @@ #!/usr/bin/env python3 ######################################################################### # 作者:gfdgd xi、为什么您不喜欢熊出没和阿布 -# 版本:2.0.0 +# 版本:2.0.1 # 感谢:感谢 deepin-wine 团队,提供了 deepin-wine 给大家使用,让我能做这个程序 # 基于 Python3 的 PyQt5 构建 ######################################################################### @@ -10,6 +10,7 @@ ################# import os import sys +import time import json import shutil import random @@ -77,9 +78,12 @@ class QT: thread = None savePath = "" +savePathBlock = False def SavePathGet(temp): global savePath - savePath = QtWidgets.QFileDialog.getExistingDirectory(widget, "选择模板生成位置", "~") + global savePathBlock + savePath = QtWidgets.QFileDialog.getExistingDirectory(widget, "选择模板生成位置", get_home()) + savePathBlock = True def ErrorMsg(info): QtWidgets.QMessageBox.critical(widget, "错误", info) @@ -758,14 +762,27 @@ fi self.label.emit("正在删除对构建 deb 包有影响的文件……") if self.build: global savePath + global savePathBlock + savePathBlock = False self.getSavePath.emit("") + # 必须保证信号完全执行才可以继续 + # 所以自制信号锁 + while not savePathBlock: + time.sleep(0.1) + # if savePath == "": - self.disabled_or_NORMAL_all.emit(False) + print("ggg") + self.disabled_or_NORMAL_all.emit(True) return + print("aaa") debPackagePath = savePath + print("g") else: debPackagePath = f"/tmp/{random.randint(0, 9999)}" - self.run_command(f"rm -rfv /tmp/{debPackagePath}") + #self.run_command(f"rm -rfv /tmp/{debPackagePath}") + print("f") + self.run_command(f"rm -rfv '{debPackagePath}'") + print("d") ############### # 创建目录 ############### @@ -857,7 +874,8 @@ fi # 写入文本文档 ################ self.label.emit("正在写入文件……") - write_txt(f"{debPackagePath}/DEBIAN/control", f'''Package: {e1_text.text()} + if debRecommend.text() == "": + write_txt(f"{debPackagePath}/DEBIAN/control", f'''Package: {e1_text.text()} Version: {e2_text.text()} Architecture: {debInformation[debArch.currentIndex()]["Architecture"]} Maintainer: {e4_text.text()} @@ -867,6 +885,19 @@ Priority: optional Multi-Arch: foreign Installed-Size: {size} Description: {e3_text.text()} +''') + else: + write_txt(f"{debPackagePath}/DEBIAN/control", f'''Package: {e1_text.text()} +Version: {e2_text.text()} +Architecture: {debInformation[debArch.currentIndex()]["Architecture"]} +Maintainer: {e4_text.text()} +Depends: {debInformation[debArch.currentIndex()]["Depends"]} +Recommends: {debRecommend.text()} +Section: non-free/otherosfs +Priority: optional +Multi-Arch: foreign +Installed-Size: {size} +Description: {e3_text.text()} ''') if debInformation[debArch.currentIndex()]["postinst"] != "": write_txt(f"{debPackagePath}/DEBIAN/postinst", debInformation[debArch.currentIndex()]["postinst"]) @@ -895,7 +926,7 @@ Description: {e3_text.text()} ################ self.label.emit("完成构建!") self.disabled_or_NORMAL_all.emit(True) - self.infoMsg.emit(widget, "提示", "打包完毕!") + self.infoMsg.emit("打包完毕!") except: traceback.print_exc() self.errorMsg.emit("程序出现错误,错误信息:\n{}".format(traceback.format_exc())) diff --git a/en_US.qph b/en_US.qph new file mode 100644 index 0000000..e1a8d34 --- /dev/null +++ b/en_US.qph @@ -0,0 +1,3 @@ + + + diff --git a/information.json b/information.json index 28a8993..1724093 100755 --- a/information.json +++ b/information.json @@ -1,5 +1,5 @@ { - "Version": "2.0.0-2", + "Version": "2.0.1", "Thank": [ "感谢 @a2035274 @虚幻的早晨 https://bbs.deepin.org/post/238301", "感谢 @zhangs https://bbs.deepin.org/post/227948", diff --git a/mainwindow.py b/mainwindow.py index e2152d3..5b30012 100755 --- a/mainwindow.py +++ b/mainwindow.py @@ -26,7 +26,8 @@ import urllib.parse as parse import PyQt5.QtGui as QtGui import PyQt5.QtCore as QtCore import PyQt5.QtWidgets as QtWidgets - +# 方便一些,单独把 tr 抽出来 +from PyQt5.QtCore import QObject ################### # 程序所需事件 ################### @@ -194,7 +195,7 @@ def about_this_program()->"显示“关于这个程序”窗口": aboutInfo = QtWidgets.QTextBrowser(messageWidget) aboutInfo.setHtml(about) messageLayout.addWidget(aboutInfo, 0, 1, 1, 1) - ok = QtWidgets.QPushButton("确定") + ok = QtWidgets.QPushButton(QtCore.QCoreApplication.translate("U", "确定")) ok.clicked.connect(QT.message.close) messageLayout.addWidget(ok, 1, 1, 1, 1, QtCore.Qt.AlignBottom | QtCore.Qt.AlignRight) messageWidget.setLayout(messageLayout) @@ -372,7 +373,7 @@ def OpenWineFontPath(): wineBottonPath = setting["DefultBotton"] else: wineBottonPath = e1.currentText() - QtWidgets.QMessageBox.information(widget, "提示", "如果安装字体?只需要把字体文件复制到此字体目录\n按下“OK”按钮可以打开字体目录") + QtWidgets.QMessageBox.information(widget, "提示", QtCore.QCoreApplication.translate("U", "如果安装字体?只需要把字体文件复制到此字体目录\n按下“OK”按钮可以打开字体目录")) os.system("xdg-open \"" + wineBottonPath.replace("\'", "\\\'") + "/drive_c/windows/Fonts\"") class RunWineProgramThread(QtCore.QThread): @@ -696,28 +697,28 @@ class UpdateWindow(): updateWidgetLayout = QtWidgets.QGridLayout() versionLabel = QtWidgets.QLabel(f"当前版本:{version}\n最新版本:未知\n更新内容:") updateText = QtWidgets.QTextBrowser() - ok = QtWidgets.QPushButton("更新(更新过程中会关闭所有Python应用,包括这个应用)") + ok = QtWidgets.QPushButton(QtCore.QCoreApplication.translate("U", "更新(更新过程中会关闭所有Python应用,包括这个应用)")) ok.clicked.connect(UpdateWindow.Update) cancel = QtWidgets.QPushButton("取消") cancel.clicked.connect(UpdateWindow.update.close) try: - UpdateWindow.data = json.loads(requests.get("http://120.25.153.144/spark-deepin-wine-runner/update.json").text) + UpdateWindow.data = json.loads(requests.get(base64.b64decode("aHR0cDovLzEyMC4yNS4xNTMuMTQ0L3NwYXJrLWRlZXBpbi13aW5lLXJ1bm5lci91cGRhdGUuanNvbg==").decode("utf-8")).text) versionLabel = QtWidgets.QLabel(f"当前版本:{version}\n最新版本:{UpdateWindow.data['Version']}\n更新内容:") if UpdateWindow.data["Version"] == version: - updateText.setText("此为最新版本,无需更新") + updateText.setText(QtCore.QCoreApplication.translate("U", "此为最新版本,无需更新")) ok.setDisabled(True) else: updateText.setText(UpdateWindow.data["New"].replace("\\n", "\n")) except: traceback.print_exc() - QtWidgets.QMessageBox.critical(updateWidget, "错误", "无法连接服务器!") + QtWidgets.QMessageBox.critical(updateWidget, QtCore.QCoreApplication.translate("U", "错误"), QtCore.QCoreApplication.translate("U", "无法连接服务器!")) updateWidgetLayout.addWidget(versionLabel, 0, 0, 1, 1) updateWidgetLayout.addWidget(updateText, 1, 0, 1, 3) updateWidgetLayout.addWidget(ok, 2, 2, 1, 1) updateWidgetLayout.addWidget(cancel, 2, 1, 1, 1) updateWidget.setLayout(updateWidgetLayout) UpdateWindow.update.setCentralWidget(updateWidget) - UpdateWindow.update.setWindowTitle("检查更新") + UpdateWindow.update.setWindowTitle(QtCore.QCoreApplication.translate("U", "检查更新")) UpdateWindow.update.resize(updateWidget.frameGeometry().width(), int(updateWidget.frameGeometry().height() * 1.5)) UpdateWindow.update.show() @@ -772,22 +773,22 @@ class GetDllFromWindowsISO: 以及不要拷贝/替换太多的 dll,否则可能会导致 wine 容器异常 最后,拷贝/替换 dll 后,建议点击下面“设置 wine 容器”按钮==》函数库 进行设置 当前选择的 Wine 容器:{GetDllFromWindowsISO.wineBottonPath}"""), 0, 0, 1, 5) - isoLabel = QtWidgets.QLabel("ISO镜像:") + isoLabel = QtWidgets.QLabel(QtCore.QCoreApplication.translate("U", "ISO镜像:")) GetDllFromWindowsISO.isoPath = QtWidgets.QComboBox() - GetDllFromWindowsISO.browser = QtWidgets.QPushButton("浏览") + GetDllFromWindowsISO.browser = QtWidgets.QPushButton(QtCore.QCoreApplication.translate("U", "浏览")) isoControl = QtWidgets.QWidget() isoControlLayout = QtWidgets.QHBoxLayout() isoControl.setLayout(isoControlLayout) dllControl = QtWidgets.QWidget() dllControlLayout = QtWidgets.QHBoxLayout() dllControl.setLayout(dllControlLayout) - GetDllFromWindowsISO.mountButton = QtWidgets.QPushButton("读取/挂载ISO镜像") - umountButton = QtWidgets.QPushButton("关闭/卸载ISO镜像") + GetDllFromWindowsISO.mountButton = QtWidgets.QPushButton(QtCore.QCoreApplication.translate("U", "读取/挂载ISO镜像")) + umountButton = QtWidgets.QPushButton(QtCore.QCoreApplication.translate("U", "关闭/卸载ISO镜像")) GetDllFromWindowsISO.dllFound = QtWidgets.QComboBox() - GetDllFromWindowsISO.foundButton = QtWidgets.QPushButton("查找") + GetDllFromWindowsISO.foundButton = QtWidgets.QPushButton(QtCore.QCoreApplication.translate("U", "查找")) GetDllFromWindowsISO.dllList = QtWidgets.QListView() - GetDllFromWindowsISO.saveDll = QtWidgets.QPushButton("保存到 wine 容器中") - GetDllFromWindowsISO.setWineBotton = QtWidgets.QPushButton("设置 wine 容器") + GetDllFromWindowsISO.saveDll = QtWidgets.QPushButton(QtCore.QCoreApplication.translate("U", "保存到 wine 容器中")) + GetDllFromWindowsISO.setWineBotton = QtWidgets.QPushButton(QtCore.QCoreApplication.translate("U", "设置 wine 容器")) isoLabel.setSizePolicy(size) GetDllFromWindowsISO.isoPath.setEditable(True) GetDllFromWindowsISO.isoPath.addItems(isoPath) @@ -809,7 +810,7 @@ class GetDllFromWindowsISO: widgetLayout.addWidget(GetDllFromWindowsISO.isoPath, 1, 1, 1, 1) widgetLayout.addWidget(GetDllFromWindowsISO.browser, 1, 2, 1, 1) widgetLayout.addWidget(isoControl, 2, 1, 1, 1) - widgetLayout.addWidget(QtWidgets.QLabel("查找DLL\n(为空则代表不查找,\n将显示全部内容):"), 3, 0, 1, 1) + widgetLayout.addWidget(QtWidgets.QLabel(QtCore.QCoreApplication.translate("U", "查找DLL\n(为空则代表不查找,\n将显示全部内容):")), 3, 0, 1, 1) widgetLayout.addWidget(GetDllFromWindowsISO.dllFound, 3, 1, 1, 1) widgetLayout.addWidget(GetDllFromWindowsISO.foundButton, 3, 2, 1, 1) widgetLayout.addWidget(GetDllFromWindowsISO.dllList, 4, 1, 1, 1) @@ -917,12 +918,12 @@ class GetDllFromWindowsISO: shutil.rmtree("/tmp/wine-runner-getdll") except: traceback.print_exc() - QtWidgets.QMessageBox.critical(GetDllFromWindowsISO.message, "错误", f"关闭/卸载镜像失败,报错如下:\n{traceback.format_exc()}") + QtWidgets.QMessageBox.critical(GetDllFromWindowsISO.message, QtCore.QCoreApplication.translate("U", "错误"), f"关闭/卸载镜像失败,报错如下:\n{traceback.format_exc()}") return GetDllFromWindowsISO.DisbledDown(True) GetDllFromWindowsISO.DisbledUp(False) GetDllFromWindowsISO.mount = False - QtWidgets.QMessageBox.information(GetDllFromWindowsISO.message, "提示", "关闭/卸载成功!") + QtWidgets.QMessageBox.information(GetDllFromWindowsISO.message, QtCore.QCoreApplication.translate("U", "提示"), QtCore.QCoreApplication.translate("U", "关闭/卸载成功!")) def CopyDll(): choose = GetDllFromWindowsISO.dllList.selectionModel().selectedIndexes()[0].data() @@ -944,23 +945,24 @@ class ProgramRunStatusShow(): return try: sha = ProgramRunStatusUpload.GetSHA1(e2.currentText()) - lists = json.loads(requests.get(f"http://120.25.153.144/spark-deepin-wine-runner/app/{sha}/all.json").text) - r = requests.get(f"http://120.25.153.144/spark-deepin-wine-runner/app/{sha}/title.txt") + lists = json.loads(requests.get(base64.b64decode("aHR0cDovLzEyMC4yNS4xNTMuMTQ0L3NwYXJrLWRlZXBpbi13aW5lLXJ1bm5lci9hcHAv").decode("utf-8") + sha + base64.b64decode("L2FsbC5qc29u").decode("utf-8")).text) + r = requests.get(base64.b64decode("aHR0cDovLzEyMC4yNS4xNTMuMTQ0L3NwYXJrLWRlZXBpbi13aW5lLXJ1bm5lci9hcHAv").decode("utf-8") + sha + base64.b64decode("L3RpdGxlLnR4dA==").decode("utf-8")) r.encoding = "utf-8" title = r.text except: - if QtWidgets.QMessageBox.question(widget, "提示", "暂时还没有该软件的运行情况信息\n是否自己上传该软件的运行情况?") == QtWidgets.QMessageBox.Yes: + if QtWidgets.QMessageBox.question(widget, QtCore.QCoreApplication.translate("U", "提示"), QtCore.QCoreApplication.translate("U", "暂时还没有该软件的运行情况信息\n是否自己上传该软件的运行情况?")) == QtWidgets.QMessageBox.Yes: ProgramRunStatusUpload.ShowWindow(sha) return - informationList = ["0分:无法运行并且也没有报错,自己无法解决", - "1分:无法运行但有报错,自己无法解决", - "2分:可以运行但是效果很差,几乎无法使用", - "3分:可以运行且勉强可以使用", - "4分:可以运行,体验大差不差,还是有点小问题", - "5分:可以运行且完全没有bug和问题,和在 Windows 上一样", - "含有不良内容,不宜安装", - "含有病毒、木马等对计算机有害的软件" - ] + informationList = [ + "0分:无法运行并且也没有报错,自己无法解决", + "1分:无法运行但有报错,自己无法解决", + "2分:可以运行但是效果很差,几乎无法使用", + "3分:可以运行且勉强可以使用", + "4分:可以运行,体验大差不差,还是有点小问题", + "5分:可以运行且完全没有bug和问题,和在 Windows 上一样", + "含有不良内容,不宜安装", + "含有病毒、木马等对计算机有害的软件" + ] if title.lower() == "null": title = "未知应用" maxHead = lists.index(max(lists)) @@ -968,9 +970,9 @@ class ProgramRunStatusShow(): msgWidget = QtWidgets.QWidget() msgWidgetLayout = QtWidgets.QGridLayout() starLayout = QtWidgets.QHBoxLayout() - uploadButton = QtWidgets.QPushButton("点此上传运行情况") + uploadButton = QtWidgets.QPushButton(QtCore.QCoreApplication.translate("U", "点此上传运行情况")) uploadButton.clicked.connect(lambda: ProgramRunStatusUpload.ShowWindow(sha, title)) - msgWidgetLayout.addWidget(QtWidgets.QLabel("综合评价:"), 0, 0) + msgWidgetLayout.addWidget(QtWidgets.QLabel(QtCore.QCoreApplication.translate("U", "综合评价:")), 0, 0) msgWidgetLayout.addLayout(starLayout, 0, 1) msgWidgetLayout.addWidget(QtWidgets.QLabel(informationList[maxHead]), 1, 0, 1, 2) msgWidgetLayout.addWidget(uploadButton, 2, 0, 1, 2) @@ -1018,7 +1020,7 @@ class ProgramRunStatusUpload(): ProgramRunStatusUpload.programName = QtWidgets.QLineEdit() ProgramRunStatusUpload.fen = QtWidgets.QComboBox() ProgramRunStatusUpload.starLayout = QtWidgets.QHBoxLayout() - upload = QtWidgets.QPushButton("上传") + upload = QtWidgets.QPushButton(QtCore.QCoreApplication.translate("U", "上传")) upload.clicked.connect(ProgramRunStatusUpload.Upload) if title != "": ProgramRunStatusUpload.programName.setText(title) @@ -1028,7 +1030,7 @@ class ProgramRunStatusUpload(): ProgramRunStatusUpload.starList.append(QtWidgets.QLabel(f"")) ProgramRunStatusUpload.starLayout.addWidget(ProgramRunStatusUpload.starList[-1]) ProgramRunStatusUpload.starLayout.addItem(QtWidgets.QSpacerItem(20, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)) - ProgramRunStatusUpload.programName.setPlaceholderText("如果这个程序和程序名确实是合法还是检测到敏感词,改为“NULL”即可") + ProgramRunStatusUpload.programName.setPlaceholderText(QtCore.QCoreApplication.translate("U", "如果这个程序和程序名确实是合法还是检测到敏感词,改为“NULL”即可")) ProgramRunStatusUpload.fen.addItems(["0分:无法运行并且也没有报错,自己无法解决", "1分:无法运行但有报错,自己无法解决", "2分:可以运行但是效果很差,几乎无法使用", @@ -1039,15 +1041,15 @@ class ProgramRunStatusUpload(): "含有病毒、木马等对计算机有害的软件"]) ProgramRunStatusUpload.fen.setCurrentIndex(4) ProgramRunStatusUpload.fen.currentIndexChanged.connect(ProgramRunStatusUpload.ChangeStar) - msgWidgetLayout.addWidget(QtWidgets.QLabel("程序名:"), 0, 0) - msgWidgetLayout.addWidget(QtWidgets.QLabel("评分:"), 1, 0) + msgWidgetLayout.addWidget(QtWidgets.QLabel(QtCore.QCoreApplication.translate("U", "程序名:")), 0, 0) + msgWidgetLayout.addWidget(QtCore.QCoreApplication.translate("U", QtWidgets.QLabel("评分:")), 1, 0) msgWidgetLayout.addWidget(ProgramRunStatusUpload.programName, 0, 1) msgWidgetLayout.addWidget(ProgramRunStatusUpload.fen, 1, 1) msgWidgetLayout.addLayout(ProgramRunStatusUpload.starLayout, 2, 1) msgWidgetLayout.addWidget(upload, 3, 1) msgWidget.setLayout(msgWidgetLayout) ProgramRunStatusUpload.msgWindow.setCentralWidget(msgWidget) - ProgramRunStatusUpload.msgWindow.setWindowTitle("上传程序运行情况") + ProgramRunStatusUpload.msgWindow.setWindowTitle(QtCore.QCoreApplication.translate("U", "上传程序运行情况")) ProgramRunStatusUpload.msgWindow.setWindowIcon(QtGui.QIcon(iconPath)) ProgramRunStatusUpload.msgWindow.show() @@ -1055,17 +1057,20 @@ class ProgramRunStatusUpload(): if not os.path.exists(e2.currentText()): QtWidgets.QMessageBox.critical(None, "错误", "exe 文件不存在!") return + if ProgramRunStatusUpload.programName.text() == "": + QtWidgets.QMessageBox.critical(None, "错误", "程序名称不能为空!") + return try: if ProgramRunStatusUpload.sha1Value == "": ProgramRunStatusUpload.sha1Value = ProgramRunStatusUpload.GetSHA1(e2.currentText()) - QtWidgets.QMessageBox.information(None, "提示", json.loads(requests.post("http://120.25.153.144:30250", { + QtWidgets.QMessageBox.information(None, QtCore.QCoreApplication.translate("U", "提示"), json.loads(requests.post(base64.b64decode("aHR0cDovLzEyMC4yNS4xNTMuMTQ0OjMwMjUw").decode("utf-8"), { "SHA1": ProgramRunStatusUpload.sha1Value, "Name": ProgramRunStatusUpload.programName.text(), "Fen": ProgramRunStatusUpload.fen.currentIndex(), "Wine": o1.currentText() }).text)["Error"]) except: - QtWidgets.QMessageBox.critical(None, "错误", "数据上传失败!") + QtWidgets.QMessageBox.critical(None, QtCore.QCoreApplication.translate("U", "错误"), QtCore.QCoreApplication.translate("U", "数据上传失败!")) def GetSHA1(filePath): sha1 = hashlib.sha1() @@ -1096,34 +1101,34 @@ class ProgramSetting(): ProgramSetting.message = QtWidgets.QMainWindow() widget = QtWidgets.QWidget() widgetLayout = QtWidgets.QGridLayout() - widgetLayout.addWidget(QtWidgets.QLabel("选择 Wine 容器版本:"), 0, 0, 1, 1) - widgetLayout.addWidget(QtWidgets.QLabel("wine DEBUG 信息输出:"), 1, 0, 1, 1) - widgetLayout.addWidget(QtWidgets.QLabel("默认 Wine:"), 2, 0, 1, 1) - widgetLayout.addWidget(QtWidgets.QLabel("默认 Wine 容器:"), 3, 0, 1, 1) - widgetLayout.addWidget(QtWidgets.QLabel("使用终端打开:"), 4, 0, 1, 1) - widgetLayout.addWidget(QtWidgets.QLabel("自定义 wine 参数:"), 5, 0, 1, 1) - widgetLayout.addWidget(QtWidgets.QLabel("程序主题:"), 6, 0, 1, 1) - widgetLayout.addWidget(QtWidgets.QLabel("Wine 默认 Mono 和 Gecko 安装器:"), 7, 0, 1, 1) - widgetLayout.addWidget(QtWidgets.QLabel("忽略未安装的 Wine:"), 8, 0, 1, 1) - widgetLayout.addWidget(QtWidgets.QLabel("下载缓存:"), 9, 0, 1, 1) + widgetLayout.addWidget(QtWidgets.QLabel(QtCore.QCoreApplication.translate("U", "选择 Wine 容器版本:")), 0, 0, 1, 1) + widgetLayout.addWidget(QtWidgets.QLabel(QtCore.QCoreApplication.translate("U", "wine DEBUG 信息输出:")), 1, 0, 1, 1) + widgetLayout.addWidget(QtWidgets.QLabel(QtCore.QCoreApplication.translate("U", "默认 Wine:")), 2, 0, 1, 1) + widgetLayout.addWidget(QtWidgets.QLabel(QtCore.QCoreApplication.translate("U", "默认 Wine 容器:")), 3, 0, 1, 1) + widgetLayout.addWidget(QtWidgets.QLabel(QtCore.QCoreApplication.translate("U", "使用终端打开:")), 4, 0, 1, 1) + widgetLayout.addWidget(QtWidgets.QLabel(QtCore.QCoreApplication.translate("U", "自定义 wine 参数:")), 5, 0, 1, 1) + widgetLayout.addWidget(QtWidgets.QLabel(QtCore.QCoreApplication.translate("U", "程序主题:")), 6, 0, 1, 1) + widgetLayout.addWidget(QtWidgets.QLabel(QtCore.QCoreApplication.translate("U", "Wine 默认 Mono 和 Gecko 安装器:")), 7, 0, 1, 1) + widgetLayout.addWidget(QtWidgets.QLabel(QtCore.QCoreApplication.translate("U", "忽略未安装的 Wine:")), 8, 0, 1, 1) + widgetLayout.addWidget(QtWidgets.QLabel(QtCore.QCoreApplication.translate("U", "下载缓存:")), 9, 0, 1, 1) ProgramSetting.wineBottonA = QtWidgets.QComboBox() - ProgramSetting.wineDebug = QtWidgets.QCheckBox("开启 DEBUG 输出") + ProgramSetting.wineDebug = QtWidgets.QCheckBox(QtCore.QCoreApplication.translate("U", "开启 DEBUG 输出")) ProgramSetting.defultWine = QtWidgets.QComboBox() ProgramSetting.defultBotton = QtWidgets.QLineEdit() ProgramSetting.theme = QtWidgets.QComboBox() ProgramSetting.theme.addItems(QtWidgets.QStyleFactory.keys()) ProgramSetting.theme.setCurrentText(setting["Theme"]) - save = QtWidgets.QPushButton("保存") + save = QtWidgets.QPushButton(QtCore.QCoreApplication.translate("U", "保存")) save.clicked.connect(ProgramSetting.Save) - defultBottonButton = QtWidgets.QPushButton("浏览") + defultBottonButton = QtWidgets.QPushButton(QtCore.QCoreApplication.translate("U", "浏览")) defultBottonButton.clicked.connect(ProgramSetting.Browser) - themeTry = QtWidgets.QPushButton("测试(重启后变回设置的主题)") + themeTry = QtWidgets.QPushButton(QtCore.QCoreApplication.translate("U", "测试(重启后变回设置的主题)")) themeTry.clicked.connect(ProgramSetting.Try) - ProgramSetting.terminalOpen = QtWidgets.QCheckBox("使用终端打开(deepin 终端)") + ProgramSetting.terminalOpen = QtWidgets.QCheckBox(QtCore.QCoreApplication.translate("U", "使用终端打开(deepin 终端)")) ProgramSetting.wineOption = QtWidgets.QLineEdit() - ProgramSetting.monogeckoInstaller = QtWidgets.QCheckBox("屏蔽 Wine 默认 Mono 和 Gecko 安装器") - ProgramSetting.autoWine = QtWidgets.QCheckBox("不显示未检测到的 Wine") - ProgramSetting.runtimeCache = QtWidgets.QCheckBox("开启下载缓存") + ProgramSetting.monogeckoInstaller = QtWidgets.QCheckBox(QtCore.QCoreApplication.translate("U", "屏蔽 Wine 默认 Mono 和 Gecko 安装器")) + ProgramSetting.autoWine = QtWidgets.QCheckBox(QtCore.QCoreApplication.translate("U", "不显示未检测到的 Wine")) + ProgramSetting.runtimeCache = QtWidgets.QCheckBox(QtCore.QCoreApplication.translate("U", "开启下载缓存")) ProgramSetting.wineBottonA.addItems(["Auto", "win32", "win64"]) ProgramSetting.wineBottonA.setCurrentText(setting["Architecture"]) ProgramSetting.wineDebug.setChecked(setting["Debug"]) @@ -1155,7 +1160,7 @@ class ProgramSetting(): ProgramSetting.message.show() def Browser(): - path = QtWidgets.QFileDialog.getExistingDirectory(ProgramSetting.message, "选择 Wine 容器", json.loads(readtxt(get_home() + "/.config/deepin-wine-runner/WineBotton.json"))["path"]) + path = QtWidgets.QFileDialog.getExistingDirectory(ProgramSetting.message, QtCore.QCoreApplication.translate("U", "选择 Wine 容器"), json.loads(readtxt(get_home() + "/.config/deepin-wine-runner/WineBotton.json"))["path"]) if path == "" or path == None or path == "()" or path == (): return ProgramSetting.defultBotton.setText(path) @@ -1329,11 +1334,16 @@ exe路径\' 参数 \' 千万不要中断后不删除源的情况下 apt upgrade !!!中断后只需重新打开脚本输入 repair 或者随意安装一个 Wine(会自动执行恢复操作)即可 以及此脚本安装的 Wine 无法保证 100% 能使用,以及副作用是会提示 N: 鉴于仓库 'https://community-packages.deepin.com/beige beige InRelease' 不支持 'i386' 体系结构,跳过配置文件 'main/binary-i386/Packages' 的获取。''' -updateThingsString = ''' +updateThingsString = '''※1、新增新的 Wine 安装器,并支持将安装的 Wine 打包到 Wine 程序 deb 包中 +※2、Wine 打包器打包 Windows 应用支持将 Wine 打包入 deb 内,可以不依赖 Wine(一般不推荐把 Wine 打包入内,推荐用依赖的形式),并支持设置自定义依赖和生成模板 +3、修改错别字(图形话=>图形化) +3、修复评分功能名称为空也可以上传评分的问题 +4、去除 toilet 依赖,使在 Deepin 23 Preview 上运行更佳 +5、支持删除所有由 Wine 创建的启动器快捷方式 ''' for i in information["Thank"]: thankText += f"{i}\n" -updateTime = "2022年08月17日" +updateTime = "2022年08月22日" about = f'''

关于

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

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

@@ -1375,6 +1385,10 @@ except: # 读取主题 # Qt 窗口 app = QtWidgets.QApplication(sys.argv) +# 语言载入 +trans = QtCore.QTranslator() +trans.load(f"{programPath}/LANG/deepin-wine-runner-en_US.qm") +app.installTranslator(trans) window = QtWidgets.QMainWindow() widget = QtWidgets.QWidget() window.setCentralWidget(widget) @@ -1390,25 +1404,25 @@ leftUp = QtWidgets.QWidget() mainLayout.addWidget(leftUp, 0, 0, 1, 1) leftUpLayout = QtWidgets.QGridLayout() leftUp.setLayout(leftUpLayout) -fastLabel = QtWidgets.QLabel("快速启动") +fastLabel = QtWidgets.QLabel(QtCore.QCoreApplication.translate("U", "快速启动")) fastLabel.setStyleSheet("font: 30px;") leftUpLayout.addWidget(fastLabel, 0, 0, 1, 2) leftUpLayout.addWidget(QtWidgets.QLabel("
"), 1, 0, 1, 2) -leftUpLayout.addWidget(QtWidgets.QLabel("请选择容器路径:"), 2, 0, 1, 1) +leftUpLayout.addWidget(QtWidgets.QLabel(QtCore.QCoreApplication.translate("U", "请选择容器路径:")), 2, 0, 1, 1) e1 = QtWidgets.QComboBox() e1.setEditable(True) leftUpLayout.addWidget(e1, 3, 0, 1, 1) button1 = QtWidgets.QPushButton("浏览") button1.clicked.connect(liulanbutton) leftUpLayout.addWidget(button1, 3, 1, 1, 1) -leftUpLayout.addWidget(QtWidgets.QLabel("请选择要执行的程序:"), 4, 0, 1, 1) +leftUpLayout.addWidget(QtWidgets.QLabel(QtCore.QCoreApplication.translate("U", "请选择要执行的程序:")), 4, 0, 1, 1) e2 = QtWidgets.QComboBox() e2.setEditable(True) leftUpLayout.addWidget(e2, 5, 0, 1, 1) -button2 = QtWidgets.QPushButton("浏览") +button2 = QtWidgets.QPushButton(QtCore.QCoreApplication.translate("U", "浏览")) button2.clicked.connect(liulanexebutton) leftUpLayout.addWidget(button2, 5, 1, 1, 1) -leftUpLayout.addWidget(QtWidgets.QLabel("请选择WINE版本:"), 6, 0, 1, 1) +leftUpLayout.addWidget(QtWidgets.QLabel(QtCore.QCoreApplication.translate("U", "请选择WINE版本:")), 6, 0, 1, 1) o1 = QtWidgets.QComboBox() leftUpLayout.addWidget(o1, 7, 0, 1, 1) # 设置空间权重 @@ -1420,58 +1434,58 @@ leftDown = QtWidgets.QWidget() mainLayout.addWidget(leftDown, 1, 0, 1, 1) leftDownLayout = QtWidgets.QVBoxLayout() leftDown.setLayout(leftDownLayout) -highLabel = QtWidgets.QLabel("高级功能") +highLabel = QtWidgets.QLabel(QtCore.QCoreApplication.translate("U", "高级功能")) highLabel.setStyleSheet("font: 30px;") leftDownLayout.addWidget(highLabel) leftDownLayout.addWidget(QtWidgets.QLabel("
")) -leftDownLayout.addWidget(QtWidgets.QLabel("创建快捷方式(Desktop文件):")) +leftDownLayout.addWidget(QtWidgets.QLabel(QtCore.QCoreApplication.translate("U", "创建快捷方式(Desktop文件):"))) createDesktopLink = QtWidgets.QHBoxLayout() -label_r_2 = QtWidgets.QLabel("名称:") +label_r_2 = QtWidgets.QLabel(QtCore.QCoreApplication.translate("U", "名称:")) createDesktopLink.addWidget(label_r_2) combobox1 = QtWidgets.QComboBox() combobox1.setEditable(True) createDesktopLink.addWidget(combobox1) -button5 = QtWidgets.QPushButton("创建到桌面") +button5 = QtWidgets.QPushButton(QtCore.QCoreApplication.translate("U", "创建到桌面")) button5.clicked.connect(make_desktop_on_desktop) createDesktopLink.addWidget(button5) -saveDesktopFileOnLauncher = QtWidgets.QPushButton("创建到开始菜单") +saveDesktopFileOnLauncher = QtWidgets.QPushButton(QtCore.QCoreApplication.translate("U", "创建到开始菜单")) saveDesktopFileOnLauncher.clicked.connect(make_desktop_on_launcher) createDesktopLink.addWidget(saveDesktopFileOnLauncher) leftDownLayout.addLayout(createDesktopLink) programManager = QtWidgets.QGridLayout() leftDownLayout.addLayout(programManager) -programManager.addWidget(QtWidgets.QLabel("程序管理:"), 0, 0, 1, 1) -getProgramIcon = QtWidgets.QPushButton("提取图标") +programManager.addWidget(QtWidgets.QLabel(QtCore.QCoreApplication.translate("U", "程序管理:")), 0, 0, 1, 1) +getProgramIcon = QtWidgets.QPushButton(QtCore.QCoreApplication.translate("U", "提取图标")) getProgramIcon.clicked.connect(lambda: RunWineProgram(f"{programPath}/BeCyIconGrabber.exe' 'z:/{e2.currentText()}")) programManager.addWidget(getProgramIcon, 1, 0, 1, 1) programManager.addWidget(QtWidgets.QLabel(" "*5), 1, 1, 1, 1) -trasButton = QtWidgets.QPushButton("窗口透明工具") +trasButton = QtWidgets.QPushButton(QtCore.QCoreApplication.translate("U", "窗口透明工具")) trasButton.clicked.connect(lambda: RunWineProgram(f"{programPath}/窗体透明度设置工具.exe")) programManager.addWidget(trasButton, 1, 2, 1, 1) -uninstallProgram = QtWidgets.QPushButton("卸载程序") +uninstallProgram = QtWidgets.QPushButton(QtCore.QCoreApplication.translate("U", "卸载程序")) uninstallProgram.clicked.connect(lambda: RunWineProgram(f"{programPath}/geek.exe")) programManager.addWidget(QtWidgets.QLabel(" "*5), 1, 3, 1, 1) programManager.addWidget(uninstallProgram, 1, 4, 1, 1) -miniAppStore = QtWidgets.QPushButton("微型应用商店") +miniAppStore = QtWidgets.QPushButton(QtCore.QCoreApplication.translate("U", "微型应用商店")) miniAppStore.clicked.connect(lambda: threading.Thread(target=MiniAppStore).start()) programManager.addWidget(QtWidgets.QLabel(" "*5), 1, 5, 1, 1) programManager.addWidget(miniAppStore, 1, 6, 1, 1) programManager.addWidget(QtWidgets.QLabel(" "*5), 1, 7, 1, 1) -getProgramStatus = QtWidgets.QPushButton("获取该程序运行情况") +getProgramStatus = QtWidgets.QPushButton(QtCore.QCoreApplication.translate("U", "获取该程序运行情况")) getProgramStatus.clicked.connect(ProgramRunStatusShow.ShowWindow) programManager.addWidget(getProgramStatus, 1, 8, 1, 1) programManager.addItem(QtWidgets.QSpacerItem(20, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum), 1, 9, 1, 1) -programManager.addWidget(QtWidgets.QLabel("WINE配置:"), 2, 0, 1, 1) -wineConfig = QtWidgets.QPushButton("配置容器") +programManager.addWidget(QtWidgets.QLabel(QtCore.QCoreApplication.translate("U", "WINE配置:")), 2, 0, 1, 1) +wineConfig = QtWidgets.QPushButton(QtCore.QCoreApplication.translate("U", "配置容器")) wineConfig.clicked.connect(lambda: RunWineProgram("winecfg")) programManager.addWidget(wineConfig, 3, 0, 1, 1) -fontAppStore = QtWidgets.QPushButton("字体商店") +fontAppStore = QtWidgets.QPushButton(QtCore.QCoreApplication.translate("U", "字体商店")) fontAppStore.clicked.connect(FontAppStore) programManager.addWidget(fontAppStore, 3, 2, 1, 1) -button_r_6 = QtWidgets.QPushButton("安装自定义字体") +button_r_6 = QtWidgets.QPushButton(QtCore.QCoreApplication.translate("U", "安装自定义字体")) button_r_6.clicked.connect(OpenWineFontPath) programManager.addWidget(button_r_6, 3, 4, 1, 1) -sparkWineSetting = QtWidgets.QPushButton("星火wine配置") +sparkWineSetting = QtWidgets.QPushButton(QtCore.QCoreApplication.translate("U", "星火wine配置")) sparkWineSetting.clicked.connect(lambda: threading.Thread(target=os.system, args=["/opt/durapps/spark-dwine-helper/spark-dwine-helper-settings/settings.sh"]).start()) programManager.addWidget(sparkWineSetting, 3, 6, 1, 1) # 权重 @@ -1488,7 +1502,7 @@ returnText.setStyleSheet(""" background-color: black; color: white; """) -returnText.setText("在此可以看到wine安装应用时的终端输出内容") +returnText.setText(QtCore.QCoreApplication.translate("U", "在此可以看到wine安装应用时的终端输出内容")) mainLayout.setRowStretch(0, 2) mainLayout.setRowStretch(1, 1) mainLayout.setColumnStretch(0, 2) @@ -1496,7 +1510,7 @@ mainLayout.setColumnStretch(1, 1) mainLayout.addWidget(returnText, 0, 1, 2, 1) # 版权 -copy = QtWidgets.QLabel(f"""\n程序版本:{version} +copy = QtWidgets.QLabel(f"""\n程序版本:{version},提示:Wine 无法运行所有的 Windows 程序,如果想要运行更多可执行程序,可以考虑虚拟机和双系统
©2020~{time.strftime("%Y")} gfdgd xi、为什么您不喜欢熊出没和阿布呢""") mainLayout.addWidget(copy, 2, 0, 1, 1) @@ -1505,26 +1519,26 @@ programRun = QtWidgets.QWidget() programRunLayout = QtWidgets.QHBoxLayout() programRun.setLayout(programRunLayout) programRunLayout.addItem(QtWidgets.QSpacerItem(20, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)) -button3 = QtWidgets.QPushButton("运行程序") +button3 = QtWidgets.QPushButton(QtCore.QCoreApplication.translate("U", "运行程序")) button3.clicked.connect(runexebutton) programRunLayout.addWidget(button3) -killProgram = QtWidgets.QPushButton("终止程序") +killProgram = QtWidgets.QPushButton(QtCore.QCoreApplication.translate("U", "终止程序")) killProgram.clicked.connect(KillProgram) programRunLayout.addWidget(killProgram) mainLayout.addWidget(programRun, 2, 1, 1, 1) # 菜单栏 menu = window.menuBar() -programmenu = menu.addMenu("程序(&P)") -p1 = QtWidgets.QAction("安装 wine(&I)") -installWineOnDeepin23 = QtWidgets.QAction("安装 wine(只限Deepin23)") -installWineHQ = QtWidgets.QAction("安装 WineHQ") -installMoreWine = QtWidgets.QAction("安装更多 Wine") -p2 = QtWidgets.QAction("设置程序(&S)") -p3 = QtWidgets.QAction("清空软件历史记录(&C)") -cleanCache = QtWidgets.QAction("清空软件缓存") -cleanProgramUnuse = QtWidgets.QAction("删除程序组件") -p4 = QtWidgets.QAction("退出程序(&E)") +programmenu = menu.addMenu(QtCore.QCoreApplication.translate("U", "程序(&P)")) +p1 = QtWidgets.QAction(QtCore.QCoreApplication.translate("U", "安装 wine(&I)")) +installWineOnDeepin23 = QtWidgets.QAction(QtCore.QCoreApplication.translate("U", "安装 wine(只限Deepin23)")) +installWineHQ = QtWidgets.QAction(QtCore.QCoreApplication.translate("U", "安装 WineHQ")) +installMoreWine = QtWidgets.QAction(QtCore.QCoreApplication.translate("U", "安装更多 Wine")) +p2 = QtWidgets.QAction(QtCore.QCoreApplication.translate("U", "设置程序(&S)")) +p3 = QtWidgets.QAction(QtCore.QCoreApplication.translate("U", "清空软件历史记录(&C)")) +cleanCache = QtWidgets.QAction(QtCore.QCoreApplication.translate("U", "清空软件缓存")) +cleanProgramUnuse = QtWidgets.QAction(QtCore.QCoreApplication.translate("U", "删除程序组件")) +p4 = QtWidgets.QAction(QtCore.QCoreApplication.translate("U", "退出程序(&E)")) programmenu.addAction(p1) programmenu.addAction(installWineOnDeepin23) programmenu.addAction(installWineHQ) @@ -1547,17 +1561,17 @@ cleanCache.triggered.connect(CleanProgramCache) cleanProgramUnuse.triggered.connect(CleanProgram) p4.triggered.connect(window.close) -wineOption = menu.addMenu("Wine(&W)") -w1 = QtWidgets.QAction("打开 Wine 容器目录") -w2 = QtWidgets.QAction("安装常见字体") -w3 = QtWidgets.QAction("安装自定义字体") -w4 = QtWidgets.QAction("删除选择的 Wine 容器") -cleanBottonUOS = QtWidgets.QAction("清理 Wine 容器(基于 Wine 适配活动脚本)") -w5 = QtWidgets.QAction("打包 wine 应用") -w6 = QtWidgets.QAction("使用官方 Wine 适配活动的脚本进行打包") -w7 = QtWidgets.QAction("从镜像获取DLL(只支持Windows XP、Windows Server 2003官方安装镜像)") -updateGeek = QtWidgets.QAction("从 Geek Uninstaller 官网升级程序") -deleteDesktopIcon = QtWidgets.QAction("删除所有 Wine 程序在启动器的快捷方式") +wineOption = menu.addMenu(QtCore.QCoreApplication.translate("U", "Wine(&W)")) +w1 = QtWidgets.QAction(QtCore.QCoreApplication.translate("U", "打开 Wine 容器目录")) +w2 = QtWidgets.QAction(QtCore.QCoreApplication.translate("U", "安装常见字体")) +w3 = QtWidgets.QAction(QtCore.QCoreApplication.translate("U", "安装自定义字体")) +w4 = QtWidgets.QAction(QtCore.QCoreApplication.translate("U", "删除选择的 Wine 容器")) +cleanBottonUOS = QtWidgets.QAction(QtCore.QCoreApplication.translate("U", "清理 Wine 容器(基于 Wine 适配活动脚本)")) +w5 = QtWidgets.QAction(QtCore.QCoreApplication.translate("U", "打包 wine 应用")) +w6 = QtWidgets.QAction(QtCore.QCoreApplication.translate("U", "使用官方 Wine 适配活动的脚本进行打包")) +w7 = QtWidgets.QAction(QtCore.QCoreApplication.translate("U", "从镜像获取DLL(只支持Windows XP、Windows Server 2003官方安装镜像)")) +updateGeek = QtWidgets.QAction(QtCore.QCoreApplication.translate("U", "从 Geek Uninstaller 官网升级程序")) +deleteDesktopIcon = QtWidgets.QAction(QtCore.QCoreApplication.translate("U", "删除所有 Wine 程序在启动器的快捷方式")) wineOption.addAction(w1) wineOption.addAction(w2) wineOption.addAction(w3) @@ -1571,26 +1585,26 @@ wineOption.addAction(w7) wineOption.addSeparator() wineOption.addAction(updateGeek) wineOption.addSeparator() -wm1 = wineOption.addMenu("在指定 Wine、容器安装组件") -wm1_1 = QtWidgets.QAction("在指定wine、指定容器安装 .net framework") -wm1_2 = QtWidgets.QAction("在指定wine、指定容器安装 Visual Studio C++") -wm1_3 = QtWidgets.QAction("在指定wine、指定容器安装 MSXML") -wm1_4 = QtWidgets.QAction("在指定wine、指定容器安装 gecko") -wm1_5 = QtWidgets.QAction("在指定wine、指定容器安装 mono") -wm1_6 = QtWidgets.QAction("在指定wine、指定容器安装其它运行库") +wm1 = wineOption.addMenu(QtCore.QCoreApplication.translate("U", "在指定 Wine、容器安装组件")) +wm1_1 = QtWidgets.QAction(QtCore.QCoreApplication.translate("U", "在指定wine、指定容器安装 .net framework")) +wm1_2 = QtWidgets.QAction(QtCore.QCoreApplication.translate("U", "在指定wine、指定容器安装 Visual Studio C++")) +wm1_3 = QtWidgets.QAction(QtCore.QCoreApplication.translate("U", "在指定wine、指定容器安装 MSXML")) +wm1_4 = QtWidgets.QAction(QtCore.QCoreApplication.translate("U", "在指定wine、指定容器安装 gecko")) +wm1_5 = QtWidgets.QAction(QtCore.QCoreApplication.translate("U", "在指定wine、指定容器安装 mono")) +wm1_6 = QtWidgets.QAction(QtCore.QCoreApplication.translate("U", "在指定wine、指定容器安装其它运行库")) wm1.addAction(wm1_1) wm1.addAction(wm1_2) wm1.addAction(wm1_3) wm1.addAction(wm1_4) wm1.addAction(wm1_5) wm1.addAction(wm1_6) -wm2 = wineOption.addMenu("在指定 Wine、容器运行基础应用") -wm2_1 = QtWidgets.QAction("打开指定wine、指定容器的控制面板") -wm2_2 = QtWidgets.QAction("打开指定wine、指定容器的浏览器") -wm2_3 = QtWidgets.QAction("打开指定wine、指定容器的注册表") -wm2_4 = QtWidgets.QAction("打开指定wine、指定容器的任务管理器") -wm2_5 = QtWidgets.QAction("打开指定wine、指定容器的资源管理器") -wm2_6 = QtWidgets.QAction("打开指定wine、指定容器的关于 wine") +wm2 = wineOption.addMenu(QtCore.QCoreApplication.translate("U", "在指定 Wine、容器运行基础应用")) +wm2_1 = QtWidgets.QAction(QtCore.QCoreApplication.translate("U", "打开指定wine、指定容器的控制面板")) +wm2_2 = QtWidgets.QAction(QtCore.QCoreApplication.translate("U", "打开指定wine、指定容器的浏览器")) +wm2_3 = QtWidgets.QAction(QtCore.QCoreApplication.translate("U", "打开指定wine、指定容器的注册表")) +wm2_4 = QtWidgets.QAction(QtCore.QCoreApplication.translate("U", "打开指定wine、指定容器的任务管理器")) +wm2_5 = QtWidgets.QAction(QtCore.QCoreApplication.translate("U", "打开指定wine、指定容器的资源管理器")) +wm2_6 = QtWidgets.QAction(QtCore.QCoreApplication.translate("U", "打开指定wine、指定容器的关于 wine")) wm2.addAction(wm2_1) wm2.addAction(wm2_2) wm2.addAction(wm2_3) @@ -1598,29 +1612,29 @@ wm2.addAction(wm2_4) wm2.addAction(wm2_5) wm2.addAction(wm2_6) wineOption.addSeparator() -w8 = QtWidgets.QAction("设置 run_v3.sh 的文管为 Deepin 默认文管") -w9 = QtWidgets.QAction("设置 run_v3.sh 的文管为 Wine 默认文管") -w10 = QtWidgets.QAction("重新安装 deepin-wine-helper") -w11 = QtWidgets.QAction("使用winetricks打开指定容器") +w8 = QtWidgets.QAction(QtCore.QCoreApplication.translate("U", "设置 run_v3.sh 的文管为 Deepin 默认文管")) +w9 = QtWidgets.QAction(QtCore.QCoreApplication.translate("U", "设置 run_v3.sh 的文管为 Wine 默认文管")) +w10 = QtWidgets.QAction(QtCore.QCoreApplication.translate("U", "重新安装 deepin-wine-helper")) +w11 = QtWidgets.QAction(QtCore.QCoreApplication.translate("U", "使用winetricks打开指定容器")) wineOption.addAction(w8) wineOption.addAction(w9) wineOption.addAction(w10) wineOption.addSeparator() wineOption.addAction(w11) wineOption.addSeparator() -wm3 = wineOption.addMenu("启用/禁用 opengl") -wm3_1 = QtWidgets.QAction("开启 opengl") -wm3_2 = QtWidgets.QAction("禁用 opengl") +wm3 = wineOption.addMenu(QtCore.QCoreApplication.translate("U", "启用/禁用 opengl")) +wm3_1 = QtWidgets.QAction(QtCore.QCoreApplication.translate("U", "开启 opengl")) +wm3_2 = QtWidgets.QAction(QtCore.QCoreApplication.translate("U", "禁用 opengl")) wm3.addAction(wm3_1) wm3.addAction(wm3_2) -wm4 = wineOption.addMenu("安装/卸载 winbind") -wm4_1 = QtWidgets.QAction("安装 winbind") -wm4_2 = QtWidgets.QAction("卸载 winbind") +wm4 = wineOption.addMenu(QtCore.QCoreApplication.translate("U", "安装/卸载 winbind")) +wm4_1 = QtWidgets.QAction(QtCore.QCoreApplication.translate("U", "安装 winbind")) +wm4_2 = QtWidgets.QAction(QtCore.QCoreApplication.translate("U", "卸载 winbind")) wm4.addAction(wm4_1) wm4.addAction(wm4_2) -dxvkMenu = wineOption.addMenu("安装/卸载 DXVK") -installDxvk = QtWidgets.QAction("安装 DXVK") -uninstallDxvk = QtWidgets.QAction("卸载 DXVK") +dxvkMenu = wineOption.addMenu(QtCore.QCoreApplication.translate("U", "安装/卸载 DXVK")) +installDxvk = QtWidgets.QAction(QtCore.QCoreApplication.translate("U", "安装 DXVK")) +uninstallDxvk = QtWidgets.QAction(QtCore.QCoreApplication.translate("U", "卸载 DXVK")) dxvkMenu.addAction(installDxvk) dxvkMenu.addAction(uninstallDxvk) wineOption.addSeparator() @@ -1658,15 +1672,15 @@ installDxvk.triggered.connect(InstallDXVK) uninstallDxvk.triggered.connect(UninstallDXVK) deleteDesktopIcon.triggered.connect(DeleteDesktopIcon) -virtualMachine = menu.addMenu("虚拟机(&V)") -v1 = QtWidgets.QAction("使用 Virtualbox 虚拟机运行 Windows 应用") +virtualMachine = menu.addMenu(QtCore.QCoreApplication.translate("U", "虚拟机(&V)")) +v1 = QtWidgets.QAction(QtCore.QCoreApplication.translate("U", "使用 Virtualbox 虚拟机运行 Windows 应用")) virtualMachine.addAction(v1) v1.triggered.connect(RunVM) -safeWebsize = menu.addMenu("云沙箱(&C)") -s1 = QtWidgets.QAction("360 沙箱云") -s2 = QtWidgets.QAction("微步云沙箱") -s3 = QtWidgets.QAction("VIRUSTOTAL") +safeWebsize = menu.addMenu(QtCore.QCoreApplication.translate("U", "云沙箱(&C)")) +s1 = QtWidgets.QAction(QtCore.QCoreApplication.translate("U", "360 沙箱云")) +s2 = QtWidgets.QAction(QtCore.QCoreApplication.translate("U", "微步云沙箱")) +s3 = QtWidgets.QAction(QtCore.QCoreApplication.translate("U", "VIRUSTOTAL")) safeWebsize.addAction(s1) safeWebsize.addAction(s2) safeWebsize.addAction(s3) @@ -1674,15 +1688,15 @@ s1.triggered.connect(lambda: webbrowser.open_new_tab("https://ata.360.net/")) s2.triggered.connect(lambda: webbrowser.open_new_tab("https://s.threatbook.cn/")) s3.triggered.connect(lambda: webbrowser.open_new_tab("https://www.virustotal.com/")) -help = menu.addMenu("帮助(&H)") -h1 = QtWidgets.QAction("程序官网") -h2 = QtWidgets.QAction("小提示") -h3 = QtWidgets.QAction("更新内容") -h4 = QtWidgets.QAction("谢明名单") -h5 = QtWidgets.QAction("更新这个程序") -h6 = QtWidgets.QAction("反馈这个程序的建议和问题") -h7 = QtWidgets.QAction("关于这个程序") -h8 = QtWidgets.QAction("关于 Qt") +help = menu.addMenu(QtCore.QCoreApplication.translate("U", "帮助(&H)")) +h1 = QtWidgets.QAction(QtCore.QCoreApplication.translate("U", "程序官网")) +h2 = QtWidgets.QAction(QtCore.QCoreApplication.translate("U", "小提示")) +h3 = QtWidgets.QAction(QtCore.QCoreApplication.translate("U", "更新内容")) +h4 = QtWidgets.QAction(QtCore.QCoreApplication.translate("U", "谢明名单")) +h5 = QtWidgets.QAction(QtCore.QCoreApplication.translate("U", "更新这个程序")) +h6 = QtWidgets.QAction(QtCore.QCoreApplication.translate("U", "反馈这个程序的建议和问题")) +h7 = QtWidgets.QAction(QtCore.QCoreApplication.translate("U", "关于这个程序")) +h8 = QtWidgets.QAction(QtCore.QCoreApplication.translate("U", "关于 Qt")) help.addAction(h1) help.addSeparator() help.addAction(h2) @@ -1694,8 +1708,8 @@ help.addAction(h6) help.addAction(h7) help.addAction(h8) help.addSeparator() -hm1 = help.addMenu("更多生态适配应用") -hm1_1 = QtWidgets.QAction("运行 Android 应用:UEngine 运行器") +hm1 = help.addMenu(QtCore.QCoreApplication.translate("U", "更多生态适配应用")) +hm1_1 = QtWidgets.QAction(QtCore.QCoreApplication.translate("U", "运行 Android 应用:UEngine 运行器")) hm1.addAction(hm1_1) h1.triggered.connect(OpenProgramURL) h2.triggered.connect(helps) diff --git a/package-script/information.json b/package-script/information.json index 8eb5182..b99f081 100755 --- a/package-script/information.json +++ b/package-script/information.json @@ -1,3 +1,3 @@ { - "Version": "2.0.0-2" + "Version": "2.0.1" } diff --git a/wine/installwine b/wine/installwine old mode 100755 new mode 100644 index d7322c1de3f3fed8b23a2000700731c12114cc47..578af4e246c75655a8b84f313fae80950bf58f9a GIT binary patch literal 12738 zcmc&*>vI%U7XQv)(K~#wvm`x$uGX?*m4Le00we-jwMb2MW^QI$db-E%o;SdrxoJXtb|<+rIi``_sFfk8bVUv?)GysdM?=hl}T0OQ+&1w^pux zR$;6Gtb?!a?<`*I-ua_Eu}NwS^S%?zQgspW}h}Uh2XhcsTkb4eif?`$-}$Arv*S+&id*%ZuAU=M%yL_p2 z?{??bd-41%_KB~}x8~nB_6Z9Z&^A7gM1L{bpS>F|%>R)p$}5|8U;H>e`DOde^vacK zY#q=4yLZD4PQBp=k>Q8wr?A$H99Mpuk_&HzzL!3Z0=vvc?edZILBQT_vM>raj0Ju@ z5i%h?67BQ@HfW4QuQVO{^M+HYGJt}`gTn?)6#p>&aB-%4`gVNwR_CK@?U@S?7td@c zyLK2F2c6O$+wtCTyox_z`lD~Lax}1QgMpt48#6){H5&&VGi2`Appii)AOw~@v;h4o zr?A(qGqaGb6b3lO9C*M&=O{Cu{p-_%#xt9r$zW(VtIRy8!4=XN+cUwe5%J8-=&yyE z=SriiFvd3>XF=qYZFjdlscleWHg)2m7F~>um60xz<_aaCY?y-Za#HrlG}*Ad z3Osjh!JtUu!3^cLId}l1^(6hBfj0(UzAa^2(75s$M7%=~~NMTcYJytuXiZ zvMNdBS(OWq$ErkASe2UIqO0`(Zuu<=lVpYd=T42rx}9?94kB;hF(k*|7dY~C@}|kJ z=PlG<3^jb@DdYsvr7UeFe^j;5yFrdX9zeJI`XfC_zTP;W*HWH`yq22YQKz9ZwzI~{ zN05ddeZo0%enCf zU$)(FO-MDF%B>z(aEYk!BqK$xC{iK?b<`5Huj9$GmS_HepcjnARO=FL3cu(f=(^YJA#X03aG zyuC7gX645Hl@m+&(3!i}n*XqU_UHC5GicR_l?~L5y~gayZYqC=y)i$ib4!{@D;5P) zqHUultLplrwrlW8^dIOesW6s?9&=m<&+r?}Gsg<=Gy=aG*!6vOR6ACjfEHW;Thxsf zVBtUs9U3`MAQ;Q_?Mi48O)CIq79c_tUh=A>0>4^7j_C=sOC-?AH!wDKC-TSCo1z>-#~lU)T{0x^T+(v@95WTtq? zCd;f5Wqjc@iGJN`1jyedtS6AfhY}9=urRc%40+5d2M%vF6D2^`D<56z-n|R0XXJ#L z1wA;yMgu;za`p50)XDhH{rKwX&hi50NNDX144jfdjC7UZq~_`4Es2AqwT9*+8x>k& zm}QikflK2R8plkZ=wA9Dp7}l*yBL_#80mPzh-c4tr_Z%7-fulv1~8^Ge6n?(fQSfp z!u+nfE2Xq73^B+*Q)oJ%`~7B6X2*(7=KsP|2doI^To~u^+)lb&x=*T$%(`oN+@Z~f zGe23w;oxlP1|$d_$o~G8%w=}@6CNF{12ulC(!3$QCPzMVCbBR;XFS+9rrwVBJ5|qi z%`gfCdl~FYL4Z?6^ORMAch+pL%62)n>sR|iDjvO$!Uw!sKo8>ZM%gd1_seJw!&+ZL z0)S#$sRXE~RN`rN(BM%?lHI1Bq5O_Au))8!8IX9;2<>r30WJAT=a&*|@^u^|0*zui zHyFgsE2-|b8Kb`M4jLJ8DoN9)JZ=!yfHCxfvDf!l<}Ez=RZ`vQa!6_%h}b%agSFjA zPX!;K&>RAs3tju!H1j-F+?sb8ui z2qidVQRj)$9Z@6C2$~)b3yLH3*c$WrnK=yoMfDcnysz1^;wT|+WS0XU)Yj7jM#m^u z61}4xNIGlB3K}l%JNQkFDEG9b$f+~TkwJB{_IwOav^*#GKs-SBiV*bc+x4c9lwrFr z4c&l^Fl%Bcf{Kd;;h_SW2%0Ppxy-9ZwZh>6!${d`PcP7o%J;Jx2cuIF3#p#$;cdc+ zYU0SGN8AFGWqio4g0rm*}U}` z#f$=1{C36!fnM)Vp*E(`bkq*4W}`w4F)5+}j*Oxa)=*38c1!rP8c7LX&9b9FGI`*GBj5LOgqMRg-adqLaD1 zr_+vSwMbt z(3Glu3aWi-(0J;pfm|FV{c1en;Efduh58YS-a`%JO+;quQr|3Wc_-+L~r2zkt7f%uI3 zKU}xDR#+oH%X_ILmN=WrlO6&x$bR02fLTTr4GX0m1gd9xlFNT(=>~@i$!$FXc-=t{ zLF^4N`aNn3X4fm%Va);wD;C5Kcw@(dc{+HotfFf-y>d+`B;iLFHKj0NJJHL2AleEH zPjx8nwPH;K;%xcJ>KRTjt7LfpBq(RK5V9Y}F|tpmq9wzi?hJWq%ufu?Kbh+K^h-+P(gvwg%7Xh zpA%sPB`Q8&Cj^tD36o??yX{ft@<|;6iAM3*o*l(^GNSm3c+MvryOP#Lm^vMUq0iPX z_-W&pJbToYL-wS>9yuURe#9GW91!Z_1ZCeV$>C+GjFIUPaxwv4uK5@P0lZ&Bj|oSB zDs0%Rut_vI0Y*+jQeN6{#OIC8S;Tn~M=0QRoc0wO7q;$w*IHO;Eq#o+A!aS@Pp-Fr z`na?3b!Xu_CFfym+zdQ^5>v${{bD+gNCzH=glvZoZ4n1|jU4o-wgvJ!#&%w%@>{o_ zEjAy{v_NtHNi`Aw`eSEdHokMF`^8DTN+jM7q5%uOJX|~uo#5phdSUA3c>#onigIXc zMM2J(3A4)n*K)%2erCYfL>3oQW%V(H+^W>G8aiAr#m`;aNK*YlQbUR1Kx(IK00w4K z5VEB(ZaQ&LRH+}?#23r9S5Bs~;@UB^MwAQm0%{YCof9PqU^+y*oKQVQq`B<;f;BKS zjC$Wp8dLr`Ulkz8E3bkj>Cg(tt7(~)QQXP7OfK~W7x|zeHWgPCV}(S!Xq zeMOE9`?%h*-=?o7@{Js@WB}NukKAPP5=<$hpj7v~SCe1`L}~dYwOP;ZTMiFOAb0_< z-^j4LQMhRlc;ClWGl50n6WdgxhrSw7MuhABrWQ;5ai#KRq0 zpDbNyEnV;2xD(&G-2LjfxCDwXeDZMd8oFmhivINW`dKX0f)N>5a}cXvf-(NUl+u3h z8<|p+FsX2*&0V}?@R*;NXs&l?T~ZuYnt|S74Q(XsE#gjqZldmwv)33j5<26|ol>g6 zwA7_yJOMO0tD6ko*C~_`2%m&md7P-tLou+v38Px%^Zrl_BHp5Fw4{-wmM@JNN=M0| z^Y#52`I)rT-`Uo#G7G|I@rG!87Vqe$sWM+TXLWDC8DRg7*C;|Wa=9`ZN3c{P%auxW zdT0y0wA*To}YFDigx9*XdehZlG(qpq! zBCD240|U52qA5vt`J;I5GaCNkMLF(axVZ!!MW4zIz8Ox17TzNr7v2nXK2{JHf*c!a z_0-PqK=N*apAJ7c03r--ZTn>E-7oHa1s83+OPxT58e(4Q;C}1vdJ-7G9ImwZvO<~D zOj+vO{v@9LB6%5`d=hk!Jaw6}_YRUH+(hY^doNiKL?A&S!rw<0gv4X<8GWNHw@H_u zVZ78@z7fy<%9R0JS<_?A&1-s@gZdTxa!Z*Y`k~3iGkv zrgZVlC*2#j;@NZY=>-hBT8o$IKLb4YAZ1gJ_z?J|ibL=JRI8ZuqP&tt+l!-c6}ub_ z<5rsw`1krMs1zVQ4{s>TMst%lTd-7SYmhznkbpEAiZe_Vv@L^gYQO VT*GC4UunsSlfSY_RxX(X{{uvV15^M2 literal 92736 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 diff --git a/wine/installwine.out b/wine/installwine.out new file mode 100755 index 0000000000000000000000000000000000000000..d7322c1de3f3fed8b23a2000700731c12114cc47 GIT binary patch literal 92736 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 literal 0 HcmV?d00001 diff --git a/wine/installwine.py b/wine/installwine.py deleted file mode 100644 index 8342efb..0000000 --- a/wine/installwine.py +++ /dev/null @@ -1,18 +0,0 @@ -# 本来是用C++写的,但在非deepin/UOS编译/运行就是下载不了https文件,只能用python重写 -import sys -import PyQt5.QtWidgets as QtWidgets - -import mainwindowui - -# 继承至界面文件的主窗口类 -class MyMainWindow(mainwindowui.Ui_MainWindow): - def __init__(self, parent=None): - #pass - super(MyMainWindow, self).__init__(parent) - #self.setupUi(self) - -if __name__ == "__main__": - app = QtWidgets.QApplication(sys.argv) - window = MyMainWindow() - window.show() - app.exec_() \ No newline at end of file diff --git a/wine/mainwindowui.py b/wine/mainwindowui.py deleted file mode 100644 index 5f41903..0000000 --- a/wine/mainwindowui.py +++ /dev/null @@ -1,258 +0,0 @@ -import os -import sys -import json -import requests -from PyQt5 import QtCore, QtGui, QtWidgets - -class Ui_MainWindow(object): - def setupUi(self, MainWindow): - MainWindow.setObjectName("MainWindow") - MainWindow.resize(693, 404) - self.centralWidget = QtWidgets.QWidget(MainWindow) - self.centralWidget.setObjectName("centralWidget") - self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.centralWidget) - self.verticalLayout_2.setContentsMargins(11, 11, 11, 11) - self.verticalLayout_2.setSpacing(6) - self.verticalLayout_2.setObjectName("verticalLayout_2") - self.horizontalLayout_2 = QtWidgets.QHBoxLayout() - self.horizontalLayout_2.setSpacing(6) - self.horizontalLayout_2.setObjectName("horizontalLayout_2") - self.localWineList = QtWidgets.QListView(self.centralWidget) - self.localWineList.setObjectName("localWineList") - self.horizontalLayout_2.addWidget(self.localWineList) - self.verticalLayout = QtWidgets.QVBoxLayout() - self.verticalLayout.setSpacing(6) - self.verticalLayout.setObjectName("verticalLayout") - spacerItem = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) - self.verticalLayout.addItem(spacerItem) - self.addButton = QtWidgets.QPushButton(self.centralWidget) - self.addButton.setObjectName("addButton") - self.verticalLayout.addWidget(self.addButton) - self.delButton = QtWidgets.QPushButton(self.centralWidget) - self.delButton.setObjectName("delButton") - self.verticalLayout.addWidget(self.delButton) - spacerItem1 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) - self.verticalLayout.addItem(spacerItem1) - self.horizontalLayout_2.addLayout(self.verticalLayout) - self.internetWineList = QtWidgets.QListView(self.centralWidget) - self.internetWineList.setObjectName("internetWineList") - self.horizontalLayout_2.addWidget(self.internetWineList) - self.verticalLayout_2.addLayout(self.horizontalLayout_2) - self.horizontalLayout = QtWidgets.QHBoxLayout() - self.horizontalLayout.setSpacing(6) - self.horizontalLayout.setObjectName("horizontalLayout") - self.unzip = QtWidgets.QCheckBox(self.centralWidget) - self.unzip.setObjectName("unzip") - self.horizontalLayout.addWidget(self.unzip) - self.deleteZip = QtWidgets.QCheckBox(self.centralWidget) - self.deleteZip.setChecked(True) - self.deleteZip.setTristate(False) - self.deleteZip.setObjectName("deleteZip") - self.horizontalLayout.addWidget(self.deleteZip) - spacerItem2 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) - self.horizontalLayout.addItem(spacerItem2) - self.verticalLayout_2.addLayout(self.horizontalLayout) - MainWindow.setCentralWidget(self.centralWidget) - - self.retranslateUi(MainWindow) - QtCore.QMetaObject.connectSlotsByName(MainWindow) - - def retranslateUi(self, MainWindow): - _translate = QtCore.QCoreApplication.translate - MainWindow.setWindowTitle(_translate("MainWindow", "下载 Wine")) - self.addButton.setText(_translate("MainWindow", "<<")) - self.delButton.setText(_translate("MainWindow", ">>")) - self.unzip.setText(_translate("MainWindow", "不解压Wine资源文件")) - self.deleteZip.setText(_translate("MainWindow", "删除下载的资源包,只解压保留(两个选项都选相互抵消)")) - -def ReadLocalInformation(): - global localJsonList - file = open(f"{programPath}/winelist.json", "r") - localJsonList = json.loads(file.read()) - nmodel = QtGui.QStandardItemModel(window) - for i in localJsonList: - item = QtGui.QStandardItem(i) - nmodel.appendRow(item) - ui.localWineList.setModel(nmodel) - file.close() - -def ReadInternetInformation(): - global internetJsonList - # C++ 版本是用 curl 的,考虑到 Python 用 requests 反而方便,于是不用 curl - internetJsonList = json.loads(requests.get(f"{internetWineSource}/information.json").text) - nmodel = QtGui.QStandardItemModel(window) - for i in internetJsonList: - item = QtGui.QStandardItem(i[0]) - nmodel.appendRow(item) - ui.internetWineList.setModel(nmodel) - -class DownloadThread(QtCore.QThread): - MessageBoxInfo = QtCore.pyqtSignal(str) - MessageBoxError = QtCore.pyqtSignal(str) - ChangeDialog = QtCore.pyqtSignal(QtWidgets.QProgressDialog, int, int, int) - Finish = QtCore.pyqtSignal() - def __init__(self, progressDialog: QtWidgets.QProgressDialog, - url: str, savePath: str, fileName: str, view: QtWidgets.QListView, deleteZip: bool, - unzip: bool, localList) -> None: - self.dialog = progressDialog - self.fileUrl = url - self.fileSavePath = savePath - self.fileSaveName = fileName - self.localView = view - self.downloadDeleteZip = deleteZip - self.downloadUnzip = unzip - self.localJsonList = localList - super().__init__() - - def ReadLocalInformation(self): - file = open(f"{programPath}/winelist.json", "r"); - nmodel = QtGui.QStandardItemModel() - localJsonList = json.loads(file.read()) - for i in localJsonList: - nmodel.appendRow(QtGui.QStandardItem(i)) - self.localView.setModel(nmodel) - file.close() - - def run(self): - # 创建文件夹 - dir = QtCore.QDir() - savePath = f"{programPath}/{self.fileSaveName}" - # 文件下载 - timeout = 0 - f = requests.get(self.fileUrl, stream=True) - allSize = int(f.headers["content-length"]) # 文件总大小 - bytesRead = 0 - with open(savePath, "wb") as filePart: - for chunk in f.iter_content(chunk_size=1024): - if chunk: - #progressbar.update(int(part / show)) - filePart.write(chunk) - bytesRead += 1024 - self.ChangeDialog.emit(self.dialog, bytesRead / allSize * 100, bytesRead / 1024 / 1024, allSize / 1024 / 1024) - # 写入配置文件 - rfile = open(f"{programPath}/winelist.json", "r") - list = json.loads(rfile.read()) - rfile.close() - # C++ 版注释:不直接用 readwrite 是因为不能覆盖写入 - file = open(f"{programPath}/winelist.json", "w") - list.append(self.fileSaveName.replace(".7z", "")) - file.write(json.dumps(list)) - file.close() - # 读取配置文件 - self.ReadLocalInformation() - self.localJsonList = list - # 解压文件 - shellCommand = "" - if self.downloadUnzip: - path = f"{programPath}/{self.fileSaveName.replace('.7z', '')}" - shellCommand += f"""mkdir -p \"{path}\" -7z x \"{savePath}\" -o\"{path}\" -""" - if self.downloadDeleteZip: - shellCommand += f"rm -rf \"{savePath}\"\n" - shellFile = open("/tmp/depein-wine-runner-wine-install.sh", "w") - shellFile.write(shellCommand) - shellFile.close() - process = QtCore.QProcess() - command = ["deepin-terminal", "-e", "bash", "/tmp/depein-wine-runner-wine-install.sh"] - process.start(f"{programPath}/../launch.sh", command) - process.waitForFinished() - self.Finish.emit() - - -def MessageBoxInfo(info): - QtWidgets.QMessageBox.information(window, "提示", info) - -def MessageBoxError(info): - QtWidgets.QMessageBox.critical(window, "错误", info) - -def ChangeDialog(dialog: QtWidgets.QProgressDialog, value, downloadBytes, totalBytes): - dialog.setValue(value) - dialog.setLabelText(f"{downloadBytes}MB/{totalBytes}MB") - -def DownloadFinish(): - ui.centralWidget.setEnabled(True) - -class QT: - thread = None - -def on_addButton_clicked(): - choose = ui.internetWineList.currentIndex().row() - if choose < 0: - QtWidgets.QMessageBox.information(window, "提示", "您未选中任何项,无法继续") - return - downloadName = internetJsonList[choose][1] - ReadLocalInformation() - for i in localJsonList: - if i == internetJsonList[choose][0]: - QtWidgets.QMessageBox.information(window, "提示", "您已经安装了这个Wine了!无需重复安装!") - return - if(ui.deleteZip.isChecked() + ui.unzip.isChecked() == 2): - ui.deleteZip.setChecked(False) - ui.unzip.setChecked(False) - downloadUrl = internetWineSource + downloadName - dialog = QtWidgets.QProgressDialog() - cancel = QtWidgets.QPushButton("取消") - cancel.setDisabled(True) - dialog.setWindowIcon(QtGui.QIcon(f"{programPath}/../deepin-wine-runner.svg")) - dialog.setCancelButton(cancel) - dialog.setWindowTitle(f"正在下载“{internetJsonList[choose][0]}”") - QT.thread = DownloadThread( - dialog, - downloadUrl, - "", - internetJsonList[choose][1], - ui.localWineList, - ui.deleteZip.isChecked(), - not ui.unzip.isChecked(), - localJsonList - ) - QT.thread.MessageBoxInfo.connect(MessageBoxInfo) - QT.thread.MessageBoxError.connect(MessageBoxError) - QT.thread.ChangeDialog.connect(ChangeDialog) - QT.thread.Finish.connect(DownloadFinish) - ui.centralWidget.setDisabled(True) - QT.thread.start() - -def on_delButton_clicked(): - if QtWidgets.QMessageBox.question(window, "提示", "你确定要删除吗?") == QtWidgets.QMessageBox.No: - return - if ui.localWineList.currentIndex().row() < 0: - QtWidgets.QMessageBox.information(window, "提示", "您未选择任何项") - return - name = f"{programPath}/{localJsonList[ui.localWineList.currentIndex().row()]}" - dir = QtCore.QDir(name) - dir.removeRecursively() - QtCore.QFile.remove(name + ".7z") - del localJsonList[ui.localWineList.currentIndex().row()] - file = open(f"{programPath}/winelist.json", "w") - file.write(json.dumps(localJsonList)) - file.close() - ReadLocalInformation() - QtWidgets.QMessageBox.information(window, "提示", "删除成功!") - -if __name__ == "__main__": - localJsonList = [] - internetJsonList = [] - internetWineSource = "https://code.gitlink.org.cn/gfdgd_xi/wine-mirrors/raw/branch/master/" - programPath = os.path.split(os.path.realpath(__file__))[0] # 返回 string - app = QtWidgets.QApplication(sys.argv) - # 窗口构建 - window = QtWidgets.QMainWindow() - ui = Ui_MainWindow() - ui.setupUi(window) - window.show() - # 连接信号 - ui.addButton.clicked.connect(on_addButton_clicked) - ui.delButton.clicked.connect(on_delButton_clicked) - ## 加载内容 - # 设置列表双击不会编辑 - ui.localWineList.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers) - ui.internetWineList.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers) - # 读取信息 - ReadLocalInformation() - ReadInternetInformation() - # 图标 - ui.centralWidget.setWindowIcon(QtGui.QIcon(f"{programPath}/../deepin-wine-runner.svg")) - - app.exec_() \ No newline at end of file