Initial commit with README
This commit is contained in:
321
sys/kernel/tools.py
Normal file
321
sys/kernel/tools.py
Normal file
@@ -0,0 +1,321 @@
|
||||
#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 ctypes
|
||||
import wmi
|
||||
u32=ctypes.windll.user32
|
||||
#文件库
|
||||
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 pystray
|
||||
#时间库
|
||||
import datetime,time
|
||||
#图像库
|
||||
from PIL import Image,ImageTk,ImageDraw
|
||||
import cv2
|
||||
#网页库
|
||||
import urllib
|
||||
import flask
|
||||
import flask_socketio
|
||||
#数学库
|
||||
import random
|
||||
import numpy
|
||||
import math
|
||||
import copy
|
||||
#音频库
|
||||
import pyaudio
|
||||
import wave
|
||||
|
||||
|
||||
#基础变量
|
||||
temp=os.environ["temp"]
|
||||
#Windows管理接口
|
||||
WindowsManagementInterface=wmi.WMI()
|
||||
|
||||
#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 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
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
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 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_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
|
||||
Reference in New Issue
Block a user