The Fisrt Updated

This commit is contained in:
2026-01-25 13:54:16 +08:00
commit 4c90aec977
19 changed files with 1037 additions and 0 deletions

9
.vscode/settings.json vendored Normal file
View File

@@ -0,0 +1,9 @@
{
"files.associations": {
"*.ADD": "plaintext",
"*.Mod": "python",
"*.html": "html",
"*.poem": "json",
"iostream": "cpp"
}
}

56
MathMethod.py Normal file
View File

@@ -0,0 +1,56 @@
import shlex
import re
def GetFlatDivision(s,split_s,number,reto=lambda x:x.strip(),renter="\n\n"):
return "\n".join(list(map(reto,s.split(split_s)[number].replace(renter,"").split("\n"))))
def GetCarriageSpacesSmooth(s):
return '\n'.join([line.strip() for line in s.strip().split('\n')])
def GetBeforeAfterRuleLookup(s,before,after):
return "\n".join(list(map(lambda x:re.search(rf'\{before}(.*?)\{after}',x).group(),s.split("\n"))))
def GetRulesConvertedToJson(s,before,after):
result = {}
for match in re.finditer(rf'\{before}(.*?)\s(.*?){after}', s, re.DOTALL):
key = match.group(1)
values = match.group(2)
lexer = shlex.shlex(values, posix=True)
lexer.whitespace += ' '
lexer.whitespace_split = True
values = list(lexer)
result[key] = values
return result
def GetRulesConvertedToJson2(s):
result = {}
key, values = re.match(r'(\w+)\s(.+)', s).groups()
lexer = shlex.shlex(values, posix=True)
lexer.whitespace += ','
lexer.whitespace_split = True
lexer.quotes = "'"
result[key] = list(lexer)
return result
def AssemblyToJson(s,FunctionKeywordRules=r'.([\w]+):',MakeRules=lambda x:x):
output_dict = {}
current_key = ""
current_value = []
lines = s.split('\n')
for line in lines:
if re.match(FunctionKeywordRules, line):
if current_key:
output_dict[current_key] = current_value
current_value = []
current_key = line.strip().split(":")[0]
else:
if line.strip() != "":
current_value.append(MakeRules(line.strip().split(";")[0]))
if current_key:
output_dict[current_key.split(":")[0]] = current_value
return output_dict
def AssembleTextBreakdowns(s):
return []

BIN
PyBase.Bin Normal file

Binary file not shown.

30
PyBase.cpsm Normal file
View File

@@ -0,0 +1,30 @@
[声明类型 蟒蛇汇编中文];声明文件为PyBaseCn类型
[声明入口 .主函数];声明入口为.MAIN
[声明完成]
.主函数:
调用函数 函数示例甲, '你好'
调用函数 函数示例乙, 12,13
获取返回调用函数 丙返回值, 函数示例丙, '示例的文本'
调用函数 输出, 丙返回值
返回 0
.函数示例甲:
获取调用值 文本变量, 0
调用函数 输出, 文本变量
.函数示例乙:
获取调用值 变量1, 0
获取调用值 变量2, 1
调用函数 加法, 结果1, 变量1, 变量2
调用函数 减法, 结果2, 变量1, 变量2
调用函数 乘法, 结果3, 变量1, 变量2
调用函数 除法, 结果4, 变量1, 变量2
调用函数 输出, 结果1
调用函数 输出, 结果2
调用函数 输出, 结果3
调用函数 输出, 结果4
.函数示例丙:
获取调用值 变量1, 0
返回 变量1

9
PyBase.psm Normal file
View File

@@ -0,0 +1,9 @@
[STATED "PyBase"];声明文件为PyBase类型
[MAIN .MAIN];声明入口为.MAIN
[END_HIT]
.MAIN:
VLE MOD, 0
VAE MSG,"Hello"
INT 0x80
INT 0xFF

73
Script.py Normal file
View File

