This commit is contained in:
2021-08-26 15:24:26 +08:00
parent a2038ac40e
commit 89aa00ebf5
43 changed files with 909 additions and 38 deletions

View File

View File

@@ -3,7 +3,7 @@ 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
Icon=/opt/apps/com.gitee.uengine.runner.spark/files/icon.png
MimeType=
Name=uengine 程序菜单
StartupWMClass=uengine 程序菜单

View File

Before

Width:  |  Height:  |  Size: 10 KiB

After

Width:  |  Height:  |  Size: 10 KiB

View File

@@ -1,8 +1,9 @@
{
"Url": [
"https://gitee.com/gfdgd-xi/uengine-runner"
"https://gitee.com/gfdgd-xi/uengine-runner",
"https://github.com/gfdgd-xi/uengine-runner"
],
"Version": "1.4.0",
"Version": "1.4.1",
"System": "Linuxdeepin/UOS",
"Tips": [
" 新版本Deepin/UOS发布后可以在应用商店安装部分官方已适配的安卓应用对爱好者来说不能自己安装APK软件包始终差点意思本程序可以为Deepin/UOS上的Uengine安卓运行环境安装自定义APK软件包并能发送安装的APK包启动菜单到桌面或系统菜单。",
@@ -13,6 +14,8 @@
"",
"保存APK图标在安装APK下面的输入框浏览或输入APK的路径然后点击“保存图标”按钮选择保存位置即可",
"",
"键盘映射详细请查看uengine键盘映射主界面",
"",
"重置删除uengine数据点击菜单栏的“uengine”的“清空uengine数据”输入密码重启即可",
" 注意如果任何安卓一遍打不开多打开几遍应该就可以重新加载uengine配置了",
"",
@@ -25,6 +28,10 @@
"4、如果想要连接其他手机请使用 1.2.0 以前的版本,可以使用 adb 连接。"
],
"Update": [
"V1.4.1",
"※1、初步支持键盘映射",
"2、修复新版包在发送uengine列表快捷方式时会提示找不到文件",
"",
"V1.4.0",
"※1、添加新版打包方式deepin打包方式;",
"※2、支持测试运行/创建/删除uengine图标;",
@@ -91,7 +98,7 @@
"9、chmod",
"……"
],
"Time": "2021年08月19日",
"Time": "2021年08月26日",
"Contribute": ["gfdgd xi<3025613752@qq.com>",
"actionchen<917981399@qq.com>"]
}

View File

@@ -0,0 +1,6 @@
{
"Package": "com.gitee.uengine.runner.spark",
"Update": true,
"Version": "1.4.1",
"Url": "https://gfdgd-xi.github.io/update-program/data/UpdateInformation.json"
}

View File

