This commit is contained in:
gfdgd xi 2021-05-29 17:32:21 +08:00
parent 77912d35f6
commit d28b0fd91e
10 changed files with 690 additions and 169 deletions

9
build/DEBIAN/control Normal file
View File

@ -0,0 +1,9 @@
Package: spark-uengine-runner
Version: 1.0.0
Maintainer: gfdgd xi <3025613752@qq.com>
Homepage: https://gitee.com/gfdgd-xi/uengine-runner
Architecture: all
Priority: optional
Depends: python3, python3-tk, adb, python3-pip
Description: gfdgd xi make's uengine runner

4
build/DEBIAN/postinst Executable file
View File

@ -0,0 +1,4 @@
# !/bin/sh
sudo pip3 install --upgrade pip
sudo pip3 install --upgrade virtualenv
pip3 install pillow

View File

@ -0,0 +1,46 @@
# uengine 运行器
#### 介绍
使用 Python3 的 tkinter 构建
测试平台UOS 家庭版)
(自己美术功底太差,图标直接用 anbox 的了)
#### 软件架构
i386 和 amd64
#### 源码安装教程
1. 安装所需依赖
```
sudo apt install python3 python3-tk git adb
```
2. 下载本程序
```
git clone https://gitee.com/gfdgd-xi/uengine-runner.git
```
3. 运行本程序
```
cd uengine-runner
chmod 777 main.py
./main.py
```
#### 使用说明
提示:
None
#### 特技

View File

@ -0,0 +1,11 @@
[Desktop Entry]
Categories=System;
Comment=uengineanbox 程序菜单
Encoding=UTF-8
Exec=/usr/bin/uengine-launch.sh --package=org.anbox.appmgr --component=org.anbox.appmgr.AppViewActivity
Icon=/opt/apps/uengine-runner/icon.png
MimeType=
Name=uengine 程序菜单
StartupWMClass=uengine 程序菜单
Terminal=false
Type=Application

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

View File

@ -0,0 +1,299 @@
#!/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()

299
build/usr/bin/uengine-runner Executable file
View File

@ -0,0 +1,299 @@
#!/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()

View File

@ -0,0 +1,11 @@
[Desktop Entry]
Categories=System;
Comment=uengineanbox 运行器
Encoding=UTF-8
Exec=/usr/bin/uengine-runner
Icon=/opt/apps/uengine-runner/icon.png
MimeType=
Name=uengine 运行器
StartupWMClass=uengine 运行器
Terminal=false
Type=Application

180
main.py
View File

@ -1,169 +1,11 @@
#!/usr/bin/env python3
# 使用系统默认的 python3 运行
###########################################################################################
# 作者gfdgd xi
# 版本1.0.0
# 更新时间2021年
# 感谢:
# 基于 Python3 的 tkinter 构建
###########################################################################################
#################
# 引入所需的库
#################
import os
import sys
import time
import shutil
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
def KillAdbProgress():
Return = GetCommandReturn("killall adb")
if Return is "":
Return = "OK!"
messagebox.showinfo(title="tips", message=Return)
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():
messagebox.showinfo(title="tips", message=GetCommandReturn("adb connect '{}'".format(combobox2.get())))
DisabledAndEnbled(False)
def FindApk():
path = filedialog.askopenfilename(title="", filetypes=[("APK 文件", "*.apk"), ("所有文件", "*.*")])
if not path is "":
combobox1.set(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):
messagebox.showinfo(title="Tips", message=GetCommandReturn("adb install '{}'".format(path)))
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)
# 需引入 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
messagebox.showinfo(title="关于这个程序", message=about)
# 显示“提示”窗口
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():
if messagebox.askokcancel(title="警告", message="删除后将无法恢复,你确定吗?\n删除后软件将会自动重启。"):
shutil.rmtree(get_home() + "/.config/uengine-runner")
ReStartProgram()
# 获取用户主目录
def get_home():
return os.path.expanduser('~')
###########################
# 程序信息
###########################
programUrl = "https://gitee.com/gfdgd-xi/uengine-runner"
version = "1.0.0"
goodRunSystem = "Linux"
about = '''一个基于 Python3 的 tkinter 制作的
版本{}
适用平台{}
tkinter 版本{}
程序官网{}
©2021-{} gfdgd xi'''.format(version, goodRunSystem, tk.TkVersion, programUrl, time.strftime("%Y"))
tips = '''提示:
1None'''
updateThingsString = ''''''
title = "wine 运行器 {}".format(version)
updateTime = "2021年"
updateThings = "{} 更新内容:\n{}\n更新时间:{}".format(version, updateThingsString, updateTime, time.strftime("%Y"))
window = tk.Tk()
window.title(title)
frame1 = ttk.Frame(window)
frame2 = ttk.Frame(window)
label1 = ttk.Label(window, text="要安装的 apk 路径:")
label2 = ttk.Label(window, text="要连接的设备的 IP")
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) # 设置“退出程序”项
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) # 设置“关于这个程序”项
# 设置控件
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()
[Desktop Entry]
Categories=System;
Comment=uengineanbox 程序菜单
Encoding=UTF-8
Exec=/usr/bin/uengine-launch.sh --package=org.anbox.appmgr --component=org.anbox.appmgr.AppViewActivity
Icon=/opt/apps/uengine-runner/icon.png
MimeType=
Name=uengine 程序菜单
StartupWMClass=uengine 程序菜单
Terminal=false
Type=Application

BIN
spark-uengine-runner.deb Normal file

Binary file not shown.