diff --git a/README.md b/README.md index e72a8e6..df62f77 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,9 @@ i386 和 amd64 1. 安装所需依赖 ``` -sudo apt install python3 python3-tk git adb +sudo apt install python3 python3-tk git adb python3-pip +pip3 install pillow +pip3 install ttkthemes ``` 2. 下载本程序 @@ -29,11 +31,19 @@ git clone https://gitee.com/gfdgd-xi/uengine-runner.git 3. 运行本程序 ``` -cd uengine-runner -chmod 777 main.py -./main.py +sudo cp uengine-runner /opt/apps -rv +chmod 777 /opt/apps/uengine-runner/main.py +sudo cp /opt/apps/uengine-runner/main.py /usr/bin/uengine-runner +uengine-runner ``` +4. 卸载本程序 +``` +sudo rm /usr/bin/uengine-runner -v +sudo rm /opt/apps/uengine-runner/ -rfv +pip3 uninstall pillow +pip3 uninstall ttkthemes +``` #### 使用说明 diff --git a/build/DEBIAN/control b/build/DEBIAN/control index 6d70d1e..2118116 100644 --- a/build/DEBIAN/control +++ b/build/DEBIAN/control @@ -1,5 +1,5 @@ Package: spark-uengine-runner -Version: 1.0.0 +Version: 1.1.0 Maintainer: gfdgd xi <3025613752@qq.com> Homepage: https://gitee.com/gfdgd-xi/uengine-runner Architecture: all diff --git a/spark-uengine-runner.deb b/spark-uengine-runner.deb index 622f719..8a0e848 100644 Binary files a/spark-uengine-runner.deb and b/spark-uengine-runner.deb differ diff --git a/uengine-runner b/uengine-runner deleted file mode 100755 index ed3a53b..0000000 --- a/uengine-runner +++ /dev/null @@ -1,299 +0,0 @@ -#!/usr/bin/env python3 -# 使用系统默认的 python3 运行 -########################################################################################### -# 作者:gfdgd xi -# 版本:1.0.0 -# 更新时间:2021年 -# 感谢: -# 基于 Python3 的 tkinter 构建 -########################################################################################### -################# -# 引入所需的库 -################# -import os -import sys -import time -import json -import shutil -import traceback -import threading -import webbrowser -import subprocess -import tkinter as tk -import tkinter.ttk as ttk -import tkinter.messagebox as messagebox -import tkinter.filedialog as filedialog -import PIL.Image as Image -import PIL.ImageTk as ImageTk - -def KillAdbProgress(): - DisabledAndEnbled(True) - Return = GetCommandReturn("killall adb") - if Return is "": - Return = "OK!" - messagebox.showinfo(title="tips", message=Return) - DisabledAndEnbled(False) - -def Button1Click(): - if combobox2.get() is "": - messagebox.showerror(title="Tips", message="Don't input right things in ComboBox") - return - DisabledAndEnbled(True) - threading.Thread(target=ConnectPhoneIp).start() - -def ConnectPhoneIp(): - global phoneIp - messagebox.showinfo(title="tips", message=GetCommandReturn("adb connect '{}'".format(combobox2.get()))) - phoneIp.append(combobox2.get()) - combobox2['value'] = phoneIp - write_txt(get_home() + "/.config/uengine-runner/PhoneIp.json", str(json.dumps(ListToDictionary(phoneIp)))) # 将历史记录的数组转换为字典并写入 - DisabledAndEnbled(False) - -def FindApk(): - path = filedialog.askopenfilename(title="选择 Apk", filetypes=[("APK 文件", "*.apk"), ("所有文件", "*.*")], initialdir=json.loads(readtxt(get_home() + "/.config/uengine-runner/FindApk.json"))["path"]) - if not path is "": - combobox1.set(path) - write_txt(get_home() + "/.config/uengine-runner/FindApk.json", json.dumps({"path": os.path.dirname(path)})) # 写入配置文件 - -def Button3Install(): - if combobox1.get() is "": - messagebox.showerror(title="Tips", message="Don't input right things in ComboBox") - return - DisabledAndEnbled(True) - threading.Thread(target=InstallApk, args=(combobox1.get(),)).start() - -def InstallApk(path): - global findApkHistory - messagebox.showinfo(title="Tips", message=GetCommandReturn("adb install '{}'".format(path))) - findApkHistory.append(combobox1.get()) - combobox1['value'] = findApkHistory - write_txt(get_home() + "/.config/uengine-runner/FindApkHistory.json", str(json.dumps(ListToDictionary(findApkHistory)))) # 将历史记录的数组转换为字典并写入 - DisabledAndEnbled(False) - -def DisabledAndEnbled(choose): - userChoose = {True: tk.DISABLED, False: tk.NORMAL} - a = userChoose[choose] - combobox1.configure(state=a) - combobox2.configure(state=a) - button1.configure(state=a) - button2.configure(state=a) - button3.configure(state=a) - button4.configure(state=a) - button5.configure(state=a) - -# 需引入 subprocess -def GetCommandReturn(cmd): - # cmd 是要获取输出的命令 - return subprocess.getoutput(cmd) - -def Button5Click(): - threading.Thread(target=OpenUengineProgramList).start() - -def OpenUengineProgramList(): - os.system("/usr/bin/uengine-launch.sh --package=org.anbox.appmgr --component=org.anbox.appmgr.AppViewActivity") - -# 显示“关于这个程序”窗口 -def about_this_program(): - global about - global title - global iconPath - message = tk.Toplevel() - message.title("关于 {}".format(title)) - message.iconphoto(False, tk.PhotoImage(file=iconPath)) - img = ImageTk.PhotoImage(Image.open(iconPath)) - label1 = ttk.Label(message, image=img) - label2 = ttk.Label(message, text=about) - button1 = ttk.Button(message, text="确定", command=message.withdraw) - label1.pack() - label2.pack() - button1.pack(side="bottom") - message.mainloop() - -# 显示“提示”窗口 -def helps(): - global tips - messagebox.showinfo(title="提示", message=tips) - -# 显示更新内容窗口 -def UpdateThings(): - messagebox.showinfo(title="更新内容", message=updateThings) - -# 打开程序官网 -def OpenProgramURL(): - webbrowser.open_new_tab(programUrl) - -# 重启本应用程序 -def ReStartProgram(): - python = sys.executable - os.execl(python, python, * sys.argv) - -def CleanProgramHistory(): - try: - if messagebox.askokcancel(title="警告", message="删除后将无法恢复,你确定吗?\n删除后软件将会自动重启。"): - shutil.rmtree(get_home() + "/.config/uengine-runner") - ReStartProgram() - except: - traceback.print_exc() - messagebox.showerror(title="错误", message=traceback.format_exc()) - -# 获取用户主目录 -def get_home(): - return os.path.expanduser('~') - -def SendUengineAndroidListForDesktop(): - global desktop - global desktopName - DisabledAndEnbled(True) - try: - if os.path.exists("{}/{}".format(get_desktop_path(), desktopName)): - if not messagebox.askokcancel(title="提示", message="桌面已经存在快捷方式,你确定要覆盖吗?"): - return - shutil.copy(desktop, get_desktop_path()) - messagebox.showinfo(title="提示", message="发送成功!") - except: - traceback.print_exc() - messagebox.showerror(title="错误", message=traceback.format_exc()) - DisabledAndEnbled(False) - -# 获取用户桌面目录 -def get_desktop_path(): - for line in open(get_home() + "/.config/user-dirs.dirs"): # 以行来读取配置文件 - desktop_index = line.find("XDG_DESKTOP_DIR=\"") # 寻找是否有对应项,有返回 0,没有返回 -1 - if desktop_index != -1: # 如果有对应项 - break # 结束循环 - if desktop_index == -1: # 如果是提前结束,值一定≠-1,如果是没有提前结束,值一定=-1 - return -1 - else: - get = line[17:-2] # 截取桌面目录路径 - get_index = get.find("$HOME") # 寻找是否有对应的项,需要替换内容 - if get != -1: # 如果有 - get = get.replace("$HOME", get_home()) # 则把其替换为用户目录(~) - return get # 返回目录 - -def SendUengineAndroidListForLauncher(): - DisabledAndEnbled(True) - try: - if os.path.exists("{}/.local/share/applications/{}".format(get_home(), desktopName)): - if not messagebox.askokcancel(title="提示", message="启动器已经存在快捷方式,你确定要覆盖吗?"): - return - if not os.path.exists("{}/.local/share/applications/".format(get_home())): - os.makedirs("{}/.local/share/applications/".format(get_home())) - shutil.copy(desktop, "{}/.local/share/applications/{}".format(get_home(), desktopName)) - os.system("chmod 755 {}/.local/share/applications/{}".format(get_home(), desktopName)) - messagebox.showinfo(title="提示", message="发送成功!") - except: - traceback.print_exc() - messagebox.showerror(title="错误", message=traceback.format_exc()) - DisabledAndEnbled(False) - -# 数组转字典 -def ListToDictionary(list): - dictionary = {} - for i in range(len(list)): - dictionary[i] = list[i] - return dictionary - -# 读取文本文档 -def readtxt(path): - f = open(path, "r") # 设置文件对象 - str = f.read() # 获取内容 - f.close() # 关闭文本对象 - return str # 返回结果 - -# 写入文本文档 -def write_txt(path, things): - file = open(path, 'w', encoding='UTF-8') # 设置文件对象 - file.write(things) # 写入文本 - file.close() # 关闭文本对象 - -########################### -# 程序信息 -########################### -programUrl = "https://gitee.com/gfdgd-xi/uengine-runner" -version = "1.0.0" -goodRunSystem = "Linux" -about = '''一个基于 Python3 的 tkinter 制作的 uengine APK 安装器 -版本:{} -适用平台:{} -tkinter 版本:{} -程序官网:{} -©2021-{} gfdgd xi'''.format(version, goodRunSystem, tk.TkVersion, programUrl, time.strftime("%Y")) -tips = '''提示: -1、None''' -updateThingsString = '''''' -title = "uengine 运行器 {}".format(version) -updateTime = "2021年" -updateThings = "{} 更新内容:\n{}\n更新时间:{}".format(version, updateThingsString, updateTime, time.strftime("%Y")) -iconPath = "/opt/apps/uengine-runner/icon.png" -desktop = "/opt/apps/uengine-runner/UengineAndroidProgramList.desktop" -desktopName = "UengineAndroidProgramList.desktop" - -########################### -# 加载配置 -########################### -if not os.path.exists(get_home() + "/.config/uengine-runner"): # 如果没有配置文件夹 - os.mkdir(get_home() + "/.config/uengine-runner") # 创建配置文件夹 -if not os.path.exists(get_home() + "/.config/uengine-runner/PhoneIp.json"): # 如果没有配置文件 - write_txt(get_home() + "/.config/uengine-runner/PhoneIp.json", json.dumps({})) # 创建配置文件 -if not os.path.exists(get_home() + "/.config/uengine-runner/FindApkHistory.json"): # 如果没有配置文件 - write_txt(get_home() + "/.config/uengine-runner/FindApkHistory.json", json.dumps({})) # 创建配置文件 -if not os.path.exists(get_home() + "/.config/uengine-runner/FindApk.json"): # 如果没有配置文件 - write_txt(get_home() + "/.config/uengine-runner/FindApk.json", json.dumps({"path": "~"})) # 写入(创建)一个配置文件 - -########################### -# 设置变量 -########################### -findApkHistory = list(json.loads(readtxt(get_home() + "/.config/uengine-runner/FindApkHistory.json")).values()) -phoneIp = list(json.loads(readtxt(get_home() + "/.config/uengine-runner/PhoneIp.json")).values()) - -########################### -# 窗口创建 -########################### -window = tk.Tk() -window.title(title) -window.iconphoto(False, tk.PhotoImage(file=iconPath)) -frame1 = ttk.Frame(window) -frame2 = ttk.Frame(window) -label1 = ttk.Label(window, text="要安装的 apk 路径:") -label2 = ttk.Label(window, text="要连接的设备的 IP(默认 IP 为 192.168.250.2):") -combobox1 = ttk.Combobox(window, width=100) -combobox2 = ttk.Combobox(window, width=100) -button1 = ttk.Button(frame1, text="连接设备", command=ConnectPhoneIp) -button2 = ttk.Button(window, text="浏览", command=FindApk) -button3 = ttk.Button(frame2, text="安装", command=Button3Install) -button4 = ttk.Button(frame1, text="Kill Adb Progress", command=KillAdbProgress) -button5 = ttk.Button(frame2, text="Open uengine Program List", command=Button5Click) -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) # 设置“退出程序”项 -uengine = tk.Menu(menu, tearoff=0) -menu.add_cascade(label="uengine", menu=uengine) -uengine.add_command(label="发送 uengine 应用列表到桌面", command=SendUengineAndroidListForDesktop) -uengine.add_command(label="发送 uengine 应用列表到启动器", command=SendUengineAndroidListForLauncher) -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_command(label="更新内容", command=UpdateThings) # 设置“更新内容”项 -help.add_command(label="关于这个程序", command=about_this_program) # 设置“关于这个程序”项 -# 设置控件 -combobox2['value'] = phoneIp -combobox1['value'] = findApkHistory -# -window.config(menu=menu) # 显示菜单栏 -label1.grid(row=2, column=0) -label2.grid(row=0, column=0) -combobox1.grid(row=2, column=1) -combobox2.grid(row=0, column=1) -button1.grid(column=0, row=0) -button2.grid(row=2, column=2) -button3.grid(row=0, column=0) -button4.grid(column=1, row=0) -button5.grid(row=0, column=1) -frame1.grid(row=1, columnspa=3) -frame2.grid(row=3, columnspa=3) -window.mainloop() \ No newline at end of file