主窗口QT改造完成!

This commit is contained in:
gfdgd xi 2022-07-18 15:22:00 +08:00
parent ec2d488a9d
commit 590701a873
2 changed files with 113 additions and 445 deletions

View File

@ -15,7 +15,6 @@ import sys
import time import time
import json import json
import shutil import shutil
import easygui
import requests import requests
import threading import threading
import traceback import traceback
@ -24,7 +23,7 @@ import webbrowser
import subprocess import subprocess
import ttkbootstrap import ttkbootstrap
import tkinter as tk import tkinter as tk
import tkinter.ttk as ttk #import tkinter.ttk as ttk
import tkinter.filedialog import tkinter.filedialog
import tkinter.messagebox import tkinter.messagebox
import PyQt5.QtGui as QtGui import PyQt5.QtGui as QtGui
@ -583,34 +582,7 @@ class UpdateWindow():
UpdateWindow.update.setWindowTitle("检查更新") UpdateWindow.update.setWindowTitle("检查更新")
UpdateWindow.update.resize(updateWidget.frameGeometry().width(), updateWidget.frameGeometry().height() * 1.5) UpdateWindow.update.resize(updateWidget.frameGeometry().width(), updateWidget.frameGeometry().height() * 1.5)
UpdateWindow.update.show() UpdateWindow.update.show()
return
update = tk.Toplevel()
update.title("检查更新")
update.resizable(0, 0)
update.iconphoto(False, tk.PhotoImage(file=iconPath))
versionLabel = ttk.Label(update, text="当前版本:{}\n最新版本:未知\n更新内容:".format(version))
updateText = tk.Text(update)
controlFrame = ttk.Frame(update)
ok = ttk.Button(controlFrame, text="更新更新过程中会关闭所有Python应用包括这个应用", command=UpdateWindow.Update)
cancel = ttk.Button(controlFrame, text="取消", command=update.quit)
try:
UpdateWindow.data = json.loads(requests.get("http://120.25.153.144/spark-deepin-wine-runner/update.json").text)
versionLabel = ttk.Label(update, text="当前版本:{}\n最新版本:{}\n更新内容:".format(version, UpdateWindow.data["Version"]))
if UpdateWindow.data["Version"] == version:
updateText.insert("0.0", "此为最新版本,无需更新")
ok.configure(state=tk.DISABLED)
else:
updateText.insert("0.0", UpdateWindow.data["New"].replace("\\n", "\n"))
except:
traceback.print_exc()
tkinter.messagebox.showerror(title="错误", message="无法连接服务器!")
updateText.configure(state=tk.DISABLED)
versionLabel.pack(anchor=tk.W)
updateText.pack()
controlFrame.pack(anchor=tk.E)
cancel.grid(row=0, column=0)
ok.grid(row=0, column=1)
update.mainloop()
def Update(): def Update():
if os.path.exists("/tmp/spark-deepin-wine-runner/update"): if os.path.exists("/tmp/spark-deepin-wine-runner/update"):
shutil.rmtree("/tmp/spark-deepin-wine-runner/update") shutil.rmtree("/tmp/spark-deepin-wine-runner/update")
@ -638,7 +610,7 @@ zenity --info --text=\"更新完毕!\" --ellipsize
class GetDllFromWindowsISO: class GetDllFromWindowsISO:
wineBottonPath = get_home() + "/.wine" wineBottonPath = get_home() + "/.wine"
isoPath = None#ttk.Entry() isoPath = None
dllList = None dllList = None
message = None message = None
dllFound = None dllFound = None
@ -649,94 +621,116 @@ class GetDllFromWindowsISO:
browser = None browser = None
mount = False mount = False
mountButton = None mountButton = None
dllListModel = None
def ShowWindow(): def ShowWindow():
DisableButton(True) DisableButton(True)
GetDllFromWindowsISO.message = tk.Toplevel() GetDllFromWindowsISO.message = QtWidgets.QMainWindow()
widget = QtWidgets.QWidget()
widgetLayout = QtWidgets.QGridLayout()
if not e1.currentText() == "": if not e1.currentText() == "":
GetDllFromWindowsISO.wineBottonPath = e1.currentText() GetDllFromWindowsISO.wineBottonPath = e1.currentText()
ttk.Label(GetDllFromWindowsISO.message, text=f"""提示: widgetLayout.addWidget(QtWidgets.QLabel(f"""提示:
目前本提取功能只支持 Windows XP 以及 Windows Server 2003 等老系统的官方安装镜像只支持读取 i386 安装方法的安装镜像不支持读取 wimghost 安装方式 目前本提取功能只支持 Windows XP 以及 Windows Server 2003 等老系统的官方安装镜像只支持读取 i386 安装方法的安装镜像不支持读取 wimghost 安装方式
以及不要拷贝/替换太多的 dll否则可能会导致 wine 容器异常 以及不要拷贝/替换太多的 dll否则可能会导致 wine 容器异常
最后拷贝/替换 dll 建议点击下面设置 wine 容器按钮==函数库 进行设置 最后拷贝/替换 dll 建议点击下面设置 wine 容器按钮==函数库 进行设置
当前选择的 Wine 容器{GetDllFromWindowsISO.wineBottonPath}""").grid(row=0, column=0, columnspan=3, sticky=tk.W) 当前选择的 Wine 容器{GetDllFromWindowsISO.wineBottonPath}"""), 0, 0, 1, 5)
ttk.Label(GetDllFromWindowsISO.message, text="ISO镜像").grid(row=1, column=0, sticky=tk.W) isoLabel = QtWidgets.QLabel("ISO镜像")
GetDllFromWindowsISO.isoPath = ttk.Combobox(GetDllFromWindowsISO.message, width=100) GetDllFromWindowsISO.isoPath = QtWidgets.QComboBox()
GetDllFromWindowsISO.browser = ttk.Button(GetDllFromWindowsISO.message, text="浏览……", command=GetDllFromWindowsISO.Browser) GetDllFromWindowsISO.browser = QtWidgets.QPushButton("浏览")
isoControl = ttk.Frame(GetDllFromWindowsISO.message) isoControl = QtWidgets.QWidget()
GetDllFromWindowsISO.mountButton = ttk.Button(isoControl, text="读取/挂载ISO镜像", command=GetDllFromWindowsISO.MountDisk) isoControlLayout = QtWidgets.QHBoxLayout()
ttk.Button(isoControl, text="关闭/卸载ISO镜像", command=GetDllFromWindowsISO.UmountDisk).grid(row=0, column=1) isoControl.setLayout(isoControlLayout)
ttk.Label(GetDllFromWindowsISO.message, text="查找DLL\n(为空则代表不查找,\n将显示全部内容):").grid(row=3, column=0) dllControl = QtWidgets.QWidget()
GetDllFromWindowsISO.dllFound = ttk.Combobox(GetDllFromWindowsISO.message, width=100) dllControlLayout = QtWidgets.QHBoxLayout()
GetDllFromWindowsISO.foundButton = ttk.Button(GetDllFromWindowsISO.message, text="查找", command=GetDllFromWindowsISO.Found) dllControl.setLayout(dllControlLayout)
GetDllFromWindowsISO.dllList = tk.Listbox(GetDllFromWindowsISO.message, width=100) GetDllFromWindowsISO.mountButton = QtWidgets.QPushButton("读取/挂载ISO镜像")
GetDllFromWindowsISO.dllControl = ttk.Frame(GetDllFromWindowsISO.message) umountButton = QtWidgets.QPushButton("关闭/卸载ISO镜像")
GetDllFromWindowsISO.saveDll = ttk.Button(GetDllFromWindowsISO.dllControl, text="保存到 wine 容器中", command=GetDllFromWindowsISO.CopyDll) GetDllFromWindowsISO.dllFound = QtWidgets.QComboBox()
GetDllFromWindowsISO.setWineBotton = ttk.Button(GetDllFromWindowsISO.dllControl, text="设置 wine 容器", command=lambda: threading.Thread(target=RunWineProgram, args=["winecfg", False, False]).start()) GetDllFromWindowsISO.foundButton = QtWidgets.QPushButton("查找")
# 设置控件 GetDllFromWindowsISO.dllList = QtWidgets.QListView()
GetDllFromWindowsISO.saveDll = QtWidgets.QPushButton("保存到 wine 容器中")
GetDllFromWindowsISO.setWineBotton = QtWidgets.QPushButton("设置 wine 容器")
isoLabel.setSizePolicy(size)
GetDllFromWindowsISO.isoPath.setEditable(True)
GetDllFromWindowsISO.isoPath.addItems(isoPath)
GetDllFromWindowsISO.isoPath.setEditText("")
GetDllFromWindowsISO.browser.setSizePolicy(size)
GetDllFromWindowsISO.mountButton.setSizePolicy(size)
isoControlLayout.addWidget(GetDllFromWindowsISO.mountButton)
umountButton.setSizePolicy(size)
isoControlLayout.addWidget(umountButton)
GetDllFromWindowsISO.dllFound.setEditable(True)
GetDllFromWindowsISO.dllFound.addItems(isoPathFound)
GetDllFromWindowsISO.dllFound.setEditText("")
GetDllFromWindowsISO.saveDll.setSizePolicy(size)
dllControlLayout.addWidget(GetDllFromWindowsISO.saveDll)
GetDllFromWindowsISO.setWineBotton.setSizePolicy(size)
GetDllFromWindowsISO.DisbledDown(True) GetDllFromWindowsISO.DisbledDown(True)
GetDllFromWindowsISO.isoPath['value'] = isoPath dllControlLayout.addWidget(GetDllFromWindowsISO.setWineBotton)
GetDllFromWindowsISO.dllFound['value'] = isoPathFound widgetLayout.addWidget(isoLabel, 1, 0, 1, 1)
# 显示控件 widgetLayout.addWidget(GetDllFromWindowsISO.isoPath, 1, 1, 1, 1)
GetDllFromWindowsISO.isoPath.grid(row=1, column=1) widgetLayout.addWidget(GetDllFromWindowsISO.browser, 1, 2, 1, 1)
GetDllFromWindowsISO.browser.grid(row=1, column=2) widgetLayout.addWidget(isoControl, 2, 1, 1, 1)
GetDllFromWindowsISO.mountButton.grid(row=0, column=0) widgetLayout.addWidget(QtWidgets.QLabel("查找DLL\n(为空则代表不查找,\n将显示全部内容):"), 3, 0, 1, 1)
isoControl.grid(row=2, column=0, columnspan=3) widgetLayout.addWidget(GetDllFromWindowsISO.dllFound, 3, 1, 1, 1)
GetDllFromWindowsISO.dllFound.grid(row=3, column=1) widgetLayout.addWidget(GetDllFromWindowsISO.foundButton, 3, 2, 1, 1)
GetDllFromWindowsISO.foundButton.grid(row=3, column=2) widgetLayout.addWidget(GetDllFromWindowsISO.dllList, 4, 1, 1, 1)
GetDllFromWindowsISO.dllList.grid(row=4, column=0, columnspan=3) widgetLayout.addWidget(dllControl, 5, 1, 1, 1)
GetDllFromWindowsISO.dllControl.grid(row=5, column=0, columnspan=3) #widgetLayout.addWidget(GetDllFromWindowsISO.setWineBotton, 5, 2, 1, 1)
GetDllFromWindowsISO.saveDll.grid(row=0, column=0) widget.setLayout(widgetLayout)
GetDllFromWindowsISO.setWineBotton.grid(row=0, column=1) GetDllFromWindowsISO.browser.clicked.connect(GetDllFromWindowsISO.Browser)
# 设置 GetDllFromWindowsISO.mountButton.clicked.connect(GetDllFromWindowsISO.MountDisk)
GetDllFromWindowsISO.message.protocol('WM_DELETE_WINDOW', GetDllFromWindowsISO.ExitWindow) umountButton.clicked.connect(GetDllFromWindowsISO.UmountDisk)
GetDllFromWindowsISO.message.title(f"Wine 运行器 {version}——从 ISO 提取 DLL") GetDllFromWindowsISO.foundButton.clicked.connect(GetDllFromWindowsISO.Found)
# 显示 GetDllFromWindowsISO.saveDll.clicked.connect(GetDllFromWindowsISO.CopyDll)
GetDllFromWindowsISO.message.mainloop() GetDllFromWindowsISO.setWineBotton.clicked.connect(lambda: RunWineProgram("winecfg", Disbled=False))
GetDllFromWindowsISO.message.setCentralWidget(widget)
GetDllFromWindowsISO.dllListModel = QtCore.QStringListModel()
GetDllFromWindowsISO.dllListModel.setStringList([])
GetDllFromWindowsISO.dllList.setModel(GetDllFromWindowsISO.dllListModel)
GetDllFromWindowsISO.isoPath.currentText()
GetDllFromWindowsISO.message.show()
def DisbledUp(state): def DisbledUp(state):
nd = [tk.NORMAL, tk.DISABLED] GetDllFromWindowsISO.isoPath.setDisabled(state)
GetDllFromWindowsISO.isoPath.configure(state=nd[int(state)]) GetDllFromWindowsISO.browser.setDisabled(state)
GetDllFromWindowsISO.browser.configure(state=nd[int(state)]) GetDllFromWindowsISO.mountButton.setDisabled(state)
GetDllFromWindowsISO.mountButton.configure(state=nd[int(state)])
def DisbledDown(state): def DisbledDown(state):
nd = [tk.NORMAL, tk.DISABLED] GetDllFromWindowsISO.dllList.setDisabled(state)
GetDllFromWindowsISO.dllList.configure(state=nd[int(state)]) GetDllFromWindowsISO.dllFound.setDisabled(state)
GetDllFromWindowsISO.dllFound.configure(state=nd[int(state)]) GetDllFromWindowsISO.saveDll.setDisabled(state)
#GetDllFromWindowsISO.dllControl.configure(state=nd[int(state)]) GetDllFromWindowsISO.setWineBotton.setDisabled(state)
GetDllFromWindowsISO.saveDll.configure(state=nd[int(state)]) GetDllFromWindowsISO.foundButton.setDisabled(state)
GetDllFromWindowsISO.setWineBotton.configure(state=nd[int(state)])
GetDllFromWindowsISO.foundButton.configure(state=nd[int(state)])
def Browser(): def Browser():
path = tkinter.filedialog.askopenfilename(title="选择 ISO 镜像文件", path = QtWidgets.QFileDialog.getOpenFileName(GetDllFromWindowsISO.message, "选择 ISO 镜像文件", json.loads(readtxt(get_home() + "/.config/deepin-wine-runner/FindISO.json"))["path"], "iso 镜像文件(*.iso);;ISO 镜像文件(*.ISO);;所有文件(*.*)")[0]
filetypes=[("ISO 镜像文件", "*.iso"), ("ISO 镜像文件", "*.ISO"), ("所有文件", "*.*")],
initialdir=json.loads(readtxt(get_home() + "/.config/deepin-wine-runner/FindISO.json"))["path"])
if path == None or path == "": if path == None or path == "":
return return
GetDllFromWindowsISO.isoPath.set(path) GetDllFromWindowsISO.isoPath.setEditText(path)
write_txt(get_home() + "/.config/deepin-wine-runner/FindISO.json", json.dumps({"path": os.path.dirname(path)})) # 写入配置文件 write_txt(get_home() + "/.config/deepin-wine-runner/FindISO.json", json.dumps({"path": os.path.dirname(path)})) # 写入配置文件
def Found(): def Found():
found = GetDllFromWindowsISO.dllFound.get() found = GetDllFromWindowsISO.dllFound.currentText()
GetDllFromWindowsISO.dllList.configure(state=tk.NORMAL) findList = []
GetDllFromWindowsISO.dllList.delete(0, tk.END)
try: try:
if found == "": if found == "":
for i in os.listdir("/tmp/wine-runner-getdll/i386"): for i in os.listdir("/tmp/wine-runner-getdll/i386"):
if i[-3:] == "dl_": if i[-3:] == "dl_":
GetDllFromWindowsISO.dllList.insert("end", i[:-1] + "l") findList.append(i[:-1] + "l")
return return
for i in os.listdir("/tmp/wine-runner-getdll/i386"): for i in os.listdir("/tmp/wine-runner-getdll/i386"):
if found in i[:-1] + "l": if found in i[:-1] + "l":
GetDllFromWindowsISO.dllList.insert("end", i[:-1] + "l") findList.append(i[:-1] + "l")
isoPathFound.append(found) # 将记录写进数组 isoPathFound.append(found) # 将记录写进数组
write_txt(get_home() + "/.config/deepin-wine-runner/ISOPathFound.json", str(json.dumps(ListToDictionary(isoPathFound)))) # 将历史记录的数组转换为字典并写入 write_txt(get_home() + "/.config/deepin-wine-runner/ISOPathFound.json", str(json.dumps(ListToDictionary(isoPathFound)))) # 将历史记录的数组转换为字典并写入
GetDllFromWindowsISO.dllFound['value'] = isoPathFound GetDllFromWindowsISO.dllFound.clear()
GetDllFromWindowsISO.dllFound.addItems(isoPathFound)
GetDllFromWindowsISO.dllListModel.setStringList(findList)
except: except:
traceback.print_exc() traceback.print_exc()
tkinter.messagebox.showerror(title="错误", message=traceback.format_exc()) QtWidgets.QMessageBox.critical(GetDllFromWindowsISO.message, "错误", traceback.format_exc())
def ExitWindow(): def ExitWindow():
@ -747,8 +741,8 @@ class GetDllFromWindowsISO:
GetDllFromWindowsISO.message.quit() GetDllFromWindowsISO.message.quit()
def MountDisk(): def MountDisk():
if not os.path.exists(GetDllFromWindowsISO.isoPath.get()): if not os.path.exists(GetDllFromWindowsISO.isoPath.currentText()):
tkinter.messagebox.showerror(title="错误", message="您选择的 ISO 镜像文件不存在") QtWidgets.QMessageBox.critical(GetDllFromWindowsISO.message, "错误", "您选择的 ISO 镜像文件不存在")
return return
if os.path.exists("/tmp/wine-runner-getdll"): if os.path.exists("/tmp/wine-runner-getdll"):
try: try:
@ -760,53 +754,53 @@ class GetDllFromWindowsISO:
os.rmdir("/tmp/wine-runner-getdll") os.rmdir("/tmp/wine-runner-getdll")
except: except:
traceback.print_exc() traceback.print_exc()
tkinter.messagebox.showerror(title="错误", message=traceback.format_exc()) QtWidgets.QMessageBox.critical(GetDllFromWindowsISO.message, "错误", traceback.format_exc())
return return
os.makedirs("/tmp/wine-runner-getdll") os.makedirs("/tmp/wine-runner-getdll")
GetDllFromWindowsISO.dllList.configure(state=tk.NORMAL) os.system(f"pkexec mount '{GetDllFromWindowsISO.isoPath.currentText()}' /tmp/wine-runner-getdll")
os.system(f"pkexec mount '{GetDllFromWindowsISO.isoPath.get()}' /tmp/wine-runner-getdll") findList = []
GetDllFromWindowsISO.dllList.delete(0, tk.END)
try: try:
for i in os.listdir("/tmp/wine-runner-getdll/i386"): for i in os.listdir("/tmp/wine-runner-getdll/i386"):
if i[-3:] == "dl_": if i[-3:] == "dl_":
GetDllFromWindowsISO.dllList.insert("end", i[:-1] + "l") findList.append(i[:-1] + "l")
except: except:
traceback.print_exc() traceback.print_exc()
tkinter.messagebox.showerror(title="错误", message=f"镜像内容读取/挂载失败,报错如下:\n{traceback.format_exc()}") QtWidgets.QMessageBox.critical(GetDllFromWindowsISO.message, "错误", f"镜像内容读取/挂载失败,报错如下:\n{traceback.format_exc()}")
return return
GetDllFromWindowsISO.dllListModel.setStringList(findList)
GetDllFromWindowsISO.DisbledDown(False) GetDllFromWindowsISO.DisbledDown(False)
GetDllFromWindowsISO.DisbledUp(True) GetDllFromWindowsISO.DisbledUp(True)
GetDllFromWindowsISO.mount = True GetDllFromWindowsISO.mount = True
isoPath.append(GetDllFromWindowsISO.isoPath.get()) # 将记录写进数组 isoPath.append(GetDllFromWindowsISO.isoPath.currentText()) # 将记录写进数组
write_txt(get_home() + "/.config/deepin-wine-runner/ISOPath.json", str(json.dumps(ListToDictionary(isoPath)))) # 将历史记录的数组转换为字典并写入 write_txt(get_home() + "/.config/deepin-wine-runner/ISOPath.json", str(json.dumps(ListToDictionary(isoPath)))) # 将历史记录的数组转换为字典并写入
GetDllFromWindowsISO.isoPath['value'] = isoPath GetDllFromWindowsISO.isoPath.clear()
GetDllFromWindowsISO.isoPath.addItems(isoPath)
#GetDllFromWindowsISO.isoPath['value'] = isoPath
def UmountDisk(): def UmountDisk():
os.system("pkexec umount /tmp/wine-runner-getdll") os.system("pkexec umount /tmp/wine-runner-getdll")
GetDllFromWindowsISO.dllList.configure(state=tk.NORMAL)
try: try:
shutil.rmtree("/tmp/wine-runner-getdll") shutil.rmtree("/tmp/wine-runner-getdll")
except: except:
traceback.print_exc() traceback.print_exc()
tkinter.messagebox.showerror(title="错误", message=f"关闭/卸载镜像失败,报错如下:\n{traceback.format_exc()}") QtWidgets.QMessageBox.critical(GetDllFromWindowsISO.message, "错误", f"关闭/卸载镜像失败,报错如下:\n{traceback.format_exc()}")
return return
GetDllFromWindowsISO.DisbledDown(True) GetDllFromWindowsISO.DisbledDown(True)
GetDllFromWindowsISO.DisbledUp(False) GetDllFromWindowsISO.DisbledUp(False)
GetDllFromWindowsISO.mount = False GetDllFromWindowsISO.mount = False
QtWidgets.QMessageBox.information(GetDllFromWindowsISO.message, "提示", "关闭/卸载成功!")
def CopyDll(): def CopyDll():
for i in GetDllFromWindowsISO.dllList.curselection(): choose = GetDllFromWindowsISO.dllList.selectionModel().selectedIndexes()[0].data()
choose = GetDllFromWindowsISO.dllList.get(i) if os.path.exists(f"{GetDllFromWindowsISO.wineBottonPath}/drive_c/windows/system32/{choose}"):
if os.path.exists(f"{GetDllFromWindowsISO.wineBottonPath}/drive_c/windows/system32/{choose}"): if QtWidgets.QMessageBox.question(title="提示", message=f"DLL {choose} 已经存在,是否覆盖?") == QtWidgets.QMessageBox.No:
if not tkinter.messagebox.askyesno(title="提示", message=f"DLL {choose} 已经存在,是否覆盖?"): return
continue try:
print(i) shutil.copy(f"/tmp/wine-runner-getdll/i386/{choose[:-1]}_", f"{GetDllFromWindowsISO.wineBottonPath}/drive_c/windows/system32/{choose}")
try: QtWidgets.QMessageBox.information(GetDllFromWindowsISO.message, "提示", "提取成功!")
shutil.copy(f"/tmp/wine-runner-getdll/i386/{choose[:-1]}_", f"{GetDllFromWindowsISO.wineBottonPath}/drive_c/windows/system32/{choose}") except:
tkinter.messagebox.showinfo(title="提示", message="提取成功!") traceback.print_exc()
except: QtWidgets.QMessageBox.critical(GetDllFromWindowsISO.message, "错误", traceback.format_exc())
traceback.print_exc()
tkinter.messagebox.showerror(title="错误", message=traceback.format_exc())
class ProgramSetting(): class ProgramSetting():
wineBottonA = None wineBottonA = None
@ -937,9 +931,9 @@ try:
if change: if change:
write_txt(get_home() + "/.config/deepin-wine-runner/WineSetting.json", json.dumps(setting)) write_txt(get_home() + "/.config/deepin-wine-runner/WineSetting.json", json.dumps(setting))
except: except:
root = tk.Tk() traceback.print_exc()
root.withdraw() app = QtWidgets.QApplication(sys.argv)
tkinter.messagebox.showerror(title="错误", message="无法读取配置,无法继续") QtWidgets.QMessageBox.critical(None, "错误", f"无法读取配置,无法继续\n{traceback.format_exc()}")
sys.exit(1) sys.exit(1)
########################### ###########################
@ -987,6 +981,10 @@ Qt 版本:{QtCore.qVersion()}
<pre>{updateThingsString} <pre>{updateThingsString}
<b>更新时间{updateTime}</b></pre> <b>更新时间{updateTime}</b></pre>
<hr> <hr>
<h1>提示</h1>
<pre>{tips}
</pre>
<hr>
<h1>©2020~{time.strftime("%Y")} gfdgd xi为什么您不喜欢熊出没和阿布呢</h1>''' <h1>©2020~{time.strftime("%Y")} gfdgd xi为什么您不喜欢熊出没和阿布呢</h1>'''
title = "wine 运行器 {}".format(version) title = "wine 运行器 {}".format(version)
updateThings = "{} 更新内容:\n{}\n更新时间:{}".format(version, updateThingsString, updateTime, time.strftime("%Y")) updateThings = "{} 更新内容:\n{}\n更新时间:{}".format(version, updateThingsString, updateTime, time.strftime("%Y"))
@ -997,20 +995,6 @@ updateThings = "{} 更新内容:\n{}\n更新时间{}".format(version, updat
########################### ###########################
# 因为没有完全改完,所以需要这些东西来兼容 tkinter 的主题 # 因为没有完全改完,所以需要这些东西来兼容 tkinter 的主题
# 读取主题 # 读取主题
try:
theme = not ("dark" in readtxt(get_home() + "/.gtkrc-2.0") and "gtk-theme-name=" in readtxt(get_home() + "/.gtkrc-2.0"))
except:
print("主题读取错误,默认使用浅色主题")
theme = True
if theme:
win = tk.Tk()
themes = ttkthemes.ThemedStyle(win)
themes.set_theme("breeze")
else:
import ttkbootstrap
style = ttkbootstrap.Style(theme="darkly")
win = style.master # 创建窗口
win.withdraw() # 不显示 tkinter 根窗口
# Qt 窗口 # Qt 窗口
app = QtWidgets.QApplication(sys.argv) app = QtWidgets.QApplication(sys.argv)
window = QtWidgets.QMainWindow() window = QtWidgets.QMainWindow()
@ -1321,319 +1305,3 @@ if len(sys.argv) > 1 and sys.argv[1]:
if not os.path.exists("/opt/durapps/spark-dwine-helper/spark-dwine-helper-settings/settings.sh"): if not os.path.exists("/opt/durapps/spark-dwine-helper/spark-dwine-helper-settings/settings.sh"):
sparkWineSetting.setEnabled(False) sparkWineSetting.setEnabled(False)
sys.exit(app.exec_()) sys.exit(app.exec_())
# 读取主题
try:
theme = not ("dark" in readtxt(get_home() + "/.gtkrc-2.0") and "gtk-theme-name=" in readtxt(get_home() + "/.gtkrc-2.0"))
except:
print("主题读取错误,默认使用浅色主题")
theme = True
if theme:
style = ttkbootstrap.Style(theme="litera")
win = style.master # 创建窗口
else:
style = ttkbootstrap.Style(theme="darkly")
win = style.master # 创建窗口
win.title(title) # 设置标题
#root.geometry("1275x900")
# 设置变量以修改和获取值项
o1_text = tk.StringVar()
combobox1 = tk.StringVar()
o1_text.set("deepin-wine6 stable")
frame_up = ttk.Frame(win)
frame_left = tk.Frame(frame_up)#快速启动区
frame_left.config(bd=30)
#
frame_left_1 = ttk.Frame(frame_left)#左侧标题
left_title = ttk.Label(frame_left_1,text="快速启动")
left_title.config(font=("幼圆",24))
left_title.pack(anchor="w")
frame_left_1.grid(row=0,sticky="w" + "e")
#
frame_left_2 = ttk.Frame(frame_left)#容器路径
##
label_l_1 = ttk.Label(frame_left_2,text="请选择容器的路径:")
label_l_1.config(font=("幼圆",16))
label_l_1.grid(row=0,column=0,sticky='w')
##
e1 = ttk.Combobox(frame_left_2, width=65)
e1.grid(row=1,column=0)
##
button1 = tk.Button(frame_left_2,text="浏览", command=liulanbutton)
button1.config(font=("幼圆",12),padx=20,pady=3)
button1.grid(row=1,column=1)
##
frame_left_2.grid(row=1)
#
frame_left_3 = ttk.Frame(frame_left)#程序路径
label_l_2 = ttk.Label(frame_left_3,text="请选择待执行程序:")
label_l_2.config(font=("幼圆",16))
label_l_2.grid(row=0,column=0,sticky='w')
##
e2 = ttk.Combobox(frame_left_3, width=65)
e2.grid(row=1,column=0)
##
button2 = tk.Button(frame_left_3,text="浏览", command=liulanexebutton)
button2.config(font=("幼圆",12),padx=20,pady=3)
button2.grid(row=1,column=1)
##
frame_left_3.grid(row=2)
#
frame_left_4 = ttk.Frame(frame_left)#wine的版本
##
label_l_3 = ttk.Label(frame_left_4,text="请选择wine的版本")
label_l_3.config(font=("幼圆",16))
label_l_3.grid(row=0,column=0,sticky='w')
##
o1 = ttk.OptionMenu(frame_left_4, o1_text, setting["DefultWine"], *list(wine))
o1.grid(row=1,column=0)
##
label_l_4 = ttk.Label(frame_left_4,text=" "*4)#占位用字符串
label_l_4.grid(row=1,column=1)
##
button3 = tk.Button(frame_left_4,text="运行程序", command=runexebutton)
button3.config(font=("幼圆",12),padx=21,pady=3)
button3.grid(row=1,column=2)
##
label_l_5 = ttk.Label(frame_left_4,text=" "*13)#占位用字符串
label_l_5.grid(row=1,column=3)
##
killProgram = tk.Button(frame_left_4,text="终止程序", command=KillProgram)
killProgram.config(font=("幼圆",12),padx=21,pady=3)
killProgram.grid(row=1,column=4)
##
frame_left_4.grid(row=3)
#
frame_left.grid(row=0,column=0)#第一行第一列
frame_right = tk.Frame(frame_up)#高级配置区
frame_right.config(bd=30)
#
frame_right_1 = ttk.Frame(frame_right)
right_title = ttk.Label(frame_right_1,text="高级功能")
right_title.config(font=("幼圆",24))
right_title.pack(anchor="w")
frame_right_1.grid(row=0,sticky="w" + "e")
#
frame_right_2 = tk.Frame(frame_right)
##
label_r_1 = ttk.Label(frame_right_2,text="创建快捷方式(Desktop文件):")
label_r_1.config(font=("幼圆",16))
label_r_1.grid(row=0,column=0)
##
frame_right_2.grid(row=1,sticky='w')
#
frame_right_3 = tk.Frame(frame_right)
##
label_r_2 = ttk.Label(frame_right_3,text="名称:")
label_r_2.config(font=("幼圆",14))
label_r_2.grid(row=0,column=0)
##
combobox1 = ttk.Combobox(frame_right_3,width=20)
combobox1.grid(row=0,column=1)
##
empty1 = ttk.Label(frame_right_3,text=" "*5)
empty1.grid(row=0,column=2)
##
button5 = tk.Button(frame_right_3,text="创建到桌面", command=make_desktop_on_desktop)
button5.config(font=("幼圆",12),padx=20,pady=3)
button5.grid(row=0,column=3)
##
empty2 = ttk.Label(frame_right_3,text=" "*5)
empty2.grid(row=0,column=4)
##
saveDesktopFileOnLauncher = tk.Button(frame_right_3,text="创建到开始菜单", command=make_desktop_on_launcher)
saveDesktopFileOnLauncher.config(font=("幼圆",12),padx=20,pady=3)
saveDesktopFileOnLauncher.grid(row=0,column=5)
##
frame_right_3.grid(row=2,sticky='w')
#
frame_right_4 = ttk.Frame(frame_right)
##
label_r_2 = ttk.Label(frame_right_4,text="管理该程序:")
label_r_2.config(font=("幼圆",16))
label_r_2.grid(row=0,column=0)
##
frame_right_4.grid(row=3,sticky='w')
#
frame_right_5 = ttk.Frame(frame_right)
##
uninstallProgram = tk.Button(frame_right_5,text="卸载程序", command=UninstallProgram)
uninstallProgram.config(font=("幼圆",12),padx=20,pady=3)
uninstallProgram.grid(column=0)
##
empty3 = ttk.Label(frame_right_5,text=" "*5)
empty3.grid(row=0,column=1)
##
getProgramIcon = tk.Button(frame_right_5,text="提取图标", command=lambda: threading.Thread(target=RunWineProgram, args=[f"{programPath}/BeCyIconGrabber.exe"]).start())
getProgramIcon.config(font=("幼圆",12),padx=20,pady=3)
getProgramIcon.grid(row=0,column=2)
##
empty6 = ttk.Label(frame_right_5,text=" "*5)
empty6.grid(row=0,column=3)
##
trasButton = tk.Button(frame_right_5,text="窗口透明度工具", command=lambda: threading.Thread(target=RunWineProgram, args=[programPath + "/窗体透明度设置工具.exe"]).start())
trasButton.config(font=("幼圆",12),padx=20,pady=3)
trasButton.grid(row=0,column=4)
##
frame_right_5.grid(row=4,sticky='w')
#
frame_right_6 = ttk.Frame(frame_right)
##
label_r_3 = ttk.Label(frame_right_6,text="管理该wine")
label_r_3.config(font=("幼圆",16))
label_r_3.grid(row=0,column=0)
##
frame_right_6.grid(row=5,sticky='w')
#
frame_right_7 = ttk.Frame(frame_right)
##
wineConfig = tk.Button(frame_right_7,text="配置容器", command=ConfigWineBotton)
wineConfig.config(font=("幼圆",12),padx=20,pady=3)
wineConfig.grid(row=0,column=0)
##
empty4 = ttk.Label(frame_right_7,text=" "*5)
empty4.grid(row=0,column=1)
##
button_r_6 = tk.Button(frame_right_7,text="安装字体", command=OpenWineFontPath)
button_r_6.config(font=("幼圆",12),padx=20,pady=3)
button_r_6.grid(row=0,column=2)
##
empty5 = ttk.Label(frame_right_7,text=" "*5)
empty5.grid(row=0,column=3)
##
sparkWineSetting = tk.Button(frame_right_7,text="星火wine设置", command=lambda: threading.Thread(target=os.system, args=["/opt/durapps/spark-dwine-helper/spark-dwine-helper-settings/settings.sh"]).start())
sparkWineSetting.config(font=("幼圆",12),padx=20,pady=3)
sparkWineSetting.grid(row=0,column=4)
##
frame_right_7.grid(row=6,sticky='w')
#
frame_right.grid(row=0,column=1,sticky='n')#第一行第二列
frame_up.grid(row=0,sticky='w')
frame_down = tk.Frame(win,bd=30)
returnText = tk.Text(frame_down,width=120, height=15)
returnText.insert("end", "此可以查看到 Wine 应用安装时的程序返回值")
returnText.config(state=tk.DISABLED)
returnText.grid(row=0,column=0,sticky='e'+'w')
frame_down.grid(row=1,sticky='w')
menu = tk.Menu(win, background="white") # 设置菜单栏
programmenu = tk.Menu(menu, tearoff=0, background="white") # 设置“程序”菜单栏
menu.add_cascade(label="程序", menu=programmenu)
programmenu.add_command(label="安装 wine", command=InstallWine)
programmenu.add_separator() # 设置分界线
programmenu.add_command(label="设置程序", command=ProgramSetting.ShowWindow)
programmenu.add_command(label="清空软件历史记录", command=CleanProgramHistory)
programmenu.add_separator() # 设置分界线
programmenu.add_command(label="退出程序", command=win.quit) # 设置“退出程序”项
wineOption = tk.Menu(menu, tearoff=0, background="white") # 设置“Wine”菜单栏
menu.add_cascade(label="Wine", menu=wineOption)
wineOption.add_command(label="打开 Wine 容器目录", command=OpenWineBotton)
wineOption.add_command(label="安装常见字体", command=InstallWineFont)
wineOption.add_command(label="安装自定义字体", command=OpenWineFontPath)
wineOption.add_command(label="删除选择的 Wine 容器", command=DeleteWineBotton)
wineOption.add_separator()
wineOption.add_command(label="打包 wine 应用", command=BuildExeDeb)
wineOption.add_command(label="使用官方 Wine 适配活动的脚本进行打包测试只支持UOS", command=UOSPackageScript)
wineOption.add_separator()
wineOption.add_command(label="从镜像获取DLL只支持Windows XP、Windows Server 2003官方安装镜像", command=GetDllFromWindowsISO.ShowWindow)
wineOption.add_separator()
wineInstall = tk.Menu()
wineOption.add_cascade(label="在指定 Wine、容器安装组件", menu=wineInstall)
wineInstall.add_command(label="在指定wine、指定容器安装 .net framework", command=lambda: threading.Thread(target=InstallNetFramework).start())
wineInstall.add_command(label="在指定wine、指定容器安装 Visual Studio C++", command=lambda: threading.Thread(target=InstallVisualStudioCPlusPlus).start())
wineInstall.add_command(label="在指定wine、指定容器安装 MSXML", command=lambda: threading.Thread(target=InstallMSXML).start())
wineInstall.add_command(label="在指定wine、指定容器安装 gecko", command=lambda: threading.Thread(target=InstallMonoGecko, args=["gecko"]).start())
wineInstall.add_command(label="在指定wine、指定容器安装 mono", command=lambda: threading.Thread(target=InstallMonoGecko, args=["mono"]).start())
wineInstall.add_command(label="在指定wine、指定容器安装其它运行库", command=lambda: threading.Thread(target=InstallOther).start())
wineDefultMenu = tk.Menu()
wineOption.add_cascade(label="在指定 Wine、容器运行基础应用", menu=wineDefultMenu)
wineDefultMenu.add_command(label="打开指定wine、指定容器的控制面板", command=lambda: threading.Thread(target=RunWineProgram, args=["control"]).start())
wineDefultMenu.add_command(label="打开指定wine、指定容器的浏览器", command=lambda: threading.Thread(target=RunWineProgram, args=["iexplore' 'https://www.deepin.org"]).start())
wineDefultMenu.add_command(label="打开指定wine、指定容器的注册表", command=lambda: threading.Thread(target=RunWineProgram, args=["regedit"]).start())
wineDefultMenu.add_command(label="打开指定wine、指定容器的任务管理器", command=lambda: threading.Thread(target=RunWineProgram, args=["taskmgr"]).start())
wineDefultMenu.add_command(label="打开指定wine、指定容器的资源管理器", command=lambda: threading.Thread(target=RunWineProgram, args=["explorer"]).start())
wineDefultMenu.add_command(label="打开指定wine、指定容器的关于 wine", command=lambda: threading.Thread(target=RunWineProgram, args=["winver"]).start())
wineOption.add_separator()
wineOption.add_command(label="设置 run_v3.sh 的文管为 Deepin 默认文管", command=SetDeepinFileDialogDeepin)
wineOption.add_command(label="设置 run_v3.sh 的文管为 Wine 默认文管", command=SetDeepinFileDialogDefult)
wineOption.add_command(label="重新安装 deepin-wine-helper", command=SetDeepinFileDialogRecovery)
wineOption.add_separator()
wineOption.add_command(label="使用winetricks打开指定容器", command=lambda: threading.Thread(target=RunWinetricks).start())
wineOption.add_separator()
opengl = tk.Menu()
opengl.add_command(label="开启 opengl", command=lambda: threading.Thread(target=RunWineProgram, args=[f"regedit.exe' /s '{programPath}/EnabledOpengl.reg"]).start())
opengl.add_command(label="禁用 opengl", command=lambda: threading.Thread(target=RunWineProgram, args=[f"regedit.exe' /s '{programPath}/DisabledOpengl.reg"]).start())
wineOption.add_cascade(label="启用/禁用 opengl", menu=opengl)
winbind = tk.Menu()
winbind.add_command(label="安装 winbind", command=lambda: os.system(f"'{programPath}/launch.sh' deepin-terminal -C 'pkexec apt install winbind -y' --keep-open"))
winbind.add_command(label="卸载 winbind", command=lambda: os.system(f"'{programPath}/launch.sh' deepin-terminal -C 'pkexec apt purge winbind -y' --keep-open"))
wineOption.add_cascade(label="安装/卸载 winbind", menu=winbind)
virtualMachine = tk.Menu(menu, tearoff=0, background="white")
menu.add_cascade(label="虚拟机", menu=virtualMachine)
virtualMachine.add_command(label="使用 Virtualbox 虚拟机运行 Windows 应用", command=RunVM)
safeWebsize = tk.Menu(menu, tearoff=0, background="white")
menu.add_cascade(label="云沙箱", menu=safeWebsize)
safeWebsize.add_command(label="360 沙箱云", command=lambda: webbrowser.open_new_tab("https://ata.360.net/"))
safeWebsize.add_command(label="微步云沙箱", command=lambda: webbrowser.open_new_tab("https://s.threatbook.cn/"))
safeWebsize.add_command(label="VIRUSTOTAL", command=lambda: webbrowser.open_new_tab("https://www.virustotal.com/"))
help = tk.Menu(menu, tearoff=0, background="white") # 设置“帮助”菜单栏
menu.add_cascade(label="帮助", menu=help)
help.add_command(label="程序官网", command=OpenProgramURL) # 设置“程序官网”项
help.add_separator()
help.add_command(label="小提示", command=helps) # 设置“小提示”项
help.add_command(label="更新内容", command=UpdateThings) # 设置“更新内容”项
help.add_command(label="谢明名单", command=ThankWindow)
help.add_separator()
help.add_command(label="更新这个程序", command=UpdateWindow.ShowWindow)
help.add_command(label="反馈这个程序的建议和问题", command=WineRunnerBugUpload)
help.add_command(label="关于这个程序", command=about_this_program) # 设置“关于这个程序”项
help.add_separator()
moreProgram = tk.Menu(menu, tearoff=0, background="white")
help.add_cascade(label="更多生态适配应用", menu=moreProgram)
moreProgram.add_command(label="运行 Android 应用UEngine 运行器", command=lambda: webbrowser.open_new_tab("https://gitee.com/gfdgd-xi/uengine-runner"))
# 设置窗口
win.iconphoto(False, tk.PhotoImage(file=iconPath))
#win.config(bg="white")
win.config(menu=menu)
# 设置控件
e1.set(setting["DefultBotton"])
if len(sys.argv) > 1 and sys.argv[1]:
e2.set(sys.argv[1])
menu.configure(activebackground="dodgerblue")
programmenu.configure(activebackground="dodgerblue")
wineOption.configure(activebackground="dodgerblue")
wineDefultMenu.configure(activebackground="dodgerblue")
wineInstall.configure(activebackground="dodgerblue")
opengl.configure(activebackground="dodgerblue")
winbind.configure(activebackground="dodgerblue")
virtualMachine.configure(activebackground="dodgerblue")
safeWebsize.configure(activebackground="dodgerblue")
moreProgram.configure(activebackground="dodgerblue")
help.configure(activebackground="dodgerblue")
e1['value'] = findExeHistory
e2['value'] = wineBottonHistory
combobox1['value'] = shellHistory
returnText.insert("end", "此可以查看到 Wine 应用安装时的程序返回值")
returnText.config(state=tk.DISABLED)
if not os.path.exists("/opt/durapps/spark-dwine-helper/spark-dwine-helper-settings/settings.sh"):
sparkWineSetting.config(state=tk.DISABLED)
# 启动窗口
if setting["CenterWindow"]:
try:
# 窗口居中(如果设置开启)
win.update()
# 获取主显示器分辨率
for i in GetScreenSize():
if i[4]:
win.geometry(f"{win.winfo_width()}x{win.winfo_height()}+{i[2] + (i[0] // 2 - win.winfo_width() // 2)}+{i[3] + (i[1] // 2 - win.winfo_height() // 2)}")
except:
print("设置居中错误,忽略")
# 显示窗口
win.mainloop()

BIN
参考图.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 206 KiB