@@ -0,0 +1,209 @@
#!/usr/bin/env python3
#########################################
# 版本1.4.0
# 更新时间2021年08月26日
#########################################
import os
import sys
import time
import json
import shutil
import keyboard
import traceback
import ttkthemes
import pyautogui
import threading
import tkinter as tk
import tkinter.ttk as ttk
import tkinter.messagebox as messagebox
import tkinter.filedialog as filedialog
########################
#
########################
def Inputt(key):
if key.event_type == "down":
global setting
if setting:
Setting(key)
else:
Mouse(key)
def Open():
path = filedialog.askopenfilename(title="打开", filetypes=[["json 文件", "*.json"], ["全部文件", ["*.*"]]])
if not path == "" or path == ():
shutil.copy(path, get_home() + "/.config/uengine-keyboard/key.json")
if messagebox.askyesno(title="提示", message="导入成功!是否现在重启程序以便生效?"):
ReStartProgram()
def Save():
path = filedialog.asksaveasfilename(title="打开", filetypes=[["json 文件", "*.json"], ["全部文件", ["*.*"]]])
if not path == "" or path == ():
shutil.copy(get_home() + "/.config/uengine-keyboard/key.json", path)
messagebox.showinfo(title="提示", message="导出成功!")
# 重启本应用程序
def ReStartProgram()->"重启本应用程序":
python = sys.executable
os.execl(python, python, * sys.argv)
def Mouse(key):
if keybo.__contains__(key.name):
print(keybo[key.name]["MousePlace"])
pyautogui.click(keybo[key.name]["MousePlace"][0], keybo[key.name]["MousePlace"][1])
def Setting(key):
if key.event_type == 'up':
keybo[key.name] = {"Mouse": "Left", "MousePlace": pyautogui.position()}
write_txt("{}/.config/uengine-keyboard/key.json".format(get_home()), json.dumps(keybo))
global inputs
inputs = True
global setting
setting = False
return False
def ShowTips():
try:
if setting:
settingLabelText.set('''设置方法:把鼠标移动带所需位置然后按下需要设置的按键即可({}x{}
提示:
1、目前不支持同时按两个及以上按键只支持在单一时间内按一个按键;
2、使用映射不能关闭本窗口但可以最小化;
3、本程序需要 root 权限才能使用;
4、映射时会占用鼠标所以在使用时最好不要使用鼠标;'''.format(pyautogui.position()[0], pyautogui.position()[1]))
settingButton.configure(state=tk.DISABLED)
else:
settingLabelText.set('''点击“设置”按钮设置映射({}x{}
提示:
1、目前不支持同时按两个及以上按键只支持在单一时间内按一个按键;
2、使用映射不能关闭本窗口但可以最小化;
3、本程序需要 root 权限才能使用;
4、映射时会占用鼠标所以在使用时最好不要使用鼠标;'''.format(pyautogui.position()[0], pyautogui.position()[1]))
settingButton.configure(state=tk.NORMAL)
time.sleep(0.1)
ShowTips()
except:
pass
def Key():
global inputs
keyboard.hook(Inputt)
# 获取用户主目录
def get_home()->"获取用户主目录":
return os.path.expanduser('~')
# 写入文本文档
def write_txt(path: "路径", things: "内容")->"写入文本文档":
TxtDir = os.path.dirname(path)
print(TxtDir)
if not os.path.exists(TxtDir):
os.makedirs(TxtDir,exist_ok=True)
file = open(path, 'w', encoding='UTF-8') # 设置文件对象
file.write(things) # 写入文本
file.close() # 关闭文本对象
# 读取文本文档
def readtxt(path: "路径")->"读取文本文档":
f = open(path, "r") # 设置文件对象
str = f.read() # 获取内容
f.close() # 关闭文本对象
return str # 返回结果
def Settings():
global setting
setting = True
def Clean():
if messagebox.askokcancel(title="提示", message="你确定要删除吗?"):
shutil.rmtree("{}/.config/uengine-keyboard".format(get_home()))
if messagebox.askyesno(title="提示", message="删除成功!是否现在重启程序以便生效?"):
ReStartProgram()
def About():
threading.Thread(target=os.system, args=["{}/uengine-runner-about".format(programPath)]).start()
###################
#
###################
if not os.path.exists("{}/.config/uengine-keyboard".format(get_home())):
os.mkdir("{}/.config/uengine-keyboard".format(get_home()))
if not os.path.exists("{}/.config/uengine-keyboard/key.json".format(get_home())):
write_txt("{}/.config/uengine-keyboard/key.json".format(get_home()), "{}")
###################
#
###################
setting = False
programPath = os.path.split(os.path.realpath(__file__))[0] # 返回 string
iconPath = "{}/icon.png".format(os.path.split(os.path.realpath(__file__))[0])
keybo = json.loads(readtxt("{}/.config/uengine-keyboard/key.json".format(get_home())))
version = json.loads(readtxt("{}/information.json".format(programPath)))["Version"]
###################
# 判断是不是 root
###################
if os.geteuid() != 0:
print("不是以 root 权限运行本程序!")
root = tk.Tk()
root.overrideredirect(1)
root.withdraw()
messagebox.showerror(title="错误", message="不是以 root 权限运行本程序!")
sys.exit(1)
###################
#
###################
window = tk.Tk()
win = ttk.Frame(window)
show = ttk.Frame(win)
settingLabelText = tk.StringVar()
# 设置菜单栏
menu = tk.Menu(window, tearoff=0, background="white")
programMenu = tk.Menu(menu, tearoff=0, background="white")
aboutMenu = tk.Menu(menu, tearoff=0, background="white")
settingLabel = ttk.Label(win, textvariable=settingLabelText)
settingMouseToKeyboard = ttk.Button(show, text="启动键盘映射(已启用)")
settingButton = ttk.Button(show, text="添加或覆盖键盘映射设置", command=Settings)
settingMouseToKeyboard.configure(state=tk.DISABLED)
style = ttkthemes.ThemedStyle(window)
style.set_theme("breeze")
window.resizable(0, 0)
window.iconphoto(False, tk.PhotoImage(file=iconPath))
window.title("uengine 键盘映射 {}".format(version))
menu.add_cascade(label="程序", menu=programMenu)
menu.add_cascade(label="帮助", menu=aboutMenu)
menu.configure(activebackground="dodgerblue")
programMenu.add_command(label="导入映射设置", command=Open)
programMenu.add_command(label="导出映射设置", command=Save)
programMenu.add_command(label="删除所有映射设置", command=Clean)
programMenu.add_separator()
programMenu.add_command(label="退出程序", command=sys.exit)
programMenu.configure(activebackground="dodgerblue")
aboutMenu.add_command(label="关于", command=About)
window.config(menu=menu) # 显示菜单栏
show.grid(row=1, column=0)
settingLabel.grid(row=0, column=0)
settingMouseToKeyboard.grid(row=0, column=0)
settingButton.grid(row=0, column=1)
win.pack(fill="both", expand="yes")
threading.Thread(target=Key).start()
threading.Thread(target=ShowTips).start()
window.mainloop()