@@ -0,0 +1,73 @@
import MathMethod
import binascii
import tools
import shlex
import json
import fio
import re
import os
def is_in(json,key):
if key in json:
return True
else:
return False
def is_kin(list,index):
if 0 <= index < len(list):
return True
else:
return False
#基本读取
read=fio.openr("./PyBase.psm")
pybasecode=binascii.hexlify(read.encode('utf-8'))
_IStart={"VERSION":"3.7.5","MAIN":".MAIN"}
#获取所有头内容(.Start)
_=MathMethod.GetFlatDivision(read,"[END_HIT]",0)
_=MathMethod.GetCarriageSpacesSmooth(_)
_=MathMethod.GetBeforeAfterRuleLookup(_,"[","]")
_Start=MathMethod.GetRulesConvertedToJson(_,"[","]")
if is_in(_Start,"STATED"):
if is_kin(_Start["STATED"],0):
if _Start["STATED"][0].lower() == "pybase":
pass
else:
print("- * - Error: [STATED] isn't pybase")
os._exit(0)
else:
print("- * - Error: [STATED] isn't be <Key>")
os._exit(0)
else:
print("- * - Error: There is no [STATED]")
os._exit(0)
if is_in(_Start,"VERSION"):
if is_kin(_Start["VERSION"],0):
if len(_Start["VERSION"][0]) <= 10:
_IStart["VERSION"]=_Start["VERSION"][0]
else:
print("- * - Warning: [VERSION] len(<Key>) > 10")
else:
print("- * - Warning: [VERSION] isn't be <Key>")
else:
print("- * - Warning: There is no [VERSION]")
if is_in(_Start,"MAIN"):
if is_kin(_Start["MAIN"],0):
_IStart["MAIN"]=_Start["MAIN"][0]
print("- * - InFo: [MAIN] .MAIN -> "+_Start["MAIN"][0])
else:
print("- * - Warning: [MAIN] isn't be <Key>(Use .MAIN)")
else:
print("- * - Warning: There is no [MAIN](Use .MAIN)")
#获取所有代码内容(.Code)
_=MathMethod.GetFlatDivision(read,"[END_HIT]",1,lambda x:x,"")
_Code=MathMethod.AssemblyToJson(_,MakeRules=lambda x:MathMethod.GetRulesConvertedToJson2(x))
#编译(甚至不需要分析意思)
_Base=bytes()
_Base+=bytes.fromhex("0020"*2+"507942617365"+"AA"*5+"00")
_Base+=bytes.fromhex("5468697320697320612070726F6772616D20746861742063616E206265206C61756E63686564206279205079426173650A")
_Base+=bytes.fromhex(binascii.hexlify(_IStart["VERSION"].rjust(10).encode()).decode())
_Base+=bytes.fromhex(binascii.hexlify(tools.CBDS(str(_Code))).decode())
fio.openw("./PyBase.Bin",_Base,2)

75
ScriptCn.py Normal file
View File

@@ -0,0 +1,75 @@
import MathMethod
import binascii
import tools
import shlex
import json
import fio
import re
import os
def is_in(json,key):
if key in json:
return True
else:
return False
def is_kin(list,index):
if 0 <= index < len(list):
return True
else:
return False
#基本读取
read=fio.openr("./PyBase.cpsm")
pybasecode=binascii.hexlify(read.encode('utf-8'))
_IStart={"VERSION":"3.7.5","MAIN":".主函数"}
#获取所有头内容(.Start)
_=MathMethod.GetFlatDivision(read,"[声明完成]",0)
_=MathMethod.GetCarriageSpacesSmooth(_)
_=MathMethod.GetBeforeAfterRuleLookup(_,"[","]")
_Start=MathMethod.GetRulesConvertedToJson(_,"[","]")
if is_in(_Start,"声明类型"):
if is_kin(_Start["声明类型"],0):
if _Start["声明类型"][0].lower() == "蟒蛇汇编中文":
pass
else:
print("- * - Error: [声明类型] isn't pybase")
os._exit(0)
else:
print("- * - Error: [声明类型] isn't be <Key>")
os._exit(0)
else:
print("- * - Error: There is no [声明类型]")
os._exit(0)
if is_in(_Start,"声明版本"):
if is_kin(_Start["声明版本"],0):
if len(_Start["声明版本"][0]) <= 10:
_IStart["声明版本"]=_Start["声明版本"][0]
else:
print("- * - Warning: [声明版本] len(<Key>) > 10")
else:
print("- * - Warning: [声明版本] isn't be <Key>")
else:
print("- * - Warning: There is no [声明版本]")
if is_in(_Start,"声明入口"):
if is_kin(_Start["声明入口"],0):
_IStart["声明入口"]=_Start["声明入口"][0]
print("- * - InFo: [声明入口] .声明入口 -> "+_Start["声明入口"][0])
else:
print("- * - Warning: [声明入口] isn't be <Key>(Use .声明入口)")
else:
print("- * - Warning: There is no [声明入口](Use .声明入口)")
#获取所有代码内容(.Code)
_=MathMethod.GetFlatDivision(read,"[声明完成]",1,lambda x:x,"")
_Code=MathMethod.AssemblyToJson(_,MakeRules=lambda x:MathMethod.GetRulesConvertedToJson2(x))
print(_Code)
#编译(甚至不需要分析意思)
_Base=bytes()
_Base+=bytes.fromhex("0020"*2+"507942617365"+"AA"*5+"00")
_Base+=bytes.fromhex("5468697320697320612070726F6772616D20746861742063616E206265206C61756E63686564206279205079426173650A")
_Base+=bytes.fromhex(binascii.hexlify(_IStart["VERSION"].rjust(10).encode()).decode())
_Base+=bytes.fromhex(binascii.hexlify(tools.CBDS(str(_Code))).decode())
fio.openw("./PyBase.Bin",_Base,2)

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

