From 04ce5be792acbd153a77d9ca42e0c3ca3096070e Mon Sep 17 00:00:00 2001 From: gfdgd xi <3025613752@qq.com> Date: Sun, 23 May 2021 15:54:04 +0800 Subject: [PATCH] 1.3.1 --- deb/DEBIAN/control | 5 +- deb/usr/bin/deepin-wine-runner | 170 ++++++++++++++++++++++++++------- main.py | 170 ++++++++++++++++++++++++++------- 3 files changed, 274 insertions(+), 71 deletions(-) diff --git a/deb/DEBIAN/control b/deb/DEBIAN/control index 31259dd..492d356 100644 --- a/deb/DEBIAN/control +++ b/deb/DEBIAN/control @@ -1,10 +1,9 @@ Package: spark-deepin-wine-runner -Version: 1.3.0 -Installed-Size: 40 +Version: 1.3.1 Maintainer: gfdgd xi <3025613752@qq.com> Homepage: https://gitee.com/gfdgd-xi/deep-wine-runner Architecture: all Priority: optional Depends: python3, python3-tk -Description: gfdgd xi make's deepin-wine runner +Description: gfdgd xi make's wine runner diff --git a/deb/usr/bin/deepin-wine-runner b/deb/usr/bin/deepin-wine-runner index 9a9a0b1..e469c4d 100755 --- a/deb/usr/bin/deepin-wine-runner +++ b/deb/usr/bin/deepin-wine-runner @@ -2,7 +2,8 @@ # 使用系统默认的 python3 运行 ########################################################################################### # 作者:gfdgd xi -# 版本:1.3.0 +# 版本:1.3.1 +# 更新时间:2021年05月23日 # 感谢:感谢 wine 以及 deepin-wine 团队,提供了 wine 和 deepin-wine 给大家使用,让我能做这个程序 # 基于 Python3 的 tkinter 构建 ########################################################################################### @@ -14,17 +15,20 @@ import tkinter.ttk as ttk import tkinter.filedialog import tkinter.messagebox import os +import sys +import time +import json +import shutil import threading import webbrowser -wine = {"deepin-wine": "deepin-wine", "deepin-wine5": "deepin-wine5", "wine": "wine", "wine64": "wine64", "deepin-wine5 stable(需运行使用 deepin-wine5 stable 打包的应用后才能使用)": "~/.deepinwine/deepin-wine5-stable/bin/wine", "deepin-wine6 stable 32 位(需运行使用 deepin-wine6 stable 打包的应用后才能使用)": "~/.deepinwine/deepin-wine6-stable/bin/wine", "deepin-wine6 stable 64 位(需运行使用 deepin-wine6 stable 打包的应用后才能使用)": "~/.deepinwine/deepin-wine6-stable/bin/wine64"} - ################### # 程序所需事件 ################### +# 打开程序官网 def OpenProgramURL(): - webbrowser.open_new_tab("https://gitee.com/gfdgd-xi/deep-wine-runner") + webbrowser.open_new_tab(programUrl) # 读取文本文档 def readtxt(path): @@ -35,7 +39,7 @@ def readtxt(path): # 写入文本文档 def write_txt(path, things): - file = open(path, 'a+', encoding='UTF-8') # 设置文件对象 + file = open(path, 'w', encoding='UTF-8') # 设置文件对象 file.write(things) # 写入文本 file.close() # 关闭文本对象 @@ -60,17 +64,21 @@ def get_home(): # 第一个浏览按钮事件 def liulanbutton(): - path = tkinter.filedialog.askdirectory(title="选择 wine 容器", initialdir="~/.deepinwine/") - if path != "": - e1_text.set(path) + + path = tkinter.filedialog.askdirectory(title="选择 wine 容器", initialdir=json.loads(readtxt(get_home() + "/.config/deepin-wine-runner/WineBotton.json"))["path"]) + if path != "" and path != "()": + e1.set(path) + write_txt(get_home() + "/.config/deepin-wine-runner/WineBotton.json", json.dumps({"path": path})) # 写入配置文件 # 第二个浏览按钮事件 def liulanexebutton(): - path = tkinter.filedialog.askopenfilename(title="选择 exe 可执行文件", filetypes=[("exe 可执行文件", "*.exe"), ("EXE 可执行文件", "*.EXE"), ("所有文件", "*.*")], initialdir="~/") - if path != "": - e2_text.set(path) + path = tkinter.filedialog.askopenfilename(title="选择 exe 可执行文件", filetypes=[("exe 可执行文件", "*.exe"), ("EXE 可执行文件", "*.EXE"), ("所有文件", "*.*")], initialdir=json.loads(readtxt(get_home() + "/.config/deepin-wine-runner/FindExe.json"))["path"]) + if path != "" and path != "()": + e2.set(path) # 显示路径 + write_txt(get_home() + "/.config/deepin-wine-runner/FindExe.json", json.dumps({"path": os.path.dirname(path)})) # 写入配置文件 + -# +# 使用多线程运行可执行文件 def runexebutton(): run = threading.Thread(target=runexebutton_threading) run.start() @@ -87,47 +95,134 @@ def DisableButton(things): # 运行可执行文件的线程 def runexebutton_threading(): DisableButton(True) - if e1_text.get() == "" or e2_text.get() == "": # 判断文本框是否有内容 + if e1.get() == "" or e2.get() == "": # 判断文本框是否有内容 tkinter.messagebox.showinfo(title="提示", message="没有填写需要使用的 wine 容器或需要运行的 exe 应用") else: # 如果都有 - os.system("WINEPREFIX='" + e1_text.get() + "' " + wine[o1_text.get()] + " '" + e2_text.get() + "'") # 运行 + os.system("WINEPREFIX='" + e1.get() + "' " + wine[o1_text.get()] + " '" + e2.get() + "'") # 运行 + findExeHistory.append(e1.get()) # 将记录写进数组 + wineBottonHistory.append(e2.get()) # 将记录写进数组 + print(ListToDictionary(findExeHistory)) + write_txt(get_home() + "/.config/deepin-wine-runner/FindExeHistory.json", str(json.dumps(ListToDictionary(findExeHistory)))) # 将历史记录的数组转换为字典并写入 + write_txt(get_home() + "/.config/deepin-wine-runner/WineBottonHistory.json", str(json.dumps(ListToDictionary(wineBottonHistory)))) # 将历史记录的数组转换为字典并写入 + e1['value'] = findExeHistory + e2['value'] = wineBottonHistory DisableButton(False) # 显示“关于这个程序”窗口 def about_this_program(): - tkinter.messagebox.showinfo(title="关于这个程序", message="一个基于 Python3 的 tkinter 制作的 wine 运行器\n版本:1.3.0\n适用平台:Linux\ntkinter 版本:" + str(tk.TkVersion) + "\n程序官网:https://gitee.com/gfdgd-xi/deep-wine-runner") + global about + tkinter.messagebox.showinfo(title="关于这个程序", message=about) # 显示“提示”窗口 def helps(): - tkinter.messagebox.showinfo(title="提示", message="提示:\n1、使用终端运行该程序,可以看到 wine 以及程序本身的提示和报错\n2、wine 32 位和 64 位的容器互不兼容") + global tips + tkinter.messagebox.showinfo(title="提示", message=tips) + +# 显示更新内容窗口 +def UpdateThings(): + tkinter.messagebox.showinfo(title="更新内容", message=updateThings) # 生成 shell 文件在桌面 # (第四个按钮的事件) def make_desktop_on_desktop(): - if e3_text.get() == "" or e2_text.get() == "" or e1_text.get() == "": # 判断文本框是否有内容 + if combobox1.get() == "" or e2.get() == "" or e1.get() == "": # 判断文本框是否有内容 tkinter.messagebox.showinfo(title="提示", message="没有填写需要使用的 wine 容器或需要运行的 exe 应用或保存的文件名") else: # 如果都有 - if os.path.exists(get_desktop_path() + "/" + e3_text.get() + ".sh"): # 判断目录是否有该文件,如果有 + if os.path.exists(get_desktop_path() + "/" + combobox1.get() + ".sh"): # 判断目录是否有该文件,如果有 choose = tkinter.messagebox.askokcancel(title="提示", message="文件已经存在,是否覆盖?") # 询问用户是否覆盖 if choose: # 如要覆盖 - os.remove(get_desktop_path() + "/" + e3_text.get() + ".sh") # 删除该文件 + os.remove(get_desktop_path() + "/" + combobox1.get() + ".sh") # 删除该文件 else: # 如不覆盖 return # 结束 - os.mknod(get_desktop_path() + "/" + e3_text.get() + ".sh") # 创建文本文档 - write_txt(get_desktop_path() + "/" + e3_text.get() + ".sh", "#!/bin/bash\n" + "WINEPREFIX='" + e1_text.get() + "' " + wine[o1_text.get()] + " '" + e2_text.get() + "'") # 写入文本文档 - os.system("chmod 777 '" + get_desktop_path() + "/" + e3_text.get() + ".sh" + "'") # 赋予可执行权限 + os.mknod(get_desktop_path() + "/" + combobox1.get() + ".sh") # 创建文本文档 + write_txt(get_desktop_path() + "/" + combobox1.get() + ".sh", "#!/bin/bash\n" + "WINEPREFIX='" + e1.get() + "' " + wine[o1_text.get()] + " '" + e2.get() + "'") # 写入文本文档 + os.system("chmod 777 '" + get_desktop_path() + "/" + combobox1.get() + ".sh" + "'") # 赋予可执行权限 + shellHistory.append(combobox1.get()) # 将记录写进数组 + write_txt(get_home() + "/.config/deepin-wine-runner/ShellHistory.json", str(json.dumps(ListToDictionary(shellHistory)))) # 将历史记录的数组转换为字典并写入 + combobox1['value'] = shellHistory tkinter.messagebox.showinfo(title="提示", message="生成完成!") # 显示完成对话框 +# 数组转字典 +def ListToDictionary(list): + dictionary = {} + for i in range(len(list)): + dictionary[i] = list[i] + return dictionary + +def CleanProgramHistory(): + if tkinter.messagebox.askokcancel(title="警告", message="删除后将无法恢复,你确定吗?\n删除后软件将会自动重启。"): + shutil.rmtree(get_home() + "/.config/deepin-wine-runner") + ReStartProgram() + +# 重启本应用程序 +def ReStartProgram(): + python = sys.executable + os.execl(python, python, * sys.argv) + + + +########################### +# 加载配置 +########################### +if not os.path.exists(get_home() + "/.config/deepin-wine-runner"): # 如果没有配置文件夹 + os.mkdir(get_home() + "/.config/deepin-wine-runner") # 创建配置文件夹 +if not os.path.exists(get_home() + "/.config/deepin-wine-runner/ShellHistory.json"): # 如果没有配置文件 + write_txt(get_home() + "/.config/deepin-wine-runner/ShellHistory.json", json.dumps({})) # 创建配置文件 +if not os.path.exists(get_home() + "/.config/deepin-wine-runner/FindExeHistory.json"): # 如果没有配置文件 + write_txt(get_home() + "/.config/deepin-wine-runner/FindExeHistory.json", json.dumps({})) # 创建配置文件 +if not os.path.exists(get_home() + "/.config/deepin-wine-runner/WineBottonHistory.json"): # 如果没有配置文件 + write_txt(get_home() + "/.config/deepin-wine-runner/WineBottonHistory.json", json.dumps({})) # 创建配置文件 +if not os.path.exists(get_home() + "/.config/deepin-wine-runner/FindExe.json"): # 如果没有配置文件 + write_txt(get_home() + "/.config/deepin-wine-runner/FindExe.json", json.dumps({"path": "~"})) # 写入(创建)一个配置文件 +if not os.path.exists(get_home() + "/.config/deepin-wine-runner/WineBotton.json"): # 如果没有配置文件 + write_txt(get_home() + "/.config/deepin-wine-runner/WineBotton.json", json.dumps({"path": "~/.deepinwine"})) # 写入(创建)一个配置文件 + +########################### +# 设置变量 +########################### +# 如果要添加其他 wine,请在字典添加其名称和执行路径 +# 在数组添加其名称 +wineName = ["deepin-wine", "deepin-wine","deepin-wine5", "wine", "wine64", "deepin-wine5 stable(需运行使用 deepin-wine5 stable 打包的应用后才能使用)", "deepin-wine6 stable 32 位(需运行使用 deepin-wine6 stable 打包的应用后才能使用)", "deepin-wine6 stable 64 位(需运行使用 deepin-wine6 stable 打包的应用后才能使用)"] +wine = {"deepin-wine": "deepin-wine", "deepin-wine5": "deepin-wine5", "wine": "wine", "wine64": "wine64", "deepin-wine5 stable(需运行使用 deepin-wine5 stable 打包的应用后才能使用)": "~/.deepinwine/deepin-wine5-stable/bin/wine", "deepin-wine6 stable 32 位(需运行使用 deepin-wine6 stable 打包的应用后才能使用)": "~/.deepinwine/deepin-wine6-stable/bin/wine", "deepin-wine6 stable 64 位(需运行使用 deepin-wine6 stable 打包的应用后才能使用)": "~/.deepinwine/deepin-wine6-stable/bin/wine64"} +shellHistory = list(json.loads(readtxt(get_home() + "/.config/deepin-wine-runner/ShellHistory.json")).values()) +findExeHistory = list(json.loads(readtxt(get_home() + "/.config/deepin-wine-runner/FindExeHistory.json")).values()) +wineBottonHistory = list(json.loads(readtxt(get_home() + "/.config/deepin-wine-runner/WineBottonHistory.json")).values()) + + +########################### +# 程序信息 +########################### +programUrl = "https://gitee.com/gfdgd-xi/deep-wine-runner" +version = "1.3.1" +goodRunSystem = "Linux" +about = '''一个基于 Python3 的 tkinter 制作的 wine 运行器 +版本:{} +适用平台:{} +tkinter 版本:{} +程序官网:{} +©2020-{} gfdgd xi'''.format(version, goodRunSystem, tk.TkVersion, programUrl, time.strftime("%Y")) +tips = '''提示: +1、使用终端运行该程序,可以看到 wine 以及程序本身的提示和报错 +2、wine 32 位和 64 位的容器互不兼容''' +updateThingsString = '''1、添加了历史记录,使用更加方便 +2、增加“更新内容”项 +3、支持浏览窗口的默认路径为上次访问的路径 +4、支持清空历史记录 +5、代码结构优化 +6、修改了控件大小''' +title = "wine 运行器 {}".format(version) +updateTime = "2021年05月23日" +updateThings = "{} 更新内容:\n{}\n更新时间:{}".format(version, updateThingsString, updateTime, time.strftime("%Y")) + + ########################### # 窗口创建 ########################### window = tk.Tk() # 创建窗口 -window.title("wine 运行器") # 设置标题 +window.title(title) # 设置标题 # 设置变量以修改和获取值项 -e1_text = tk.StringVar() -e2_text = tk.StringVar() o1_text = tk.StringVar() -e3_text = tk.StringVar() +combobox1 = tk.StringVar() o1_text.set("deepin-wine") # 创建控件 button1 = ttk.Button(window, text="浏览", command=liulanbutton) # 创建按钮控件 @@ -138,21 +233,27 @@ label1 = ttk.Label(window, text="选择你想要使用的 wine 容器:") # label2 = ttk.Label(window, text="选择要启动的 Windows 应用") # 创建标签控件 label3 = ttk.Label(window, text="选择要使用的 wine 版本") # 创建标签控件 label4 = ttk.Label(window, text="设置文件名,以便把上方填写的信息写入到 shell 文件里") # 创建标签控件 -e1 = ttk.Entry(window, textvariable=e1_text, width=50) # 创建文本框控件 -e2 = ttk.Entry(window, textvariable=e2_text, width=50) # 创建文本框控件 -e3 = ttk.Entry(window, textvariable=e3_text, width=50) # 创建文本框控件 -o1 = ttk.OptionMenu(window, o1_text, "deepin-wine", "deepin-wine","deepin-wine5", "wine", "wine64", "deepin-wine5 stable(需运行使用 deepin-wine5 stable 打包的应用后才能使用)", "deepin-wine6 stable 32 位(需运行使用 deepin-wine6 stable 打包的应用后才能使用)", "deepin-wine6 stable 64 位(需运行使用 deepin-wine6 stable 打包的应用后才能使用)") # 创建选择框控件 +e1 = ttk.Combobox(window, width=100) # 创建文本框控件 +e2 = ttk.Combobox(window, width=100) # 创建文本框控件 +combobox1 = ttk.Combobox(window, width=100) +o1 = ttk.OptionMenu(window, o1_text, *wineName) # 创建选择框控件 menu = tk.Menu(window) # 设置菜单栏 programmenu = tk.Menu(menu, tearoff=0) # 设置“程序”菜单栏 menu.add_cascade(label="程序", menu=programmenu) +programmenu.add_command(label="清空软件历史记录", command=CleanProgramHistory) +programmenu.add_separator() # 设置分界线 programmenu.add_command(label="退出程序", command=window.quit) # 设置“退出程序”项 help = tk.Menu(menu, tearoff=0) # 设置“帮助”菜单栏 menu.add_cascade(label="帮助", menu=help) +help.add_command(label="程序官网", command=OpenProgramURL) # 设置“程序官网”项 +help.add_separator() help.add_command(label="小提示", command=helps) # 设置“小提示”项 -help.add_separator() # 设置分界线 -help.add_command(label="程序官网", command=OpenProgramURL) # 设置“小提示”项 -help.add_separator() # 设置分界线 +help.add_command(label="更新内容", command=UpdateThings) # 设置“更新内容”项 help.add_command(label="关于这个程序", command=about_this_program) # 设置“关于这个程序”项 +# 设置控件 +e1['value'] = findExeHistory +e2['value'] = wineBottonHistory +combobox1['value'] = shellHistory # 添加控件 window.config(menu=menu) # 显示菜单栏 label1.grid(row=0, column=0) @@ -161,7 +262,8 @@ label3.grid(row=2, column=0) label4.grid(row=4, column=0) e1.grid(row=0, column=1) e2.grid(row=1, column=1) -e3.grid(row=4, column=1) +#combobox1.grid(row=4, column=1) +combobox1.grid(row=4, column=1) button1.grid(row=0, column=2) button2.grid(row=1, column=2) button3.grid(row=3, column=0, columnspan=3) diff --git a/main.py b/main.py index 9a9a0b1..e469c4d 100755 --- a/main.py +++ b/main.py @@ -2,7 +2,8 @@ # 使用系统默认的 python3 运行 ########################################################################################### # 作者:gfdgd xi -# 版本:1.3.0 +# 版本:1.3.1 +# 更新时间:2021年05月23日 # 感谢:感谢 wine 以及 deepin-wine 团队,提供了 wine 和 deepin-wine 给大家使用,让我能做这个程序 # 基于 Python3 的 tkinter 构建 ########################################################################################### @@ -14,17 +15,20 @@ import tkinter.ttk as ttk import tkinter.filedialog import tkinter.messagebox import os +import sys +import time +import json +import shutil import threading import webbrowser -wine = {"deepin-wine": "deepin-wine", "deepin-wine5": "deepin-wine5", "wine": "wine", "wine64": "wine64", "deepin-wine5 stable(需运行使用 deepin-wine5 stable 打包的应用后才能使用)": "~/.deepinwine/deepin-wine5-stable/bin/wine", "deepin-wine6 stable 32 位(需运行使用 deepin-wine6 stable 打包的应用后才能使用)": "~/.deepinwine/deepin-wine6-stable/bin/wine", "deepin-wine6 stable 64 位(需运行使用 deepin-wine6 stable 打包的应用后才能使用)": "~/.deepinwine/deepin-wine6-stable/bin/wine64"} - ################### # 程序所需事件 ################### +# 打开程序官网 def OpenProgramURL(): - webbrowser.open_new_tab("https://gitee.com/gfdgd-xi/deep-wine-runner") + webbrowser.open_new_tab(programUrl) # 读取文本文档 def readtxt(path): @@ -35,7 +39,7 @@ def readtxt(path): # 写入文本文档 def write_txt(path, things): - file = open(path, 'a+', encoding='UTF-8') # 设置文件对象 + file = open(path, 'w', encoding='UTF-8') # 设置文件对象 file.write(things) # 写入文本 file.close() # 关闭文本对象 @@ -60,17 +64,21 @@ def get_home(): # 第一个浏览按钮事件 def liulanbutton(): - path = tkinter.filedialog.askdirectory(title="选择 wine 容器", initialdir="~/.deepinwine/") - if path != "": - e1_text.set(path) + + path = tkinter.filedialog.askdirectory(title="选择 wine 容器", initialdir=json.loads(readtxt(get_home() + "/.config/deepin-wine-runner/WineBotton.json"))["path"]) + if path != "" and path != "()": + e1.set(path) + write_txt(get_home() + "/.config/deepin-wine-runner/WineBotton.json", json.dumps({"path": path})) # 写入配置文件 # 第二个浏览按钮事件 def liulanexebutton(): - path = tkinter.filedialog.askopenfilename(title="选择 exe 可执行文件", filetypes=[("exe 可执行文件", "*.exe"), ("EXE 可执行文件", "*.EXE"), ("所有文件", "*.*")], initialdir="~/") - if path != "": - e2_text.set(path) + path = tkinter.filedialog.askopenfilename(title="选择 exe 可执行文件", filetypes=[("exe 可执行文件", "*.exe"), ("EXE 可执行文件", "*.EXE"), ("所有文件", "*.*")], initialdir=json.loads(readtxt(get_home() + "/.config/deepin-wine-runner/FindExe.json"))["path"]) + if path != "" and path != "()": + e2.set(path) # 显示路径 + write_txt(get_home() + "/.config/deepin-wine-runner/FindExe.json", json.dumps({"path": os.path.dirname(path)})) # 写入配置文件 + -# +# 使用多线程运行可执行文件 def runexebutton(): run = threading.Thread(target=runexebutton_threading) run.start() @@ -87,47 +95,134 @@ def DisableButton(things): # 运行可执行文件的线程 def runexebutton_threading(): DisableButton(True) - if e1_text.get() == "" or e2_text.get() == "": # 判断文本框是否有内容 + if e1.get() == "" or e2.get() == "": # 判断文本框是否有内容 tkinter.messagebox.showinfo(title="提示", message="没有填写需要使用的 wine 容器或需要运行的 exe 应用") else: # 如果都有 - os.system("WINEPREFIX='" + e1_text.get() + "' " + wine[o1_text.get()] + " '" + e2_text.get() + "'") # 运行 + os.system("WINEPREFIX='" + e1.get() + "' " + wine[o1_text.get()] + " '" + e2.get() + "'") # 运行 + findExeHistory.append(e1.get()) # 将记录写进数组 + wineBottonHistory.append(e2.get()) # 将记录写进数组 + print(ListToDictionary(findExeHistory)) + write_txt(get_home() + "/.config/deepin-wine-runner/FindExeHistory.json", str(json.dumps(ListToDictionary(findExeHistory)))) # 将历史记录的数组转换为字典并写入 + write_txt(get_home() + "/.config/deepin-wine-runner/WineBottonHistory.json", str(json.dumps(ListToDictionary(wineBottonHistory)))) # 将历史记录的数组转换为字典并写入 + e1['value'] = findExeHistory + e2['value'] = wineBottonHistory DisableButton(False) # 显示“关于这个程序”窗口 def about_this_program(): - tkinter.messagebox.showinfo(title="关于这个程序", message="一个基于 Python3 的 tkinter 制作的 wine 运行器\n版本:1.3.0\n适用平台:Linux\ntkinter 版本:" + str(tk.TkVersion) + "\n程序官网:https://gitee.com/gfdgd-xi/deep-wine-runner") + global about + tkinter.messagebox.showinfo(title="关于这个程序", message=about) # 显示“提示”窗口 def helps(): - tkinter.messagebox.showinfo(title="提示", message="提示:\n1、使用终端运行该程序,可以看到 wine 以及程序本身的提示和报错\n2、wine 32 位和 64 位的容器互不兼容") + global tips + tkinter.messagebox.showinfo(title="提示", message=tips) + +# 显示更新内容窗口 +def UpdateThings(): + tkinter.messagebox.showinfo(title="更新内容", message=updateThings) # 生成 shell 文件在桌面 # (第四个按钮的事件) def make_desktop_on_desktop(): - if e3_text.get() == "" or e2_text.get() == "" or e1_text.get() == "": # 判断文本框是否有内容 + if combobox1.get() == "" or e2.get() == "" or e1.get() == "": # 判断文本框是否有内容 tkinter.messagebox.showinfo(title="提示", message="没有填写需要使用的 wine 容器或需要运行的 exe 应用或保存的文件名") else: # 如果都有 - if os.path.exists(get_desktop_path() + "/" + e3_text.get() + ".sh"): # 判断目录是否有该文件,如果有 + if os.path.exists(get_desktop_path() + "/" + combobox1.get() + ".sh"): # 判断目录是否有该文件,如果有 choose = tkinter.messagebox.askokcancel(title="提示", message="文件已经存在,是否覆盖?") # 询问用户是否覆盖 if choose: # 如要覆盖 - os.remove(get_desktop_path() + "/" + e3_text.get() + ".sh") # 删除该文件 + os.remove(get_desktop_path() + "/" + combobox1.get() + ".sh") # 删除该文件 else: # 如不覆盖 return # 结束 - os.mknod(get_desktop_path() + "/" + e3_text.get() + ".sh") # 创建文本文档 - write_txt(get_desktop_path() + "/" + e3_text.get() + ".sh", "#!/bin/bash\n" + "WINEPREFIX='" + e1_text.get() + "' " + wine[o1_text.get()] + " '" + e2_text.get() + "'") # 写入文本文档 - os.system("chmod 777 '" + get_desktop_path() + "/" + e3_text.get() + ".sh" + "'") # 赋予可执行权限 + os.mknod(get_desktop_path() + "/" + combobox1.get() + ".sh") # 创建文本文档 + write_txt(get_desktop_path() + "/" + combobox1.get() + ".sh", "#!/bin/bash\n" + "WINEPREFIX='" + e1.get() + "' " + wine[o1_text.get()] + " '" + e2.get() + "'") # 写入文本文档 + os.system("chmod 777 '" + get_desktop_path() + "/" + combobox1.get() + ".sh" + "'") # 赋予可执行权限 + shellHistory.append(combobox1.get()) # 将记录写进数组 + write_txt(get_home() + "/.config/deepin-wine-runner/ShellHistory.json", str(json.dumps(ListToDictionary(shellHistory)))) # 将历史记录的数组转换为字典并写入 + combobox1['value'] = shellHistory tkinter.messagebox.showinfo(title="提示", message="生成完成!") # 显示完成对话框 +# 数组转字典 +def ListToDictionary(list): + dictionary = {} + for i in range(len(list)): + dictionary[i] = list[i] + return dictionary + +def CleanProgramHistory(): + if tkinter.messagebox.askokcancel(title="警告", message="删除后将无法恢复,你确定吗?\n删除后软件将会自动重启。"): + shutil.rmtree(get_home() + "/.config/deepin-wine-runner") + ReStartProgram() + +# 重启本应用程序 +def ReStartProgram(): + python = sys.executable + os.execl(python, python, * sys.argv) + + + +########################### +# 加载配置 +########################### +if not os.path.exists(get_home() + "/.config/deepin-wine-runner"): # 如果没有配置文件夹 + os.mkdir(get_home() + "/.config/deepin-wine-runner") # 创建配置文件夹 +if not os.path.exists(get_home() + "/.config/deepin-wine-runner/ShellHistory.json"): # 如果没有配置文件 + write_txt(get_home() + "/.config/deepin-wine-runner/ShellHistory.json", json.dumps({})) # 创建配置文件 +if not os.path.exists(get_home() + "/.config/deepin-wine-runner/FindExeHistory.json"): # 如果没有配置文件 + write_txt(get_home() + "/.config/deepin-wine-runner/FindExeHistory.json", json.dumps({})) # 创建配置文件 +if not os.path.exists(get_home() + "/.config/deepin-wine-runner/WineBottonHistory.json"): # 如果没有配置文件 + write_txt(get_home() + "/.config/deepin-wine-runner/WineBottonHistory.json", json.dumps({})) # 创建配置文件 +if not os.path.exists(get_home() + "/.config/deepin-wine-runner/FindExe.json"): # 如果没有配置文件 + write_txt(get_home() + "/.config/deepin-wine-runner/FindExe.json", json.dumps({"path": "~"})) # 写入(创建)一个配置文件 +if not os.path.exists(get_home() + "/.config/deepin-wine-runner/WineBotton.json"): # 如果没有配置文件 + write_txt(get_home() + "/.config/deepin-wine-runner/WineBotton.json", json.dumps({"path": "~/.deepinwine"})) # 写入(创建)一个配置文件 + +########################### +# 设置变量 +########################### +# 如果要添加其他 wine,请在字典添加其名称和执行路径 +# 在数组添加其名称 +wineName = ["deepin-wine", "deepin-wine","deepin-wine5", "wine", "wine64", "deepin-wine5 stable(需运行使用 deepin-wine5 stable 打包的应用后才能使用)", "deepin-wine6 stable 32 位(需运行使用 deepin-wine6 stable 打包的应用后才能使用)", "deepin-wine6 stable 64 位(需运行使用 deepin-wine6 stable 打包的应用后才能使用)"] +wine = {"deepin-wine": "deepin-wine", "deepin-wine5": "deepin-wine5", "wine": "wine", "wine64": "wine64", "deepin-wine5 stable(需运行使用 deepin-wine5 stable 打包的应用后才能使用)": "~/.deepinwine/deepin-wine5-stable/bin/wine", "deepin-wine6 stable 32 位(需运行使用 deepin-wine6 stable 打包的应用后才能使用)": "~/.deepinwine/deepin-wine6-stable/bin/wine", "deepin-wine6 stable 64 位(需运行使用 deepin-wine6 stable 打包的应用后才能使用)": "~/.deepinwine/deepin-wine6-stable/bin/wine64"} +shellHistory = list(json.loads(readtxt(get_home() + "/.config/deepin-wine-runner/ShellHistory.json")).values()) +findExeHistory = list(json.loads(readtxt(get_home() + "/.config/deepin-wine-runner/FindExeHistory.json")).values()) +wineBottonHistory = list(json.loads(readtxt(get_home() + "/.config/deepin-wine-runner/WineBottonHistory.json")).values()) + + +########################### +# 程序信息 +########################### +programUrl = "https://gitee.com/gfdgd-xi/deep-wine-runner" +version = "1.3.1" +goodRunSystem = "Linux" +about = '''一个基于 Python3 的 tkinter 制作的 wine 运行器 +版本:{} +适用平台:{} +tkinter 版本:{} +程序官网:{} +©2020-{} gfdgd xi'''.format(version, goodRunSystem, tk.TkVersion, programUrl, time.strftime("%Y")) +tips = '''提示: +1、使用终端运行该程序,可以看到 wine 以及程序本身的提示和报错 +2、wine 32 位和 64 位的容器互不兼容''' +updateThingsString = '''1、添加了历史记录,使用更加方便 +2、增加“更新内容”项 +3、支持浏览窗口的默认路径为上次访问的路径 +4、支持清空历史记录 +5、代码结构优化 +6、修改了控件大小''' +title = "wine 运行器 {}".format(version) +updateTime = "2021年05月23日" +updateThings = "{} 更新内容:\n{}\n更新时间:{}".format(version, updateThingsString, updateTime, time.strftime("%Y")) + + ########################### # 窗口创建 ########################### window = tk.Tk() # 创建窗口 -window.title("wine 运行器") # 设置标题 +window.title(title) # 设置标题 # 设置变量以修改和获取值项 -e1_text = tk.StringVar() -e2_text = tk.StringVar() o1_text = tk.StringVar() -e3_text = tk.StringVar() +combobox1 = tk.StringVar() o1_text.set("deepin-wine") # 创建控件 button1 = ttk.Button(window, text="浏览", command=liulanbutton) # 创建按钮控件 @@ -138,21 +233,27 @@ label1 = ttk.Label(window, text="选择你想要使用的 wine 容器:") # label2 = ttk.Label(window, text="选择要启动的 Windows 应用") # 创建标签控件 label3 = ttk.Label(window, text="选择要使用的 wine 版本") # 创建标签控件 label4 = ttk.Label(window, text="设置文件名,以便把上方填写的信息写入到 shell 文件里") # 创建标签控件 -e1 = ttk.Entry(window, textvariable=e1_text, width=50) # 创建文本框控件 -e2 = ttk.Entry(window, textvariable=e2_text, width=50) # 创建文本框控件 -e3 = ttk.Entry(window, textvariable=e3_text, width=50) # 创建文本框控件 -o1 = ttk.OptionMenu(window, o1_text, "deepin-wine", "deepin-wine","deepin-wine5", "wine", "wine64", "deepin-wine5 stable(需运行使用 deepin-wine5 stable 打包的应用后才能使用)", "deepin-wine6 stable 32 位(需运行使用 deepin-wine6 stable 打包的应用后才能使用)", "deepin-wine6 stable 64 位(需运行使用 deepin-wine6 stable 打包的应用后才能使用)") # 创建选择框控件 +e1 = ttk.Combobox(window, width=100) # 创建文本框控件 +e2 = ttk.Combobox(window, width=100) # 创建文本框控件 +combobox1 = ttk.Combobox(window, width=100) +o1 = ttk.OptionMenu(window, o1_text, *wineName) # 创建选择框控件 menu = tk.Menu(window) # 设置菜单栏 programmenu = tk.Menu(menu, tearoff=0) # 设置“程序”菜单栏 menu.add_cascade(label="程序", menu=programmenu) +programmenu.add_command(label="清空软件历史记录", command=CleanProgramHistory) +programmenu.add_separator() # 设置分界线 programmenu.add_command(label="退出程序", command=window.quit) # 设置“退出程序”项 help = tk.Menu(menu, tearoff=0) # 设置“帮助”菜单栏 menu.add_cascade(label="帮助", menu=help) +help.add_command(label="程序官网", command=OpenProgramURL) # 设置“程序官网”项 +help.add_separator() help.add_command(label="小提示", command=helps) # 设置“小提示”项 -help.add_separator() # 设置分界线 -help.add_command(label="程序官网", command=OpenProgramURL) # 设置“小提示”项 -help.add_separator() # 设置分界线 +help.add_command(label="更新内容", command=UpdateThings) # 设置“更新内容”项 help.add_command(label="关于这个程序", command=about_this_program) # 设置“关于这个程序”项 +# 设置控件 +e1['value'] = findExeHistory +e2['value'] = wineBottonHistory +combobox1['value'] = shellHistory # 添加控件 window.config(menu=menu) # 显示菜单栏 label1.grid(row=0, column=0) @@ -161,7 +262,8 @@ label3.grid(row=2, column=0) label4.grid(row=4, column=0) e1.grid(row=0, column=1) e2.grid(row=1, column=1) -e3.grid(row=4, column=1) +#combobox1.grid(row=4, column=1) +combobox1.grid(row=4, column=1) button1.grid(row=0, column=2) button2.grid(row=1, column=2) button3.grid(row=3, column=0, columnspan=3)