View File

@@ -2,8 +2,8 @@
# 使用系统默认的 python3 运行
###########################################################################################
# 作者gfdgd xi<3025613752@qq.com>
# 版本1.3.2
# 更新时间2021年8月15
# 版本1.4.0
# 更新时间2021年8月26
# 感谢anbox、deepin 和 UOS
# 基于 Python3 的 tkinter 构建
# 更新actionchen<917981399@qq.com>
@@ -369,6 +369,9 @@ def saveicon():
print(iconSavePath+"iconpaths")
SaveApkIcon(temppath, iconSavePath)
def KeyboardToMouse():
threading.Thread(target=os.system, args=["pkexec env DISPLAY=$DISPLAY XAUTHORITY=$XAUTHORITY {}/uengine-keyboard".format(programPath)]).start()
# 用户自行保存APK
def SaveIconToOtherPath():
apkPath = ComboInstallPath.get()
@@ -696,7 +699,7 @@ title = "uengine 运行器 {}".format(version)
updateTime = information["Time"]
updateThings = "{} 更新内容:\n{}\n更新时间{}".format(version, updateThingsString, updateTime, time.strftime("%Y"))
iconPath = "{}/icon.png".format(os.path.split(os.path.realpath(__file__))[0])
desktop = "/opt/apps/uengine-runner/UengineAndroidProgramList.desktop"
desktop = programPath + "/UengineAndroidProgramList.desktop"
desktopName = "UengineAndroidProgramList.desktop"
contribute = "\n".join(information["Contribute"])
useProgram = "\n".join(information["Use"])
@@ -884,6 +887,7 @@ programmenu.add_separator() # 设置分界线
programmenu.add_command(label="退出程序", command=window.quit) # 设置“退出程序”
uengine.add_command(label="uengine 应用打包", command=OpenUengineDebBuilder)
uengine.add_command(label="uengine 键盘映射", command=KeyboardToMouse)
uengine.add_cascade(label="uengine 服务", menu=uengineService)
uengine.add_cascade(label="uengine 网络桥接", menu=uengineInternet)
uengine.add_cascade(label="uengine 快捷方式", menu=uengineIcon)

View File

@@ -0,0 +1,59 @@
#!/usr/bin/env python3
import os
import sys
import json
import shutil
import requests
import traceback
# 读取文本文档
def read_txt(path):
f = open(path,"r") # 设置文件对象
str = f.read() # 获取内容
f.close() # 关闭文本对象
return str # 返回结果
def GetPackageUpdateInformation():
global setting
global package
for i in allJson['Program']:
if i['Package'] == package:
return i
try:
setting = json.loads(read_txt("{}/setting.json".format(os.path.split(os.path.realpath(__file__))[0])))
except:
traceback.print_exc()
print("配置文件无法访问!")
package = setting['Package']
nowVersion = setting['Version']
try:
jsons = requests.get(setting["Url"])
except:
traceback.print_exc()
print("服务器出现错误!")
sys.exit(1)
allJson = json.loads(jsons.text)
updateInformation = GetPackageUpdateInformation()
name = updateInformation['Name']
newVersion = updateInformation['Version']
print("更新程序:{}".format(name))
print("最新版本:{}".format(newVersion))
print("目前版本:{}".format(nowVersion))
if nowVersion == newVersion:
print("目前是最新版本,无需更新!")
quit()
print("更新内容:")
print(updateInformation['New Things'])
choose = input("更新?[Y/N]")
if choose.upper() == "N":
quit()
if os.path.exists("/tmp/update-console-{}".format(package)):
shutil.rmtree("/tmp/update-console-{}".format(package))
os.mkdir("/tmp/update-console-{}".format(package))
if updateInformation["Linux App Url"][0] == None:
print("没有可用包源")
quit()
os.system("wget '{}' -P '/tmp/update-console-{}'".format(updateInformation["Linux App Url"][0], package))
os.system("sudo dpkg -i /tmp/update-console-{}/*".format(package))
os.system("sudo apt install -f -y")