31
c.cpp Normal file
View File

@@ -0,0 +1,31 @@
#include <iostream>
using namespace std;
int A(int S);
void B(int X,int Y);
int C1(int X);
int main()
{
A(123);
B(12,13);
cout << C1(123) << endl;
}
int A(int S)
{
cout << S << endl;
return 0;
}
void B(int X,int Y)
{
cout << X+Y << endl;
cout << X-Y << endl;
cout << X*Y << endl;
cout << X/Y << endl;
}
int C1(int X)
{
return X;
}

BIN
c.exe Normal file

Binary file not shown.

37
fio.py Normal file
View File

@@ -0,0 +1,37 @@
#读/写/添
def openw(file,write,mode="1",encoding="UTF-8"):
if mode=="1" or mode==1:
f=open(file,"w",encoding=encoding)
f.write(write)
f.close()
elif mode=="2" or mode==2:
f=open(file,"wb")
f.write(write)
f.close()
else:
return
return
def opena(file,write,mode="1",encoding="UTF-8"):
if mode=="1" or mode==1:
f=open(file,"a",encoding=encoding)
f.write(write)
f.close()
elif mode=="2" or mode==2:
f=open(file,"ab")
f.write(write)
f.close()
else:
return
return
def openr(file,mode="1",encoding="UTF-8"):
if mode=="1" or mode==1:
f=open(file,"r",encoding=encoding)
read=f.read()
f.close()
elif mode=="2" or mode==2:
f=open(file,"rb")
read=f.read()
f.close()
else:
return
return read

0
t2.py Normal file
View File

1
text Normal file
View File

@@ -0,0 +1 @@
PyBase

14
text.py Normal file
View File

@@ -0,0 +1,14 @@
import re
import shlex
def GetRulesConvertedToJson2(s):
result = {}
key, values = re.match(r'(\w+)\s(.+)', s).groups()
lexer = shlex.shlex(values, posix=True)
lexer.whitespace += ','
lexer.whitespace_split = True
lexer.quotes = "'"
result[key] = list(lexer)
return result
print(GetRulesConvertedToJson2("VEG 1,2,'123 23',5"))

702
tools.py Normal file
View File

