mirror of
https://gitee.com/gfdgd-xi/deep-wine-runner
synced 2025-07-17 19:12:23 +08:00
Have finished log report maker
This commit is contained in:
parent
949fd1a07f
commit
07db3bf724
@ -1,6 +1,7 @@
|
|||||||
#!/usr/bin/env python3
|
#!/usr/bin/env python3
|
||||||
# 读取设置单独用一个 py 文件
|
# 读取设置单独用一个 py 文件
|
||||||
import os
|
import os
|
||||||
|
import sys
|
||||||
import json
|
import json
|
||||||
import base64
|
import base64
|
||||||
import shutil
|
import shutil
|
||||||
@ -8,7 +9,10 @@ import getpass
|
|||||||
import datetime
|
import datetime
|
||||||
import traceback
|
import traceback
|
||||||
import subprocess
|
import subprocess
|
||||||
|
import configparser
|
||||||
import PyQt5.QtGui as QtGui
|
import PyQt5.QtGui as QtGui
|
||||||
|
import PyQt5.QtCore as QtCore
|
||||||
|
import PyQt5.QtWidgets as QtWidgets
|
||||||
|
|
||||||
# 获取用户主目录
|
# 获取用户主目录
|
||||||
def get_home():
|
def get_home():
|
||||||
@ -43,6 +47,7 @@ defultProgramList = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
programPath = os.path.split(os.path.realpath(__file__))[0] # 返回 string
|
programPath = os.path.split(os.path.realpath(__file__))[0] # 返回 string
|
||||||
|
iconPath = "{}/deepin-wine-runner.svg".format(programPath)
|
||||||
try:
|
try:
|
||||||
setting = json.loads(readtxt(get_home() + "/.config/deepin-wine-runner/WineSetting.json"))
|
setting = json.loads(readtxt(get_home() + "/.config/deepin-wine-runner/WineSetting.json"))
|
||||||
information = json.loads(readtxt(f"{programPath}/information.json"))
|
information = json.loads(readtxt(f"{programPath}/information.json"))
|
||||||
@ -92,7 +97,10 @@ def FileToBase64(filePath):
|
|||||||
src += base64Byte.decode("utf-8")
|
src += base64Byte.decode("utf-8")
|
||||||
return src
|
return src
|
||||||
|
|
||||||
class SaveLog():
|
def SaveLogWindow():
|
||||||
|
pass
|
||||||
|
|
||||||
|
class SaveLogReport():
|
||||||
userName = getpass.getuser()
|
userName = getpass.getuser()
|
||||||
time = datetime.datetime.now().strftime("%Y/%m/%d %H:%M:%S")
|
time = datetime.datetime.now().strftime("%Y/%m/%d %H:%M:%S")
|
||||||
kernelVersion = subprocess.getoutput("uname -a")
|
kernelVersion = subprocess.getoutput("uname -a")
|
||||||
@ -104,8 +112,7 @@ class SaveLog():
|
|||||||
cpu = subprocess.getoutput("cat /proc/cpuinfo | grep 'model name' | head -n 1 | awk -F: '{print $2}'")
|
cpu = subprocess.getoutput("cat /proc/cpuinfo | grep 'model name' | head -n 1 | awk -F: '{print $2}'")
|
||||||
gpu = subprocess.getoutput("lspci | grep -i 'VGA\|3D\|2D'")
|
gpu = subprocess.getoutput("lspci | grep -i 'VGA\|3D\|2D'")
|
||||||
|
|
||||||
|
def __init__(self, chooseWineName, chooseWineCommand, runCommand, binPath, logOut, description="无", imgPath=[]) -> None:
|
||||||
def __init__(self, chooseWineName, chooseWineCommand, runCommand, binPath, logOut, description, imgPath=[]) -> None:
|
|
||||||
self.chooseWineName = chooseWineName
|
self.chooseWineName = chooseWineName
|
||||||
self.chooseWineCommand = chooseWineCommand
|
self.chooseWineCommand = chooseWineCommand
|
||||||
self.runCommand = runCommand
|
self.runCommand = runCommand
|
||||||
@ -138,11 +145,103 @@ class SaveLog():
|
|||||||
except:
|
except:
|
||||||
traceback.print_exc()
|
traceback.print_exc()
|
||||||
self.memoryInfo = traceback.format_exc()
|
self.memoryInfo = traceback.format_exc()
|
||||||
|
# 读取系统信息
|
||||||
|
try:
|
||||||
|
with open("/etc/os-release", "r") as file:
|
||||||
|
text = "[Default]\n" + file.read()
|
||||||
|
conf = configparser.ConfigParser()
|
||||||
|
conf.read_string(text)
|
||||||
|
self.systemVersion = conf.get("Default", "PRETTY_NAME")
|
||||||
|
except:
|
||||||
|
traceback.print_exc()
|
||||||
|
self.systemVersion = subprocess.getoutput("lsb_release -a")
|
||||||
|
|
||||||
|
def SetWindow(self):
|
||||||
|
def AddImageToListClicked():
|
||||||
|
choose = QtWidgets.QFileDialog.getOpenFileNames(messagebox, "选择图像", get_home(), "图片文件(*.png *.jpg *.bmp *.gif *.svg);;所有文件(*.*)")
|
||||||
|
print(choose)
|
||||||
|
for i in choose[0]:
|
||||||
|
if i in imageList:
|
||||||
|
continue
|
||||||
|
imageList.append(i)
|
||||||
|
nmodel = QtGui.QStandardItemModel(messagebox)
|
||||||
|
for i in imageList:
|
||||||
|
item = QtGui.QStandardItem(i)
|
||||||
|
nmodel.appendRow(item)
|
||||||
|
imageListView.setModel(nmodel)
|
||||||
|
|
||||||
|
def DeleteImageToListClicked():
|
||||||
|
index = imageListView.currentIndex().row()
|
||||||
|
if index < 0:
|
||||||
|
QtWidgets.QMessageBox.information(messagebox, "提示", "您未选择任何项")
|
||||||
|
return
|
||||||
|
del imageList[index]
|
||||||
|
nmodel = QtGui.QStandardItemModel(messagebox)
|
||||||
|
for i in imageList:
|
||||||
|
item = QtGui.QStandardItem(i)
|
||||||
|
nmodel.appendRow(item)
|
||||||
|
imageListView.setModel(nmodel)
|
||||||
|
# 选择第一项
|
||||||
|
imageListView.setCurrentIndex(nmodel.index(0, 0))
|
||||||
|
|
||||||
|
def OkClicked():
|
||||||
|
self.description = description.toPlainText()
|
||||||
|
self.imgPath = imageList
|
||||||
|
path = QtWidgets.QFileDialog.getSaveFileName(messagebox, "保存日志报告", get_home(), "7z 文件(*.7z);;所有文件(*.*)")
|
||||||
|
print(path)
|
||||||
|
if path[0] != "":
|
||||||
|
try:
|
||||||
|
self.To7z(path[0])
|
||||||
|
except:
|
||||||
|
traceback.print_exc()
|
||||||
|
QtWidgets.QMessageBox.critical(messagebox, "错误", traceback.format_exc())
|
||||||
|
return
|
||||||
|
messagebox.close()
|
||||||
|
QtWidgets.QMessageBox.information(messagebox, "提示", "生成完成!")
|
||||||
|
|
||||||
|
def CancelClicked():
|
||||||
|
messagebox.close()
|
||||||
|
|
||||||
|
# 权重
|
||||||
|
size = QtWidgets.QSizePolicy()
|
||||||
|
size.setHorizontalPolicy(0)
|
||||||
|
imageList = []
|
||||||
|
messagebox = QtWidgets.QDialog()
|
||||||
|
layout = QtWidgets.QGridLayout()
|
||||||
|
description = QtWidgets.QTextEdit()
|
||||||
|
imageListView = QtWidgets.QListView()
|
||||||
|
addImageToList = QtWidgets.QPushButton("+")
|
||||||
|
deleteImageToList = QtWidgets.QPushButton("-")
|
||||||
|
controlLayout = QtWidgets.QHBoxLayout()
|
||||||
|
ok = QtWidgets.QPushButton("保存")
|
||||||
|
cancel = QtWidgets.QPushButton("取消")
|
||||||
|
description.setPlaceholderText("可以填写故障的现象、复现步骤以及其他有关的信息,同时也可以填写联系方式")
|
||||||
|
addImageToList.clicked.connect(AddImageToListClicked)
|
||||||
|
deleteImageToList.clicked.connect(DeleteImageToListClicked)
|
||||||
|
ok.clicked.connect(OkClicked)
|
||||||
|
cancel.clicked.connect(CancelClicked)
|
||||||
|
addImageToList.setSizePolicy(size)
|
||||||
|
deleteImageToList.setSizePolicy(size)
|
||||||
|
ok.setSizePolicy(size)
|
||||||
|
cancel.setSizePolicy(size)
|
||||||
|
layout.addWidget(QtWidgets.QLabel("<h2>描述(建议填写)</h2>"), 0, 0)
|
||||||
|
layout.addWidget(description, 1, 0, 1, 3)
|
||||||
|
layout.addWidget(QtWidgets.QLabel("<hr>"), 2, 0, 1, 4)
|
||||||
|
layout.addWidget(QtWidgets.QLabel("<h2>截图(建议选择)</h2>"), 3, 0)
|
||||||
|
layout.addWidget(imageListView, 4, 0, 4, 3)
|
||||||
|
layout.addWidget(addImageToList, 5, 3)
|
||||||
|
layout.addWidget(deleteImageToList, 6, 3)
|
||||||
|
layout.addLayout(controlLayout, 8, 2, 1, 2)
|
||||||
|
controlLayout.addWidget(cancel)
|
||||||
|
controlLayout.addWidget(ok)
|
||||||
|
messagebox.setLayout(layout)
|
||||||
|
messagebox.exec_()
|
||||||
|
|
||||||
def To7z(self, savePath):
|
def To7z(self, savePath):
|
||||||
os.system("rm -rfv /tmp/wine-runner-log")
|
os.system("rm -rfv /tmp/wine-runner-log")
|
||||||
os.system("mkdir -v /tmp/wine-runner-log")
|
os.system("mkdir -v /tmp/wine-runner-log")
|
||||||
self.ToHtml("/tmp/wine-runner-log/index.html", toZip=True)
|
self.ToHtml("/tmp/wine-runner-log/index.html", toZip=True)
|
||||||
|
if os.path.exists(self.binIconPath):
|
||||||
shutil.copy(self.binIconPath, f"/tmp/wine-runner-log/{os.path.basename(self.binIconPath)}")
|
shutil.copy(self.binIconPath, f"/tmp/wine-runner-log/{os.path.basename(self.binIconPath)}")
|
||||||
lists = ["wine-runner-log-icon.png", "index.html"]
|
lists = ["wine-runner-log-icon.png", "index.html"]
|
||||||
for i in self.imgPath:
|
for i in self.imgPath:
|
||||||
@ -167,17 +266,35 @@ class SaveLog():
|
|||||||
imgPath = ""
|
imgPath = ""
|
||||||
lsmod = ""
|
lsmod = ""
|
||||||
lshw = ""
|
lshw = ""
|
||||||
|
charReplaceMap = {
|
||||||
|
"<": "<",
|
||||||
|
">": ">",
|
||||||
|
"&": "&",
|
||||||
|
'"': """
|
||||||
|
}
|
||||||
for i in self.description.splitlines():
|
for i in self.description.splitlines():
|
||||||
|
for k in charReplaceMap:
|
||||||
|
i = i.replace(k, charReplaceMap[k])
|
||||||
description += f'<span class="line code">{i}</span>\n'
|
description += f'<span class="line code">{i}</span>\n'
|
||||||
for i in self.logOut.splitlines():
|
for i in self.logOut.splitlines():
|
||||||
|
for k in charReplaceMap:
|
||||||
|
i = i.replace(k, charReplaceMap[k])
|
||||||
logOut += f'<span class="line code">{i}</span>\n'
|
logOut += f'<span class="line code">{i}</span>\n'
|
||||||
for i in self.cpuInfo.splitlines():
|
for i in self.cpuInfo.splitlines():
|
||||||
|
for k in charReplaceMap:
|
||||||
|
i = i.replace(k, charReplaceMap[k])
|
||||||
cpuInfo += f'<span class="line code">{i}</span>\n'
|
cpuInfo += f'<span class="line code">{i}</span>\n'
|
||||||
for i in self.memoryInfo.splitlines():
|
for i in self.memoryInfo.splitlines():
|
||||||
|
for k in charReplaceMap:
|
||||||
|
i = i.replace(k, charReplaceMap[k])
|
||||||
memoryInfo += f'<span class="line code">{i}</span>\n'
|
memoryInfo += f'<span class="line code">{i}</span>\n'
|
||||||
for i in self.lsmod.splitlines():
|
for i in self.lsmod.splitlines():
|
||||||
|
for k in charReplaceMap:
|
||||||
|
i = i.replace(k, charReplaceMap[k])
|
||||||
lsmod += f'<span class="line code">{i}</span>\n'
|
lsmod += f'<span class="line code">{i}</span>\n'
|
||||||
for i in self.lshw.splitlines():
|
for i in self.lshw.splitlines():
|
||||||
|
for k in charReplaceMap:
|
||||||
|
i = i.replace(k, charReplaceMap[k])
|
||||||
lshw += f'<span class="line code">{i}</span>\n'
|
lshw += f'<span class="line code">{i}</span>\n'
|
||||||
text = readtxt(f"{programPath}/Resources/LogTemplate/template.html")
|
text = readtxt(f"{programPath}/Resources/LogTemplate/template.html")
|
||||||
if toZip:
|
if toZip:
|
||||||
@ -223,14 +340,11 @@ class SaveLog():
|
|||||||
"%Lsmod%": lsmod,
|
"%Lsmod%": lsmod,
|
||||||
"%Lshw%": lshw,
|
"%Lshw%": lshw,
|
||||||
"%CPU%": self.cpu,
|
"%CPU%": self.cpu,
|
||||||
"%GPU%": self.gpu
|
"%GPU%": self.gpu,
|
||||||
|
"%SystemVersion%": self.systemVersion
|
||||||
}
|
}
|
||||||
for i in replaceMap.keys():
|
for i in replaceMap.keys():
|
||||||
text = text.replace(i, replaceMap[i])
|
text = text.replace(i, replaceMap[i])
|
||||||
with open(savePath, "w") as file:
|
with open(savePath, "w") as file:
|
||||||
file.write(text)
|
file.write(text)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
SaveLog("a", "b", "c", "/opt/apps/deepin-wine-runner/geek.exe", "e", "f", ["/tmp/wine-runner-log/wine-runner-log-icon.png"]).To7z("/tmp/a.7z")
|
|
1
Makefile
1
Makefile
@ -62,6 +62,7 @@ package:
|
|||||||
cp -rv RegShot deb/opt/apps/deepin-wine-runner
|
cp -rv RegShot deb/opt/apps/deepin-wine-runner
|
||||||
cp -rv BeCyIconGrabber.exe deb/opt/apps/deepin-wine-runner
|
cp -rv BeCyIconGrabber.exe deb/opt/apps/deepin-wine-runner
|
||||||
cp -rv AutoShell deb/opt/apps/deepin-wine-runner
|
cp -rv AutoShell deb/opt/apps/deepin-wine-runner
|
||||||
|
cp -rv Resources deb/opt/apps/deepin-wine-runner
|
||||||
cp -rv deepin-wine-packager-with-script.py deb/opt/apps/deepin-wine-runner
|
cp -rv deepin-wine-packager-with-script.py deb/opt/apps/deepin-wine-runner
|
||||||
cp -rv deepin-wine-packager.py deb/opt/apps/deepin-wine-runner
|
cp -rv deepin-wine-packager.py deb/opt/apps/deepin-wine-runner
|
||||||
cp -rv deepin-wine-runner-update-bug deb/opt/apps/deepin-wine-runner
|
cp -rv deepin-wine-runner-update-bug deb/opt/apps/deepin-wine-runner
|
||||||
|
@ -98,9 +98,13 @@
|
|||||||
%Lshw%
|
%Lshw%
|
||||||
</pre></code>
|
</pre></code>
|
||||||
<hr />
|
<hr />
|
||||||
<p align="center">©2020~Now gfdgd xi</p>
|
<p align="center" id="copyright">©2020~Now <a target="_blank" class="unLine" href="https://gitee.com/gfdgd-xi">gfdgd xi</a></p>
|
||||||
</body>
|
</body>
|
||||||
<style>
|
<style>
|
||||||
|
.unLine {
|
||||||
|
text-decoration: none;
|
||||||
|
color: black;
|
||||||
|
}
|
||||||
@counter-style lno {
|
@counter-style lno {
|
||||||
system: extends decimal;
|
system: extends decimal;
|
||||||
pad: 4 " ";
|
pad: 4 " ";
|
||||||
@ -142,5 +146,9 @@
|
|||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
<script>
|
<script>
|
||||||
|
window.onload = function load(){
|
||||||
|
date = new Date();
|
||||||
|
document.getElementById("copyright").innerHTML = "©2020~" + date.getFullYear() + ' <a class="unLine" target="_blank" href="https://gitee.com/gfdgd-xi">gfdgd xi</a>';
|
||||||
|
}
|
||||||
|
|
||||||
</script>
|
</script>
|
@ -279,6 +279,7 @@ class Runexebutton_threading(QtCore.QThread):
|
|||||||
super().__init__()
|
super().__init__()
|
||||||
|
|
||||||
def run(self):
|
def run(self):
|
||||||
|
global lastRunCommand
|
||||||
if e1.currentText() == "":
|
if e1.currentText() == "":
|
||||||
wineBottonPath = setting["DefultBotton"]
|
wineBottonPath = setting["DefultBotton"]
|
||||||
else:
|
else:
|
||||||
@ -330,20 +331,26 @@ class Runexebutton_threading(QtCore.QThread):
|
|||||||
if setting["TerminalOpen"]:
|
if setting["TerminalOpen"]:
|
||||||
res = ""
|
res = ""
|
||||||
if e2.currentText()[-4:] == ".msi" and os.path.exists(e2.currentText()):
|
if e2.currentText()[-4:] == ".msi" and os.path.exists(e2.currentText()):
|
||||||
OpenTerminal("env WINEPREFIX='" + wineBottonPath + "' " + option + wine[o1.currentText()] + " msiexec /i '" + e2.currentText() + "' " + setting["WineOption"])
|
runCommand = "env WINEPREFIX='" + wineBottonPath + "' " + option + wine[o1.currentText()] + " msiexec /i '" + e2.currentText() + "' " + setting["WineOption"]
|
||||||
|
OpenTerminal(runCommand)
|
||||||
elif e2.currentText()[-4:] == ".bat" and os.path.exists(e2.currentText()):
|
elif e2.currentText()[-4:] == ".bat" and os.path.exists(e2.currentText()):
|
||||||
OpenTerminal("env WINEPREFIX='" + wineBottonPath + "' " + option + wine[o1.currentText()] + " wineconsole '" + e2.currentText() + "' " + setting["WineOption"])
|
runCommand = "env WINEPREFIX='" + wineBottonPath + "' " + option + wine[o1.currentText()] + " wineconsole '" + e2.currentText() + "' " + setting["WineOption"]
|
||||||
|
OpenTerminal(runCommand)
|
||||||
else:
|
else:
|
||||||
OpenTerminal("env WINEPREFIX='" + wineBottonPath + "' " + option + wine[o1.currentText()] + " '" + exePath + "' " + setting["WineOption"])
|
runCommand = "env WINEPREFIX='" + wineBottonPath + "' " + option + wine[o1.currentText()] + " '" + exePath + "' " + setting["WineOption"]
|
||||||
|
OpenTerminal(runCommand)
|
||||||
#res = subprocess.Popen([f"'{programPath}/launch.sh' deepin-terminal -C \"WINEPREFIX='" + wineBottonPath + "' " + option + wine[o1.currentText()] + " '" + e2.currentText() + "' " + setting["WineOption"] + "\" --keep-open" + wineUsingOption], shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
|
#res = subprocess.Popen([f"'{programPath}/launch.sh' deepin-terminal -C \"WINEPREFIX='" + wineBottonPath + "' " + option + wine[o1.currentText()] + " '" + e2.currentText() + "' " + setting["WineOption"] + "\" --keep-open" + wineUsingOption], shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
|
||||||
else:
|
else:
|
||||||
if e2.currentText()[-4:] == ".msi" and os.path.exists(e2.currentText()):
|
if e2.currentText()[-4:] == ".msi" and os.path.exists(e2.currentText()):
|
||||||
res = subprocess.Popen(["WINEPREFIX='" + wineBottonPath + "' " + option + wine[o1.currentText()] + " msiexec /i '" + e2.currentText() + "' " + setting["WineOption"]], shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
|
runCommand = "WINEPREFIX='" + wineBottonPath + "' " + option + wine[o1.currentText()] + " msiexec /i '" + e2.currentText() + "' " + setting["WineOption"]
|
||||||
|
res = subprocess.Popen([runCommand], shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
|
||||||
elif e2.currentText()[-4:] == ".bat" and os.path.exists(e2.currentText()):
|
elif e2.currentText()[-4:] == ".bat" and os.path.exists(e2.currentText()):
|
||||||
res = subprocess.Popen(["WINEPREFIX='" + wineBottonPath + "' " + option + wine[o1.currentText()] + " wineconsole '" + e2.currentText() + "' " + setting["WineOption"]], shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
|
runCommand = "WINEPREFIX='" + wineBottonPath + "' " + option + wine[o1.currentText()] + " wineconsole '" + e2.currentText() + "' " + setting["WineOption"]
|
||||||
|
res = subprocess.Popen([runCommand], shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
|
||||||
else:
|
else:
|
||||||
|
runCommand = "WINEPREFIX='" + wineBottonPath + "' " + option + wine[o1.currentText()] + " '" + exePath + "' " + setting["WineOption"]
|
||||||
print(["WINEPREFIX='" + wineBottonPath + "' " + option + wine[o1.currentText()] + " '" + exePath + "' " + setting["WineOption"]])
|
print(["WINEPREFIX='" + wineBottonPath + "' " + option + wine[o1.currentText()] + " '" + exePath + "' " + setting["WineOption"]])
|
||||||
res = subprocess.Popen(["WINEPREFIX='" + wineBottonPath + "' " + option + wine[o1.currentText()] + " '" + exePath + "' " + setting["WineOption"]], shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
|
res = subprocess.Popen([runCommand], shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
|
||||||
# 实时读取程序返回
|
# 实时读取程序返回
|
||||||
#
|
#
|
||||||
if not setting["TerminalOpen"]:
|
if not setting["TerminalOpen"]:
|
||||||
@ -354,6 +361,8 @@ class Runexebutton_threading(QtCore.QThread):
|
|||||||
text = ""
|
text = ""
|
||||||
self.signal.emit(text)
|
self.signal.emit(text)
|
||||||
print(text, end="")
|
print(text, end="")
|
||||||
|
lastRunCommand = runCommand
|
||||||
|
print(runCommand)
|
||||||
if len(findExeHistory) == 0 or findExeHistory[-1] != wineBottonPath:
|
if len(findExeHistory) == 0 or findExeHistory[-1] != wineBottonPath:
|
||||||
findExeHistory.append(wineBottonPath) # 将记录写进数组
|
findExeHistory.append(wineBottonPath) # 将记录写进数组
|
||||||
write_txt(get_home() + "/.config/deepin-wine-runner/FindExeHistory.json", str(json.dumps(ListToDictionary(findExeHistory)))) # 将历史记录的数组转换为字典并写入
|
write_txt(get_home() + "/.config/deepin-wine-runner/FindExeHistory.json", str(json.dumps(ListToDictionary(findExeHistory)))) # 将历史记录的数组转换为字典并写入
|
||||||
@ -750,6 +759,7 @@ class RunWineProgramThread(QtCore.QThread):
|
|||||||
self.Disbled = Disbled
|
self.Disbled = Disbled
|
||||||
|
|
||||||
def run(self):
|
def run(self):
|
||||||
|
global lastRunCommand
|
||||||
if e1.currentText() == "":
|
if e1.currentText() == "":
|
||||||
wineBottonPath = setting["DefultBotton"]
|
wineBottonPath = setting["DefultBotton"]
|
||||||
else:
|
else:
|
||||||
@ -774,10 +784,14 @@ class RunWineProgramThread(QtCore.QThread):
|
|||||||
os.remove(f"{programPath}/dlls-arm.7z")
|
os.remove(f"{programPath}/dlls-arm.7z")
|
||||||
if setting["TerminalOpen"]:
|
if setting["TerminalOpen"]:
|
||||||
res = ""
|
res = ""
|
||||||
OpenTerminal(f"env WINEPREFIX='" + wineBottonPath + "' " + option + wine[o1.currentText()] + " '" + self.wineProgram + "' " + setting["WineOption"] + " " + wineUsingOption)
|
runCommand = f"env WINEPREFIX='" + wineBottonPath + "' " + option + wine[o1.currentText()] + " '" + self.wineProgram + "' " + setting["WineOption"] + " " + wineUsingOption
|
||||||
|
OpenTerminal(runCommand)
|
||||||
#res = subprocess.Popen([f"'{programPath}/launch.sh' deepin-terminal -C \"WINEPREFIX='" + wineBottonPath + "' " + option + wine[o1.currentText()] + " '" + self.wineProgram + "' " + setting["WineOption"] + " " + wineUsingOption + "\" --keep-open"], shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
|
#res = subprocess.Popen([f"'{programPath}/launch.sh' deepin-terminal -C \"WINEPREFIX='" + wineBottonPath + "' " + option + wine[o1.currentText()] + " '" + self.wineProgram + "' " + setting["WineOption"] + " " + wineUsingOption + "\" --keep-open"], shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
|
||||||
else:
|
else:
|
||||||
res = subprocess.Popen(["WINEPREFIX='" + wineBottonPath + "' " + option + wine[o1.currentText()] + " '" + self.wineProgram + "' " + setting["WineOption"]], shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
|
runCommand = "WINEPREFIX='" + wineBottonPath + "' " + option + wine[o1.currentText()] + " '" + self.wineProgram + "' " + setting["WineOption"]
|
||||||
|
res = subprocess.Popen([runCommand], shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
|
||||||
|
print(runCommand)
|
||||||
|
lastRunCommand = runCommand
|
||||||
# 实时读取程序返回
|
# 实时读取程序返回
|
||||||
if not setting["TerminalOpen"]:
|
if not setting["TerminalOpen"]:
|
||||||
while res.poll() is None:
|
while res.poll() is None:
|
||||||
@ -2580,6 +2594,7 @@ information = json.loads(readtxt(f"{programPath}/information.json"))
|
|||||||
version = information["Version"]
|
version = information["Version"]
|
||||||
goodRunSystem = QtCore.QCoreApplication.translate("U", "常见 Linux 发行版")
|
goodRunSystem = QtCore.QCoreApplication.translate("U", "常见 Linux 发行版")
|
||||||
thankText = ""
|
thankText = ""
|
||||||
|
lastRunCommand = "暂未运行命令"
|
||||||
tips = QtCore.QCoreApplication.translate("U", '''<h4>提示:</h4>
|
tips = QtCore.QCoreApplication.translate("U", '''<h4>提示:</h4>
|
||||||
1、使用终端运行该程序,可以看到 wine 以及程序本身的提示和报错;
|
1、使用终端运行该程序,可以看到 wine 以及程序本身的提示和报错;
|
||||||
2、wine 32 位和 64 位的容器互不兼容;
|
2、wine 32 位和 64 位的容器互不兼容;
|
||||||
@ -2800,11 +2815,12 @@ background-color: black;
|
|||||||
color: white;
|
color: white;
|
||||||
""")
|
""")
|
||||||
returnText.setText(QtCore.QCoreApplication.translate("U", """在此可以看到wine安装应用时的终端输出内容
|
returnText.setText(QtCore.QCoreApplication.translate("U", """在此可以看到wine安装应用时的终端输出内容
|
||||||
========================================
|
=============================================
|
||||||
如果解决了你的问题,请不要吝啬你的star哟!
|
如果解决了你的问题,请不要吝啬你的star哟!
|
||||||
地址:
|
地址:
|
||||||
https://gitee.com/gfdgd-xi/deep-wine-runner
|
https://gitee.com/gfdgd-xi/deep-wine-runner
|
||||||
https://github.com/gfdgd-xi/deep-wine-runner"""))
|
https://github.com/gfdgd-xi/deep-wine-runner
|
||||||
|
https://sourceforge.net/projects/deep-wine-runner"""))
|
||||||
mainLayout.setRowStretch(0, 2)
|
mainLayout.setRowStretch(0, 2)
|
||||||
mainLayout.setRowStretch(1, 1)
|
mainLayout.setRowStretch(1, 1)
|
||||||
mainLayout.setColumnStretch(0, 2)
|
mainLayout.setColumnStretch(0, 2)
|
||||||
@ -3148,18 +3164,21 @@ log = menu.addMenu(QtCore.QCoreApplication.translate("U", "日志(&L)"))
|
|||||||
getDllInfo = QtWidgets.QAction(QtCore.QCoreApplication.translate("U", "查询 Dll"))
|
getDllInfo = QtWidgets.QAction(QtCore.QCoreApplication.translate("U", "查询 Dll"))
|
||||||
checkLogText = QtWidgets.QAction(QtCore.QCoreApplication.translate("U", "日志分析"))
|
checkLogText = QtWidgets.QAction(QtCore.QCoreApplication.translate("U", "日志分析"))
|
||||||
saveLogText = QtWidgets.QAction(QtWidgets.QApplication.style().standardIcon(16), QtCore.QCoreApplication.translate("U", "另存为日志"))
|
saveLogText = QtWidgets.QAction(QtWidgets.QApplication.style().standardIcon(16), QtCore.QCoreApplication.translate("U", "另存为日志"))
|
||||||
|
saveLogReport = QtWidgets.QAction(QtWidgets.QApplication.style().standardIcon(16), QtCore.QCoreApplication.translate("U", "输出详细日志报告"))
|
||||||
transLogText = QtWidgets.QAction(QtCore.QCoreApplication.translate("U", "翻译日志(翻译后日志分析功能会故障)"))
|
transLogText = QtWidgets.QAction(QtCore.QCoreApplication.translate("U", "翻译日志(翻译后日志分析功能会故障)"))
|
||||||
uploadLogText = QtWidgets.QAction(QtCore.QCoreApplication.translate("U", "上传日志"))
|
uploadLogText = QtWidgets.QAction(QtCore.QCoreApplication.translate("U", "上传日志"))
|
||||||
getDllInfo.triggered.connect(DllWindow.ShowWindow)
|
getDllInfo.triggered.connect(DllWindow.ShowWindow)
|
||||||
checkLogText.triggered.connect(LogChecking.ShowWindow)
|
checkLogText.triggered.connect(LogChecking.ShowWindow)
|
||||||
saveLogText.triggered.connect(SaveLog)
|
saveLogText.triggered.connect(SaveLog)
|
||||||
|
saveLogReport.triggered.connect(lambda: SaveLogReport(o1.currentText(), wine[o1.currentText()], lastRunCommand, e2.currentText(), returnText.toPlainText()).SetWindow())
|
||||||
transLogText.triggered.connect(TransLog)
|
transLogText.triggered.connect(TransLog)
|
||||||
uploadLogText.triggered.connect(UploadLog)
|
uploadLogText.triggered.connect(UploadLog)
|
||||||
log.addAction(getDllInfo)
|
log.addAction(getDllInfo)
|
||||||
log.addAction(checkLogText)
|
#log.addAction(checkLogText)
|
||||||
log.addAction(saveLogText)
|
log.addAction(saveLogText)
|
||||||
log.addAction(transLogText)
|
log.addAction(saveLogReport)
|
||||||
log.addAction(uploadLogText)
|
#log.addAction(transLogText)
|
||||||
|
#log.addAction(uploadLogText)
|
||||||
|
|
||||||
actionList = []
|
actionList = []
|
||||||
def AddLib(install: QtWidgets.QAction, uninstall, menu, info):
|
def AddLib(install: QtWidgets.QAction, uninstall, menu, info):
|
||||||
@ -3281,7 +3300,7 @@ gfdgdxiio = QtWidgets.QAction(QtWidgets.QApplication.style().standardIcon(20), Q
|
|||||||
gitee = QtWidgets.QAction(QtWidgets.QApplication.style().standardIcon(20), QtCore.QCoreApplication.translate("U", "Gitee"))
|
gitee = QtWidgets.QAction(QtWidgets.QApplication.style().standardIcon(20), QtCore.QCoreApplication.translate("U", "Gitee"))
|
||||||
github = QtWidgets.QAction(QtWidgets.QApplication.style().standardIcon(20), QtCore.QCoreApplication.translate("U", "Github"))
|
github = QtWidgets.QAction(QtWidgets.QApplication.style().standardIcon(20), QtCore.QCoreApplication.translate("U", "Github"))
|
||||||
gitlab = QtWidgets.QAction(QtWidgets.QApplication.style().standardIcon(20), QtCore.QCoreApplication.translate("U", "Gitlab"))
|
gitlab = QtWidgets.QAction(QtWidgets.QApplication.style().standardIcon(20), QtCore.QCoreApplication.translate("U", "Gitlab"))
|
||||||
jihu = QtWidgets.QAction(QtWidgets.QApplication.style().standardIcon(20), QtCore.QCoreApplication.translate("U", "极狐"))
|
jihu = QtWidgets.QAction(QtWidgets.QApplication.style().standardIcon(20), QtCore.QCoreApplication.translate("U", "Sourceforge"))
|
||||||
h1.addAction(gfdgdxiio)
|
h1.addAction(gfdgdxiio)
|
||||||
h1.addAction(gitee)
|
h1.addAction(gitee)
|
||||||
h1.addAction(github)
|
h1.addAction(github)
|
||||||
@ -3315,7 +3334,7 @@ gfdgdxiio.triggered.connect(lambda: webbrowser.open_new_tab("https://gfdgd-xi.gi
|
|||||||
gitee.triggered.connect(lambda: webbrowser.open_new_tab("https://gitee.com/gfdgd-xi/deep-wine-runner"))
|
gitee.triggered.connect(lambda: webbrowser.open_new_tab("https://gitee.com/gfdgd-xi/deep-wine-runner"))
|
||||||
github.triggered.connect(lambda: webbrowser.open_new_tab("https://github.com/gfdgd-xi/deep-wine-runner"))
|
github.triggered.connect(lambda: webbrowser.open_new_tab("https://github.com/gfdgd-xi/deep-wine-runner"))
|
||||||
gitlab.triggered.connect(lambda: webbrowser.open_new_tab("https://gitlab.com/gfdgd-xi/deep-wine-runner"))
|
gitlab.triggered.connect(lambda: webbrowser.open_new_tab("https://gitlab.com/gfdgd-xi/deep-wine-runner"))
|
||||||
jihu.triggered.connect(lambda: webbrowser.open_new_tab("https://jihulab.com//gfdgd-xi/deep-wine-runner"))
|
jihu.triggered.connect(lambda: webbrowser.open_new_tab("https://sourceforge.net/projects/deep-wine-runner/"))
|
||||||
runStatusWebSize.triggered.connect(lambda: webbrowser.open_new_tab("https://gfdgd-xi.github.io/wine-runner-info"))
|
runStatusWebSize.triggered.connect(lambda: webbrowser.open_new_tab("https://gfdgd-xi.github.io/wine-runner-info"))
|
||||||
h2.triggered.connect(helps)
|
h2.triggered.connect(helps)
|
||||||
h3.triggered.connect(UpdateThings)
|
h3.triggered.connect(UpdateThings)
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
#!/usr/bin/env python3
|
#!/usr/bin/env python3
|
||||||
# 本来是用C++写的,但在非deepin/UOS编译/运行就是下载不了https文件,只能用python重写
|
# 本来是用C++写的,但在非deepin/UOS编译/运行就是下载不了https文件,只能用python重写
|
||||||
#########################################################################
|
#########################################################################
|
||||||
# 作者:gfdgd xi、为什么您不喜欢熊出没和阿布
|
# 作者:gfdgd xi
|
||||||
# 版本:2.4.0
|
# 版本:2.4.0
|
||||||
# 感谢:感谢 deepin-wine 团队,提供了 deepin-wine 给大家使用,让我能做这个程序
|
# 感谢:感谢 deepin-wine 团队,提供了 deepin-wine 给大家使用,让我能做这个程序
|
||||||
# 基于 Python3 的 PyQt5 构建
|
# 基于 Python3 的 PyQt5 构建
|
||||||
|
Loading…
x
Reference in New Issue
Block a user