@@ -0,0 +1,702 @@
#550W 工具箱
#所需模块
#UI库
import tkinter.filedialog as tf
import tkinter.messagebox as tm
import tkinter.constants as Keys
import tkinter.ttk as ttk
import tkinter as tk
import os
os.environ["PYGAME_HIDE_SUPPORT_PROMPT"]=""#阻止pygame-print
import pygame
try:
pygame.mixer.init()
except:
print("PyGame InIt Error")
#系统库
import tempfile
import sys,os
from io import BytesIO
import platform
import getpass
import psutil
import shutil
import traceback
import winreg
import wmi
try:
import winshell,win32con,win32api,win32gui
except:
pass
#文件库
import configparser
import zipfile
import json
#编码库
import binascii
import hashlib
import base64
import uuid
import re
#进程库
from threading import Thread
import asyncio
import subprocess
#时间库
import datetime,time
#图像库
from PIL import Image,ImageTk,ImageDraw
import cv2
#网页库
import urllib
import requests
import flask
import flask_socketio
#数学库
import random
import numpy
import math
import copy
#音频库
#基础变量
temp=os.environ["temp"]
#Windows管理接口
WindowsManagementInterface=wmi.WMI()
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36 QIHU 360SE'
}
def webpost(url,data):
response = requests.post(url,data=data,headers={'Content-Type': 'application/x-www-form-urlencoded'})
return response
def webget(url):
response = requests.get(url,headers=headers)
return response
#UUID
def GUUID():
return str(uuid.uuid3(uuid.NAMESPACE_DNS, str(random.randint(0, 10000000000000000000))))
# 读/写/添
def openw(file, write, mode="1", encoding="UTF-8"):
if mode == "1" or mode == 1:
with open(file, "w", encoding=encoding) as f:
f.write(write)
elif mode == "2" or mode == 2:
with open(file, "wb") as f:
f.write(write)
def opena(file, write, mode="1", encoding="UTF-8"):
if mode == "1" or mode == 1:
with open(file, "a", encoding=encoding) as f:
f.write(write)
elif mode == "2" or mode == 2:
with open(file, "ab") as f:
f.write(write)
def openr(file, mode="1", encoding="UTF-8"):
if mode == "1" or mode == 1:
with open(file, "r", encoding=encoding) as f:
read = f.read()
elif mode == "2" or mode == 2:
with open(file, "rb") as f:
read = f.read()
return read
def MakeTempFile(write):
tmp_file = tempfile.NamedTemporaryFile(delete=True)
tmp_file.write(write)
tmp_file.close()
return tmp_file
def MakeTempFileNF(write):
tmp_file = tempfile.NamedTemporaryFile(delete=True)
tmp_file.write(write)
return tmp_file
def MakeTempFilePattern(suffix=".tmp",delete=True):
with tempfile.NamedTemporaryFile(suffix='.png', delete=delete) as tmp_file:
return tmp_file
#MP3播放
def MP3Play(mp3_path,volume=10,sleep=-1):
pygame.mixer.music.load(mp3_path) # 加载音乐
pygame.mixer.music.set_volume(volume)# 设置音量大小0~1的浮点数
pygame.mixer.music.play() # 播放音频
if sleep == -1:
time.sleep(get_duration_wave(mp3_path))
else:
time.sleep(sleep)
#MP3时间获取
def get_duration_wave(file_path):
with wave.open(file_path, "r") as audio_file:
frame_rate = audio_file.getframerate()
n_frames = audio_file.getnframes()
duration = n_frames / float(frame_rate)
return duration
#时间格式化
def TimeFormat(s,end=""):
return time.strftime("[%Y/%m/%d %H:%M:%S]: "+str(s)+end, time.localtime())
def TimeFormatStr(s="%Y/%m/%d %H:%M:%S",end=""):
return time.strftime(s+end, time.localtime())
def TimeFormatv(make_uuid=True):
return datetime.datetime.now().strftime("%Y年%m月%d日-%H时%M分%S秒%f"+"-"+str(uuid.uuid3(uuid.NAMESPACE_DNS, str(random.randint(0, 10000000000000000000)))))
def Is_TrueColorCode(code):
pattern = re.compile(r'^#([0-9A-Fa-f]{6}|[0-9A-Fa-f]{3})$')
return bool(pattern.match(code))
#Base64转图片
def base64_to_image(base64_str: str) -> Image.Image:
base64_data = re.sub("^data:image/.+;base64,", "", base64_str)
byte_data = base64.b64decode(base64_data)
image_data = BytesIO(byte_data)
img = Image.open(image_data)
return img
#图片转Base64
def image_to_base64(image: Image.Image, fmt="png") -> str:
output_buffer = BytesIO()
image.save(output_buffer, format=fmt)
byte_data = output_buffer.getvalue()
base64_str = base64.b64encode(byte_data).decode("utf-8")
return f"data:image/{fmt};base64," + base64_str
#返回"没有文件"错误类型
def ReturnFileNotFoundError(InFo,file):
ERROR=FileNotFoundError(InFo)
ERROR.filename=file
#判断ini文件是否正确
def IS_INI(ini_file):
#创建ConfigParser对象
config = configparser.ConfigParser()
#读取INI文件
try:
#尝试读取
config.read(ini_file)
except configparser.Error as e:
#报错
return False
else:
#没有报错
return True
#ini转字典
def INI2DICT(ini_file):
#创建ConfigParser对象
config = configparser.ConfigParser()
#读取INI文件
config.read(ini_file)
#创建二级字典
config_dict = {}
#遍历INI文件的sections
for section in config.sections():
#创建子字典
section_dict = {}
#遍历每个section中的options
for option in config.options(section):
#将选项和值添加到子字典中
section_dict[option] = config.get(section, option)
#将子字典添加到二级字典中
config_dict[section] = section_dict
#返回文件
return config_dict
import binascii
import os
temp=os.environ["temp"]
def chunk_string(s, n):
return [s[i:i+n] for i in range(0, len(s), n)]
def four_split(s):
a=[0,0,0,0]
a[1]=s[0]
a[3]=s[1]
a[0]=s[2]
a[2]=s[3]
s=""
for i in a:
s+=i
return s
def R_four_split(s):
a=[0,0,0,0]
a[0]=s[1]
a[1]=s[3]
a[2]=s[0]
a[3]=s[2]
s=""
for i in a:
s+=i
return s
def CBDF(file,dllfile):
f=open(file,"rb")
get=f.read()
f.close()
s_hex=get.hex()
s_hex=s_hex[::-1]
s_hex=chunk_string(s_hex,4)
ret=""
for i in s_hex:
if len(i) == 4:
ret+=four_split(i)
else:
ret+=i
hexgo=binascii.a2b_hex(ret)
f=open(dllfile,"wb")
f.write(hexgo)
f.close()
def CBDS(s,encoding="UTF-8"):
s=bytes(s,encoding=encoding)
s_hex=s.hex()
s_hex=s_hex[::-1]
s_hex=chunk_string(s_hex,4)
ret=""
for i in s_hex:
if len(i) == 4:
ret+=four_split(i)
else:
ret+=i
hexgo=binascii.a2b_hex(ret)
return hexgo
def CBDMS(s,encoding="UTF-8"):
s=bytes(s,encoding=encoding)
s_hex=s.hex()
s_hex=s_hex[::-1]
s_hex=chunk_string(s_hex,4)
ret=""
for i in s_hex:
if len(i) == 4:
ret+=four_split(i)
else:
ret+=i
return ret
def GBDMS(s):
ret=""
s_hex=chunk_string(s,4)
for i in s_hex:
if len(i) == 4:
ret+=R_four_split(i)
else:
ret+=i
ret=ret[::-1]
hexgo = binascii.a2b_hex(ret).decode("utf-8")
return hexgo
def GBDS(s,encoding="utf-8"):
s_hex = s.hex()
ret=""
s_hex=chunk_string(s_hex,4)
for i in s_hex:
if len(i) == 4:
ret+=R_four_split(i)
else:
ret+=i
ret=ret[::-1]
hexgo = binascii.a2b_hex(ret).decode(encoding)
return hexgo
def GBDF(dllfile):
f = open(dllfile, "rb")
get = f.read()
f.close()
s_hex = get.hex()
ret=""
s_hex=chunk_string(s_hex,4)
for i in s_hex:
if len(i) == 4:
ret+=R_four_split(i)
else:
ret+=i
ret=ret[::-1]
hexgo = binascii.a2b_hex(ret)
return hexgo
def WriteToFile(content, filename):
with open(filename, "wb") as f:
f.write(content)
#信息结构体
class InFo:
def __init__(self):
pass
#异步装饰器
def asyncs(f):
def wrapper(*args, **kwargs):
thr = Thread(target = f, args = args, kwargs = kwargs)
thr.start()
return wrapper
#获取多个文件MD5(自匹配)
def GetFilesMD5(*file_paths):
md5_list = []
for file_path in file_paths:
md5_list.append(GetFileMD5(file_path))
return md5_list
def GetFileMD5(file_name):
"""
计算文件的md5
:param file_name:
:return:
"""
m = hashlib.md5()
with open(file_name,'rb') as fobj:
while True:
data = fobj.read(4096)
if not data:
break
m.update(data)
return m.hexdigest()
def GetStrMD5(content):
"""
计算字符串md5
:param content:
:return:
"""
m = hashlib.md5(content)
return m.hexdigest()
def GetDirFileMD5(Dir):
"""
计算文件夹所有文件(二枝树算法)
:param Dir:
:return list:
"""
MD5S=[]
if not os.path.isdir(Dir):
#No Use raise
return FileNotFoundError()
for i in os.listdir(Dir):
if os.path.isfile(os.path.normpath(Dir+"/"+i)):
MD5S.append({"FileName":os.path.normpath(Dir+"/"+i),"Type":"File","MD5":GetFileMD5(os.path.normpath(Dir+"/"+i))})
if os.path.isdir(os.path.normpath(Dir+"/"+i)):
MD5S.append({"FileName":os.path.normpath(Dir+"/"+i),"Type":"Dir","ChildRen":GetDirFileMD5(os.path.normpath(Dir+"/"+i))})
return MD5S
def IsDirFileMD5(MD5List,Dir,Bind=lambda x:None,sleep=0):
for i in MD5List:
s=copy.deepcopy(i)
s["ChildRen"]="Pass"
Bind(s["FileName"])
time.sleep(sleep)
if i["Type"]=="File":
if not os.path.isfile(i["FileName"]):
return False,1,i["FileName"]
if not GetFileMD5(i["FileName"]) == i["MD5"]:
return False,2,i["FileName"]
if i["Type"]=="Dir":
if not os.path.isdir(i["FileName"]):
return False,3,i["FileName"]
Thing=IsDirFileMD5(i["ChildRen"],i["FileName"],Bind,sleep)
if not Thing[0]:
return False,4,i["FileName"],Thing
return (True,1)
#获取字节对应的大小
def ConvertSize(size_bytes):
if size_bytes == 0:
return "0B"
size_names = ("B", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB")
i = 0
while size_bytes >= 1024 and i < len(size_names) - 1:
size_bytes /= 1024
i += 1
return str(size_bytes)+str(size_names[i])
#获取所有可用的摄像头设备
def get_available_cameras():
camera_list = []
index = 0
while True:
cap = cv2.VideoCapture(index)
if not cap.read()[0]:
break
else:
camera_list.append(index)
cap.release()
index += 1
return camera_list
#模块组启动程序
class Mod:#模块组结构体
def __init__(self,ChasteGlobalVariables,GlobalVariables,name):
#初始化模块组启动类
#模块组基础配置
self.path="./Module/"+name+"/"
self.path_config=self.path+"config.ini"
self.PersonalGlobal=copy.copy(ChasteGlobalVariables)
self.Global=GlobalVariables
#判断模块组是否存在
if not os.path.isdir(self.path):#如果不存在
raise ReturnFileNotFoundError("Mod Is Not Found",self.path)
#判断模块组配置文件是否存在
if not os.path.isfile(self.path_config):
raise ReturnFileNotFoundError("Mod config.ini Is Not Found",self.path_config)
#判断模块组配置文件是否正确
if not IS_INI(self.path_config):
raise configparser.Error("INI is Error")
self.config=INI2DICT(self.path_config)
#如果模块组配置文件没有所需值
if not "CONFIG" in self.config:
raise configparser.Error("INI is Error")
if not "entry" in self.config["CONFIG"] or not "decode" in self.config["CONFIG"] or not "library" in self.config["CONFIG"]:
raise configparser.Error("INI is Error")
#转存模块组配置文件
self.Entry=self.config["CONFIG"]["entry"]#入口文件
self.Decode=self.config["CONFIG"]["decode"]#解码方式(使用正常编码还是BoxTools.Mod加密编码),Encoding必须是UTF-8,因为Python只支持UTF-8编码
self.Library=self.config["CONFIG"]["library"]+"/"#其他的Py文件,入口文件会调用(子模块)
#判断模块组配置文件转存数据是否正确
if not os.path.isfile(self.path+self.Entry):
raise ReturnFileNotFoundError("Mod Entry Is Not Found",self.path+self.Entry)
if not (self.Decode.lower() == "python" or self.Decode.lower() == "mod"):
raise configparser.Error("INI Decode is Not Found")
if self.Library != "" and not os.path.isdir(self.path+self.Library):
raise ReturnFileNotFoundError("Mod Library Is Not Found",self.Library)
def RunMain(self):
#启动主模块
#读取主模块
#判断加密类型
if self.Decode.lower() == "python":#如果是Python加密类型
code=openr(self.path+self.Entry)#直接读取
elif self.Decode.lower() == "mod":#如果是Mod加密类型
code=GBDS(self.path+self.Entry)#解码读取
else:#没有这个类型
raise UnicodeDecodeError("Decode Is Not Found")#报编码错误
#App.py是和Main.py和所有Mod同步的文件
#这个文件本意是为了让Vs-Code的高亮提示正常显示,但是,不能纳入正常代码运行
#App.py可以理解为"Vs-Code Module Start 高亮修复"
code=code.replace("from App import *","")#删除App.py导入代码(高亮提示修复)
#把Mod启动类添加到Global里面
#创建信息类
Mod_InFo=InFo()
#把数据存到信息类
Mod_InFo.path=self.path
Mod_InFo.path_config=self.path_config
Mod_InFo.config=self.config
Mod_InFo.Entry=self.Entry
Mod_InFo.Decode=self.Decode
Mod_InFo.Library=self.Library
Mod_InFo.code=code
Mod_InFo.RunSub=self.RunSub
Mod_InFo.Global=self.Global
Mod_InFo.PersonalGlobal=self.PersonalGlobal
#存到Global
Global=self.PersonalGlobal
Global["Mod_InFo"]=Mod_InFo
#通过exec启动
exec(code,Global)
def RunSub(self,GlobalVariables,name):
#启动副模块
#读取副模块
#判断加密类型
if self.Decode.lower() == "python":#如果是Python加密类型
code=openr(self.path+self.Library+name)#直接读取
elif self.Decode.lower() == "mod":#如果是Mod加密类型
code=GBDS(self.path+self.Library+name)#解码读取
else:#没有这个类型
raise UnicodeDecodeError("Decode Is Not Found")#报编码错误
#App.py是和Main.py和所有Mod同步的文件
#这个文件本意是为了让Vs-Code的高亮提示正常显示,但是,不能纳入正常代码运行
#App.py可以理解为"Vs-Code Module Start 高亮修复"
code=code.replace("from App import *","")#删除App.py导入代码(高亮提示修复)
#把Mod启动类添加到Global里面
#创建信息类
Mod_InFo=InFo()
#把数据存到信息类
Mod_InFo.path=self.path
Mod_InFo.path_config=self.path_config
Mod_InFo.config=self.config
Mod_InFo.Entry=self.Entry
Mod_InFo.Decode=self.Decode
Mod_InFo.Library=self.Library
Mod_InFo.code=code
Mod_InFo.RunSub=self.RunSub
Mod_InFo.file=self.path+self.Library+name
Mod_InFo.Global=self.Global
Mod_InFo.PersonalGlobal=self.PersonalGlobal
#存到Global
GlobalVariables=self.PersonalGlobal
GlobalVariables["Mod_InFo"]=Mod_InFo
#通过exec启动
exec(code,GlobalVariables)
class Mod_Var():
def __init__(self):
self.Global={}
class FileVarToVar():
def __init__(self,Var):
N2={}
if not type(Var) == type({}):
raise TypeError("Var Not Is Dict")
for i in Var:
if len(i) > 2:
if not i[0:2] == "__":
if not i[-2:] == "__":
N2[i]=Var[i]
self.Global=N2
ToolsGlobalVar=FileVarToVar(globals())
ToolsGlobal=ToolsGlobalVar.Global
def add_to_startup(name,file_path=""):
#By IvanHanloth
if file_path == "":
file_path = os.path.realpath(sys.argv[0])
auth="IvanHanloth"
key = winreg.OpenKey(winreg.HKEY_CURRENT_USER, r"Software\Microsoft\Windows\CurrentVersion\Run",winreg.KEY_SET_VALUE, winreg.KEY_ALL_ACCESS|winreg.KEY_WRITE|winreg.KEY_CREATE_SUB_KEY)#By IvanHanloth
winreg.SetValueEx(key, name, 0, winreg.REG_SZ, file_path)
winreg.CloseKey(key)
def remove_from_startup(name):
auth="IvanHanloth"
key = winreg.OpenKey(winreg.HKEY_CURRENT_USER, r"Software\Microsoft\Windows\CurrentVersion\Run", winreg.KEY_SET_VALUE, winreg.KEY_ALL_ACCESS|winreg.KEY_WRITE|winreg.KEY_CREATE_SUB_KEY)#By IvanHanloth
try:
winreg.DeleteValue(key, name)
except FileNotFoundError:
print(f"{name} not found in startup.")
else:
print(f"{name} removed from startup.")
winreg.CloseKey(key)
def install_font(font_path):
# 获取字体文件的目录和文件名
directory, filename = os.path.split(font_path)
# 注册字体
font_reg_key = win32api.RegOpenKey(win32con.HKEY_LOCAL_MACHINE, r"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts", 0, win32con.KEY_ALL_ACCESS)
win32api.RegSetValueEx(font_reg_key, filename, 0, win32con.REG_SZ, font_path)
win32api.RegCloseKey(font_reg_key)
# 刷新系统的字体缓存
win32gui.SendMessageTimeout(win32con.HWND_BROADCAST, win32con.WM_FONTCHANGE, 0, 0, win32con.SMTO_ABORTIFHUNG, 100)
def uninstall_font(font_name):
# 删除注册表中对应的字体键值
font_reg_key = win32api.RegOpenKey(win32con.HKEY_LOCAL_MACHINE, r"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts", 0, win32con.KEY_ALL_ACCESS)
win32api.RegDeleteKeyEx(font_reg_key, font_name, win32con.KEY_ALL_ACCESS)
win32api.RegCloseKey(font_reg_key)
# 刷新系统的字体缓存
win32gui.SendMessageTimeout(win32con.HWND_BROADCAST, win32con.WM_FONTCHANGE, 0, 0, win32con.SMTO_ABORTIFHUNG, 100)
def create_lnk(bin_path: str, name: str, desc: str):
try:
shortcut = os.path.join(winshell.desktop(), name + ".lnk")
winshell.CreateShortcut(
Path=shortcut,
Target=bin_path,
Icon=(bin_path, 0),
Description=desc
)
return True
except ImportError as err:
print("Well, do nothing as 'winshell' lib may not available on current os")
print("error detail %s" % str(err))
return False
def create_app_registry_entry(display_name, publisher, remark,
install_location, exe_path, icon_path,
uninstall_path, version, EstimatedSize,
ModifyPath, ProductID, RegOwner,
RegCompany, HelpLink, HelpTelephone,
URLUpdateInfo, URLInfoAbout, VersionMajor,
VersionMinor, NoModify, NoRepair):
#将App注册到系统
#请使用管理员方式运行
#display_name = App名称
#publisher = 发布者名称
#remark = 备注
#install_location = App目录
#exe_path = App可执行文件路径
#icon_path = App图标
#uninstall_path = App卸载可执行文件路径
#version = App显示版本
#EstimatedSize = App文件估摸大小(字节)
#ModifyPath = App修复系统可执行文件路径
#ProductID = App产品ID
#RegOwner = App注册拥有者
#RegCompany = App注册公司
#HelpLink = App网站链接
#HelpTelephone = App技术支持电话
#URLUpdateInfo = App软件更新下载链接
#URLInfoAbout = App主页链接
#VersionMajor(DWORD) = App主版本号
#VersionMinor(DWORD) = App副版本号
#NoModify(DWORD) = 如果卸载程序没有修改应用程序的选项(写1)
#NoRepair(DWORD) = 如果卸载程序没有修复应用程序的选项(写1)
# 打开软件注册表项
software_key = winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, r"SOFTWARE")
app_key = winreg.CreateKey(software_key, "Microsoft\\Windows\\CurrentVersion\\Uninstall\\" + display_name)
# 设置注册表项的值
winreg.SetValueEx(app_key, "DisplayName", 0, winreg.REG_SZ, display_name)
winreg.SetValueEx(app_key, "Comments", 0, winreg.REG_SZ, remark)
winreg.SetValueEx(app_key, "Publisher", 0, winreg.REG_SZ, publisher)
winreg.SetValueEx(app_key, "InstallLocation", 0, winreg.REG_SZ, install_location)
winreg.SetValueEx(app_key, "UninstallString", 0, winreg.REG_SZ, exe_path)
winreg.SetValueEx(app_key, "QuietUninstallString", 0, winreg.REG_SZ, uninstall_path)
winreg.SetValueEx(app_key, "DisplayIcon", 0, winreg.REG_SZ, icon_path)
winreg.SetValueEx(app_key, "DisplayVersion", 0, winreg.REG_SZ, version)
winreg.SetValueEx(app_key, "EstimatedSize", 0, winreg.REG_DWORD, EstimatedSize)
winreg.SetValueEx(app_key, "ModifyPath", 0, winreg.REG_SZ, ModifyPath)
winreg.SetValueEx(app_key, "ProductID", 0, winreg.REG_SZ, ProductID)
winreg.SetValueEx(app_key, "RegOwner", 0, winreg.REG_SZ, RegOwner)
winreg.SetValueEx(app_key, "RegCompany", 0, winreg.REG_SZ, RegCompany)
winreg.SetValueEx(app_key, "HelpLink", 0, winreg.REG_SZ, HelpLink)
winreg.SetValueEx(app_key, "HelpTelephone", 0, winreg.REG_SZ, HelpTelephone)
winreg.SetValueEx(app_key, "URLUpdateInfo", 0, winreg.REG_SZ, URLUpdateInfo)
winreg.SetValueEx(app_key, "URLInfoAbout", 0, winreg.REG_SZ, URLInfoAbout)
winreg.SetValueEx(app_key, "VersionMajor", 0, winreg.REG_DWORD, VersionMajor)
winreg.SetValueEx(app_key, "VersionMinor", 0, winreg.REG_DWORD, VersionMinor)
winreg.SetValueEx(app_key, "NoModify", 0, winreg.REG_DWORD, NoModify)
winreg.SetValueEx(app_key, "NoRepair", 0, winreg.REG_DWORD, NoRepair)
# 关闭注册表项
winreg.CloseKey(app_key)
winreg.CloseKey(software_key)