commit 246bbd8fd948c3cf8ae17e3a7df5165cd06fe2a5 Author: GVSADS Date: Sun Jan 25 17:01:16 2026 +0800 Initial commit with README diff --git a/Autorun.ini b/Autorun.ini new file mode 100644 index 0000000..7a9e9d4 --- /dev/null +++ b/Autorun.ini @@ -0,0 +1,3 @@ +[autorun] +Open=python.exe /sys/kernel/main.py +Icon=/sys/images.mik/[MICO].png \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..19fd55e --- /dev/null +++ b/README.md @@ -0,0 +1,80 @@ +# MikOS + +一个基于Python的模拟操作系统,具有图形界面和基本的文件管理功能。 + +## 项目结构 + +``` +MikOs-Explorer/ +├── home/ # 用户目录 +│ └── root/ # 根用户目录 +├── sys/ # 系统目录 +│ ├── config/ # 配置文件 +│ ├── images.mik/ # 图标资源 +│ ├── kernel/ # 内核代码 +│ ├── lib/ # 系统应用程序 +│ ├── tkinter.mik/ # Tkinter支持文件 +│ ├── ui.mik/ # UI组件 +│ └── wallpaper/ # 壁纸资源 +└── Autorun.ini # 自动运行配置 +``` + +## 功能特点 + +- 图形化桌面界面 +- 文件系统管理 +- 应用程序运行支持 +- 壁纸切换 +- 窗口管理 + +## 系统要求 + +- Python 3.x +- Tkinter库 + +## 运行方式 + +1. 确保已安装Python 3.x +2. 在项目根目录下运行: + ``` + python sys/kernel/main.pyw + ``` + +## 核心组件 + +### 内核 (sys/kernel/) +- `main.pyw` - 系统主入口 +- `UI.py` - 用户界面管理 +- `login.py` - 登录系统 +- `mount.py` - 虚拟磁盘挂载 +- `tools.py` - 工具函数 + +### 系统应用 (sys/lib/) +- `explorer` - 文件资源管理器 +- `calc` - 计算器 +- `music` - 音乐播放器 +- `setting` - 系统设置 + +## 配置文件 + +主要配置文件位于 `sys/config/config.json`,包含: +- EFI引导配置 +- 内核配置 +- DOS命令行配置 +- 分辨率设置 +- 壁纸设置 +- 文件后缀关联 + +## 版本信息 + +- EFI版本: 1.3.0 +- 内核版本: 2.1.3(Beta) +- DOS版本: 1.0 + +## 开发说明 + +MikOS是一个模拟操作系统项目,主要用于学习和演示操作系统原理。项目使用Python和Tkinter构建,实现了基本的操作系统功能。 + +## 许可证 + +MIT License diff --git a/home/root/Desktop/1 - 副本 (10).txt b/home/root/Desktop/1 - 副本 (10).txt new file mode 100644 index 0000000..e69de29 diff --git a/home/root/Desktop/1 - 副本 (11).txt b/home/root/Desktop/1 - 副本 (11).txt new file mode 100644 index 0000000..e69de29 diff --git a/home/root/Desktop/1 - 副本 (12).txt b/home/root/Desktop/1 - 副本 (12).txt new file mode 100644 index 0000000..e69de29 diff --git a/home/root/Desktop/1 - 副本 (13).txt b/home/root/Desktop/1 - 副本 (13).txt new file mode 100644 index 0000000..e69de29 diff --git a/home/root/Desktop/1 - 副本 (14).txt b/home/root/Desktop/1 - 副本 (14).txt new file mode 100644 index 0000000..e69de29 diff --git a/home/root/Desktop/1 - 副本 (15).txt b/home/root/Desktop/1 - 副本 (15).txt new file mode 100644 index 0000000..e69de29 diff --git a/home/root/Desktop/1 - 副本 (16).txt b/home/root/Desktop/1 - 副本 (16).txt new file mode 100644 index 0000000..e69de29 diff --git a/home/root/Desktop/1 - 副本 (17).txt b/home/root/Desktop/1 - 副本 (17).txt new file mode 100644 index 0000000..e69de29 diff --git a/home/root/Desktop/1 - 副本 (18).txt b/home/root/Desktop/1 - 副本 (18).txt new file mode 100644 index 0000000..e69de29 diff --git a/home/root/Desktop/1 - 副本 (19).txt b/home/root/Desktop/1 - 副本 (19).txt new file mode 100644 index 0000000..e69de29 diff --git a/home/root/Desktop/1 - 副本 (2).txt b/home/root/Desktop/1 - 副本 (2).txt new file mode 100644 index 0000000..e69de29 diff --git a/home/root/Desktop/1 - 副本 (20).txt b/home/root/Desktop/1 - 副本 (20).txt new file mode 100644 index 0000000..e69de29 diff --git a/home/root/Desktop/1 - 副本 (21).txt b/home/root/Desktop/1 - 副本 (21).txt new file mode 100644 index 0000000..e69de29 diff --git a/home/root/Desktop/1 - 副本 (22).txt b/home/root/Desktop/1 - 副本 (22).txt new file mode 100644 index 0000000..e69de29 diff --git a/home/root/Desktop/1 - 副本 (23).txt b/home/root/Desktop/1 - 副本 (23).txt new file mode 100644 index 0000000..e69de29 diff --git a/home/root/Desktop/1 - 副本 (24).txt b/home/root/Desktop/1 - 副本 (24).txt new file mode 100644 index 0000000..e69de29 diff --git a/home/root/Desktop/1 - 副本 (25).txt b/home/root/Desktop/1 - 副本 (25).txt new file mode 100644 index 0000000..e69de29 diff --git a/home/root/Desktop/1 - 副本 (26).txt b/home/root/Desktop/1 - 副本 (26).txt new file mode 100644 index 0000000..e69de29 diff --git a/home/root/Desktop/1 - 副本 (27).txt b/home/root/Desktop/1 - 副本 (27).txt new file mode 100644 index 0000000..e69de29 diff --git a/home/root/Desktop/1 - 副本 (28).txt b/home/root/Desktop/1 - 副本 (28).txt new file mode 100644 index 0000000..e69de29 diff --git a/home/root/Desktop/1 - 副本 (29).txt b/home/root/Desktop/1 - 副本 (29).txt new file mode 100644 index 0000000..e69de29 diff --git a/home/root/Desktop/1 - 副本 (3).txt b/home/root/Desktop/1 - 副本 (3).txt new file mode 100644 index 0000000..e69de29 diff --git a/home/root/Desktop/1 - 副本 (30).txt b/home/root/Desktop/1 - 副本 (30).txt new file mode 100644 index 0000000..e69de29 diff --git a/home/root/Desktop/1 - 副本 (31).txt b/home/root/Desktop/1 - 副本 (31).txt new file mode 100644 index 0000000..e69de29 diff --git a/home/root/Desktop/1 - 副本 (4).txt b/home/root/Desktop/1 - 副本 (4).txt new file mode 100644 index 0000000..e69de29 diff --git a/home/root/Desktop/1 - 副本 (5).txt b/home/root/Desktop/1 - 副本 (5).txt new file mode 100644 index 0000000..e69de29 diff --git a/home/root/Desktop/1 - 副本 (6).txt b/home/root/Desktop/1 - 副本 (6).txt new file mode 100644 index 0000000..e69de29 diff --git a/home/root/Desktop/1 - 副本 (7).txt b/home/root/Desktop/1 - 副本 (7).txt new file mode 100644 index 0000000..e69de29 diff --git a/home/root/Desktop/1 - 副本 (8).txt b/home/root/Desktop/1 - 副本 (8).txt new file mode 100644 index 0000000..e69de29 diff --git a/home/root/Desktop/1 - 副本 (9).txt b/home/root/Desktop/1 - 副本 (9).txt new file mode 100644 index 0000000..e69de29 diff --git a/home/root/Desktop/1 - 副本.txt b/home/root/Desktop/1 - 副本.txt new file mode 100644 index 0000000..e69de29 diff --git a/home/root/Desktop/1.js b/home/root/Desktop/1.js new file mode 100644 index 0000000..b3cea3a --- /dev/null +++ b/home/root/Desktop/1.js @@ -0,0 +1,55 @@ +// ==UserScript== +// @name CSDN文库免vip阅读全文,解锁复制限制 +// @namespace http://tampermonkey.net/ +// @version 1.0 +// @description CSDN文库阅读全文,去除VIP登录遮罩,解锁鼠标复制功能 +// @author icescat +// @match *://*.csdn.net/* +// @grant none +// @license MIT +// ==/UserScript== + +(function() { + 'use strict'; + + const adjustArticle = () => { + // 移除遮罩层 + document.querySelectorAll('.open, .vip').forEach(el => el.remove()); + + // 展开被限制高度的内容 + const articleContainer = document.querySelector('.article-box .cont.first-show[data-v-6487a68f]'); + if (articleContainer) { + articleContainer.style.maxHeight = 'none'; + } + }; + + // 启用复制功能 + const enableCopy = () => { + document.body.oncopy = null; + document.oncopy = null; + document.querySelectorAll('*').forEach(el => { + el.style.userSelect = 'auto'; + }); + }; + + // 使用MutationObserver来监视文档的变化 + const observer = new MutationObserver((mutations) => { + mutations.forEach((mutation) => { + if (mutation.addedNodes.length) { + adjustArticle(); + enableCopy(); + } + }); + }); + + observer.observe(document.body, { + childList: true, + subtree: true + }); + + // 页面加载时尝试执行一次 + window.addEventListener('load', () => { + adjustArticle(); + enableCopy(); + }); +})(); \ No newline at end of file diff --git a/home/root/Desktop/1.txt b/home/root/Desktop/1.txt new file mode 100644 index 0000000..790e797 --- /dev/null +++ b/home/root/Desktop/1.txt @@ -0,0 +1,11 @@ +// ==UserScript== +// @name CSDN文库免vip阅读全文,解锁复制限制 +// @namespace http://tampermonkey.net/ +// @version 1.0 +// @description CSDN文库阅读全文,去除VIP登录遮罩,解锁鼠标复制功能 +// @author icescat +// @match *://*.csdn.net/* +// @grant none +// @license MIT +// ==/UserScript== + diff --git a/home/root/Desktop/MMC音乐.Miksc b/home/root/Desktop/MMC音乐.Miksc new file mode 100644 index 0000000..0c5262f --- /dev/null +++ b/home/root/Desktop/MMC音乐.Miksc @@ -0,0 +1,6 @@ +{ + "SApp":"music", + "Start":"__init__.mia", + "display-ico":"ICO.png", + "F":"" +} \ No newline at end of file diff --git a/home/root/Desktop/WIN_20231112_07_46_41_Pro.jpg b/home/root/Desktop/WIN_20231112_07_46_41_Pro.jpg new file mode 100644 index 0000000..b4f6a22 Binary files /dev/null and b/home/root/Desktop/WIN_20231112_07_46_41_Pro.jpg differ diff --git a/home/root/Desktop/计算器.Miksc b/home/root/Desktop/计算器.Miksc new file mode 100644 index 0000000..c4366db --- /dev/null +++ b/home/root/Desktop/计算器.Miksc @@ -0,0 +1,6 @@ +{ + "SApp":"CALC", + "Start":"__init__.mia", + "display-ico":"ICO.png", + "F":"" +} \ No newline at end of file diff --git a/home/root/Desktop/设置.Miksc b/home/root/Desktop/设置.Miksc new file mode 100644 index 0000000..0d644cd --- /dev/null +++ b/home/root/Desktop/设置.Miksc @@ -0,0 +1,6 @@ +{ + "SApp":"setting", + "Start":"__init__.mia", + "display-ico":"ICO.png", + "F":"" +} \ No newline at end of file diff --git a/home/root/PASSWD b/home/root/PASSWD new file mode 100644 index 0000000..b84ed1a --- /dev/null +++ b/home/root/PASSWD @@ -0,0 +1 @@ +ROOT \ No newline at end of file diff --git a/sys/config/config.json b/sys/config/config.json new file mode 100644 index 0000000..e33ff63 --- /dev/null +++ b/sys/config/config.json @@ -0,0 +1,47 @@ +{ + "EFI":{ + "DiskSite":"S", + "BootSite":"./sys/", + "VerSion":"1.3.0" + }, + "Kernel":{ + "UsersSite":"./home/", + "SysAppSite":"lib/", + "NorAppSite":"./usr/local/", + "ui":"ui.mik/", + "images":"images.mik/", + "tkinter":"tkinter.mik/", + "VerSion":"2.1.3(Beta)" + }, + "DOS":{ + "VerSion":"1.0" + }, + "res":{ + "set":["full","overrideredirect-PASS"], + "width":1000, + "height":900 + }, + "bg":{ + "login":"wallpaper/夕阳1.png", + "sys":"wallpaper/夕阳1.png" + }, + "suffixs":{ + "[None]*":"[None]","[Dir]*":"[Dir]","bat":"[cmd]", + "cmd":"[cmd]","ppt":"[ppt]","ppts":"[ppt]", + "xls":"[xls]","xlsx":"[xlsx]","mp3":"[audio]", + "mp4":"[audio]","txt":"[text]" + }, + "filesuffixs":{}, + "color":{ + "tasks":{ + "bg":"#202020", + "win":"#202020" + } + }, + "SysFileSuffixMapping":{ + "txt":"RUN-TXT", + "miksc":"RUN-MIKSC", + "js":"RUN-TXT", + "png":"RUN-IMAGELOOKER","jpg":"RUN-IMAGELOOKER","jpeg":"RUN-IMAGELOOKER" + } +} \ No newline at end of file diff --git a/sys/images.mik/[App].ico b/sys/images.mik/[App].ico new file mode 100644 index 0000000..978234c Binary files /dev/null and b/sys/images.mik/[App].ico differ diff --git a/sys/images.mik/[Dir].ico b/sys/images.mik/[Dir].ico new file mode 100644 index 0000000..f969029 Binary files /dev/null and b/sys/images.mik/[Dir].ico differ diff --git a/sys/images.mik/[EICO].png b/sys/images.mik/[EICO].png new file mode 100644 index 0000000..370c5a8 Binary files /dev/null and b/sys/images.mik/[EICO].png differ diff --git a/sys/images.mik/[ESP32].ico b/sys/images.mik/[ESP32].ico new file mode 100644 index 0000000..efe3fc0 Binary files /dev/null and b/sys/images.mik/[ESP32].ico differ diff --git a/sys/images.mik/[MICO].png b/sys/images.mik/[MICO].png new file mode 100644 index 0000000..5a2df48 Binary files /dev/null and b/sys/images.mik/[MICO].png differ diff --git a/sys/images.mik/[None].ico b/sys/images.mik/[None].ico new file mode 100644 index 0000000..1f9c65c Binary files /dev/null and b/sys/images.mik/[None].ico differ diff --git a/sys/images.mik/[audio].ico b/sys/images.mik/[audio].ico new file mode 100644 index 0000000..61f1093 Binary files /dev/null and b/sys/images.mik/[audio].ico differ diff --git a/sys/images.mik/[cmd].ico b/sys/images.mik/[cmd].ico new file mode 100644 index 0000000..a04d1e2 Binary files /dev/null and b/sys/images.mik/[cmd].ico differ diff --git a/sys/images.mik/[iso].ico b/sys/images.mik/[iso].ico new file mode 100644 index 0000000..c514774 Binary files /dev/null and b/sys/images.mik/[iso].ico differ diff --git a/sys/images.mik/[ppt].ico b/sys/images.mik/[ppt].ico new file mode 100644 index 0000000..eb873f2 Binary files /dev/null and b/sys/images.mik/[ppt].ico differ diff --git a/sys/images.mik/[sql].ico b/sys/images.mik/[sql].ico new file mode 100644 index 0000000..dbd11ec Binary files /dev/null and b/sys/images.mik/[sql].ico differ diff --git a/sys/images.mik/[text].ico b/sys/images.mik/[text].ico new file mode 100644 index 0000000..7f4e7f0 Binary files /dev/null and b/sys/images.mik/[text].ico differ diff --git a/sys/images.mik/[word].ico b/sys/images.mik/[word].ico new file mode 100644 index 0000000..be335f8 Binary files /dev/null and b/sys/images.mik/[word].ico differ diff --git a/sys/images.mik/[xls].ico b/sys/images.mik/[xls].ico new file mode 100644 index 0000000..fb5f5e8 Binary files /dev/null and b/sys/images.mik/[xls].ico differ diff --git a/sys/kernel/AskDuc.md b/sys/kernel/AskDuc.md new file mode 100644 index 0000000..089d98a --- /dev/null +++ b/sys/kernel/AskDuc.md @@ -0,0 +1,34 @@ +# MikOs 文档 + +## 1.文件目录结构 +文件目录结构大多数借用Linux操作系统文件目录结构,但有有所不同,具体如下 + +文件结构: + +|文件深度1|文件深度2|文件深度3|文件深度4|类型|文件解释| +|:-|:-|:-|:-|:-|:-| +|\_\_pycache\_\_/||||目录|Python导入文件| +|home||||目录|用户组文件| +|home/|root/|||目录|默认用户| +|home/|root/|PASSWD||文件|用户密码| +|home/|root/|Desktop||目录|用户桌面文件夹| +|sys/||||目录|操作系统文件| +|sys/|\_\_pycache\_\_/|||目录|Python导入文件| +|sys/|config/|||目录|操作系统配置| +|sys/|config/|config.json||目录|操作系统配置| +|sys/|images.mik/|||目录|操作系统桌面显示图标| +|sys/|kernel/|||目录|操作系统内核文件| +|sys/|kernel/|\_\_pycache\_\_/||目录|Python导入文件| +|sys/|kernel/|login.py||文件|操作系统登录程序| +|sys/|kernel/|main.pyw||文件|操作系统内核程序| +|sys/|kernel/|mount.py||文件|操作系统虚拟挂载程序| +|sys/|kernel/|tools.py||文件|操作系统辅助功能程序| +|sys/|kernel/|UI.py||文件|操作系统UI程序| +|sys/|lib/|||目录|操作系统级程序目录| +|sys/|tkinter.mik/|||目录|tkinter辅助程序和图标| +|sys/|ui.mik/|||目录|操作系统UI辅助程序和图标| +|sys/|wallpaper/|||目录|操作系统壁纸文件夹| +|usr/||||目录|功能文件| +|usr/|bin/|||目录|MikDos命令行程序| +|usr/|sbin/|||目录|MikDos命令行Root程序| +|usr/|local/|||目录|用户级程序| diff --git a/sys/kernel/UI.py b/sys/kernel/UI.py new file mode 100644 index 0000000..7247f1b --- /dev/null +++ b/sys/kernel/UI.py @@ -0,0 +1,183 @@ +from tools import * + + + + + + + + + + +TasksFrame="" +ui_mik="" +tkinter_mik="" +master="" + +def index(root,W,H): + screenWidth = root.winfo_screenwidth() + screenHeight = root.winfo_screenheight() + width = W + height = H + left = (screenWidth - width) / 2 + top = (screenHeight - height) / 2 + root.geometry("%dx%d+%d+%d" % (width, height, left, top)) +def index100(root,W,H): + screenWidth = root.winfo_screenwidth() + screenHeight = root.winfo_screenheight() + width = W + height = H + left = (screenWidth - width) / 2 + top = (screenHeight - height) / 2 - 100 + root.geometry("%dx%d+%d+%d" % (width, height, left, top)) +def index50(root,W,H): + screenWidth = root.winfo_screenwidth() + screenHeight = root.winfo_screenheight() + width = W + height = H + left = (screenWidth - width) / 2 + top = (screenHeight - height) / 2 - 50 + root.geometry("%dx%d+%d+%d" % (width, height, left, top)) + + + +class Menu(tk.Frame): + def __init__(self,master): + if hasattr(master,"Widget"): + master=master.Widget + super().__init__(master,bg="#FFF",highlightbackground="#fed79e") + self.pack(fill=tk.X,anchor="sw",side="top") + self.subs=[] + def add_sub(self,label,menu=tk.Menu,font=("微软雅黑",10)): + sub=tk.Button(self,text=label+" "*3,bg="#FFF",fg="#000",font=font,bd=0) + sub.pack(side=tk.LEFT) + sub.config(command=lambda:self.Choose(sub,menu)) + menu.config(bg="#FFF") + self.subs.append([sub,menu]) + def Choose(self,subutton=tk.Button,menu=tk.Menu): + root_x = self.master.winfo_rootx() + root_y = self.master.winfo_rooty() + x = subutton.winfo_x() + root_x + y = subutton.winfo_y() + subutton.winfo_height() + root_y + menu.post(x, y) + + + +class Window(tk.Toplevel): + def __init__(self,title="MikOs - NewWindow",geometry="700x500"): + super().__init__() + index(self,1000,600) + self.TasksFrame=TasksFrame + self.withdraw() + self.geometry(geometry) + self.overrideredirect(True) + self.config(bg="#FFF") + self.focus() + self.wm_attributes("-topmost",True) + + self.Title=tk.Frame(self,bg="#FFF",highlightbackground="#fed79e") + self.Title.pack(fill=tk.X) + + self.TitleTextSpace1=tk.Label(self.Title,text=" ",fg="#FFF",bg="#FFF") + self.TitleTextSpace1.pack(side=tk.LEFT) + + self.TitleICOImage=ImageTk.PhotoImage(Image.open(tkinter_mik+"ICO.png")) + self.TitleICO=tk.Label(self.Title,image=self.TitleICOImage,fg="#FFF",bg="#FFF") + self.TitleICO.pack(side=tk.LEFT) + + self.TitleTextSpace2=tk.Label(self.Title,text=" ",fg="#FFF",bg="#FFF") + self.TitleTextSpace2.pack(side=tk.LEFT) + + self.TitleText=tk.Label(self.Title,text=title,bg="#FFF",fg="#000",font=("字魂59号-创粗黑",12)) + self.TitleText.pack(side=tk.LEFT) + + self.TitleTextSpace3=tk.Label(self.Title,text=" ",fg="#FFF",bg="#FFF") + self.TitleTextSpace3.pack(side=tk.LEFT) + + self.Widget=tk.Frame(self,bg="#FFF",highlightbackground="#fed79e") + self.Widget.pack(fill="both",expand=True) + + self.ExitImg = ImageTk.PhotoImage(Image.open(ui_mik+"close_100.png")) + self.Exit = tk.Button(self.Title, bg=self.Title.cget("bg"), bd=0, width=40, relief=tk.FLAT, activebackground="#C42B1C",image=self.ExitImg,command=self.destroy) + self.Exit.bind("", lambda _: self.Exit.config(background="#dd0009")) + self.Exit.bind("", lambda _: self.Exit.config(background=self.Title.cget("bg") if self.focus else "#797979")) + self.Exit.pack(fill=tk.Y, side=tk.RIGHT) + + def ComMax(): + self.wm_state("zoomed") + self.Max.config(image=self.MaxSmallImg,command=ComMaxSmall) + self.Title.bind("", lambda event:ComMaxSmall()) + def ComMaxSmall(): + self.wm_state("normal") + self.Max.config(image=self.MaxImg,command=ComMax) + self.Title.bind("", lambda event:ComMax()) + self.EmbedParentWindow() + + self.MaxImg = ImageTk.PhotoImage(Image.open(ui_mik+"fullwin_100.png")) + self.MaxSmallImg = ImageTk.PhotoImage(Image.open(ui_mik+"togglefull_100.png")) + self.Max = tk.Button(self.Title, bg=self.Title.cget("bg"), bd=0, width=40, relief=tk.FLAT, activebackground="#ebedf1",image=self.MaxImg,command=ComMax) + self.Max.bind("", lambda _: self.Max.config(background="#f2efef")) + self.Max.bind("", lambda _: self.Max.config(background=self.Title.cget("bg") if self.focus else "#797979")) + self.Max.pack(fill=tk.Y, side=tk.RIGHT) + self.Title.bind("", lambda event:ComMax()) + + self.MinImg = ImageTk.PhotoImage(Image.open(ui_mik+"minisize_100.png")) + self.Min = tk.Button(self.Title, bg=self.Title.cget("bg"), bd=0, width=40, relief=tk.FLAT, activebackground="#ebedf1",image=self.MinImg,command=self.stateicon) + self.Min.bind("", lambda _: self.Min.config(background="#f2efef")) + self.Min.bind("", lambda _: self.Min.config(background=self.Title.cget("bg") if self.focus else "#797979")) + self.Min.pack(fill=tk.Y, side=tk.RIGHT) + + if type(self.TasksFrame) == type(self.Title): + self.TaskICOImage=ImageTk.PhotoImage(Image.open(ui_mik+"text_file.png").resize([15,15])) + self.TaskICO=tk.Button(self.TasksFrame,image=self.TaskICOImage,bg=TasksFrame.cget("bg"),fg="#000",bd=0,command=self.statenor) + self.TaskICO.pack(side=tk.LEFT) + + self.MoveBind() + self.EmbedParentWindow() + self.deiconify() + def MoveBind(self): + x=0 + y=0 + def start_move(event): + nonlocal x, y + x = event.x + y = event.y + def stop_move(event): + nonlocal x, y + x = None + y = None + def on_motion(event): + nonlocal x, y + deltax = event.x - x + deltay = event.y - y + self.geometry(f"+{self.winfo_x() + deltax}+{self.winfo_y() + deltay}") + self.update() + self.Title.bind("", start_move) + self.Title.bind("", stop_move) + self.Title.bind("", on_motion) + self.TitleText.bind("", start_move) + self.TitleText.bind("", stop_move) + self.TitleText.bind("", on_motion) + def destroy(self): + if type(self.TasksFrame) == type(self.Title): + self.TaskICO.destroy() + super().destroy() + def stateicon(self): + self.wm_overrideredirect(False) + self.wm_state("icon") + def statenor(self): + if self.wm_state() != "normal": + self.EmbedParentWindow() + self.wm_overrideredirect(True) + self.wm_state("normal") + self.wm_attributes("-topmost",True) + else: + self.stateicon() + @asyncs + def EmbedParentWindow(self): + #while True: + # if master: + # u32.SetParent(u32.GetParent(self.winfo_id()),master.winfo_id()) + # time.sleep(1) + for i in range(10): + u32.SetParent(u32.GetParent(self.winfo_id()),master.winfo_id()) \ No newline at end of file diff --git a/sys/kernel/__pycache__/UI.cpython-312.pyc b/sys/kernel/__pycache__/UI.cpython-312.pyc new file mode 100644 index 0000000..51d17aa Binary files /dev/null and b/sys/kernel/__pycache__/UI.cpython-312.pyc differ diff --git a/sys/kernel/__pycache__/login.cpython-312.pyc b/sys/kernel/__pycache__/login.cpython-312.pyc new file mode 100644 index 0000000..3447dca Binary files /dev/null and b/sys/kernel/__pycache__/login.cpython-312.pyc differ diff --git a/sys/kernel/__pycache__/mount.cpython-312.pyc b/sys/kernel/__pycache__/mount.cpython-312.pyc new file mode 100644 index 0000000..4ac6849 Binary files /dev/null and b/sys/kernel/__pycache__/mount.cpython-312.pyc differ diff --git a/sys/kernel/__pycache__/tools.cpython-312.pyc b/sys/kernel/__pycache__/tools.cpython-312.pyc new file mode 100644 index 0000000..8eb132a Binary files /dev/null and b/sys/kernel/__pycache__/tools.cpython-312.pyc differ diff --git a/sys/kernel/login.py b/sys/kernel/login.py new file mode 100644 index 0000000..7e39777 --- /dev/null +++ b/sys/kernel/login.py @@ -0,0 +1,41 @@ +from tools import * + + + + +class login(tk.Frame): + def __init__(self,master,bg="./sys/wallpaper/森林1.png",width=1000,height=900,callback=lambda x,y:print(x,y),e=True): + super().__init__(master=master) + self.bg=bg + self.width=width + self.height=height + self.callback=callback + self.e=e + self.pack(fill="both",expand=True) + self.layer = tk.Canvas(self) + self.layer.pack(fill="both",expand=True) + + self.tranimg = Image.open('./sys/wallpaper/translucent.png') + self.tranimg = self.tranimg.resize((width-20,height-20)) + self.tranimg = ImageTk.PhotoImage(self.tranimg) + + self.bgimg = Image.open(bg) + self.bgimg = self.bgimg.resize((width,height)) + self.bgimg = ImageTk.PhotoImage(self.bgimg) + self.layer.create_image(0, 0, anchor='nw', image=self.bgimg) + self.layer.create_image(width//2,height//2, image=self.tranimg) + add_xy=0 + for i in ["black","dark gray","gray","gray","light gray","white"]: + text=self.layer.create_text(245+add_xy,105+add_xy, text="Welcome to MikOS",font=('arial',25),fill=i) + #(self.layer.bbox(text)[2] - self.layer.bbox(text)[0]) + self.layer.move(text, self.width//2-(self.layer.bbox(text)[2] - self.layer.bbox(text)[0])+27.5+add_xy, 0+add_xy) + add_xy+=0.5 + self.button = tk.Button(self, text="登录", bg="sky blue", command=self.login,width = 15,overrelief='sunken',bd=4,cursor="hand2",activebackground="sky blue") + self.button.update() + self.button.place(x=self.winfo_width()//2-self.button.winfo_width()//2, y=180, anchor="center") + def login(self): + username="root" + userpwd="ROOT" + if self.e: + self.destroy() + self.callback(username,userpwd) diff --git a/sys/kernel/main.pyw b/sys/kernel/main.pyw new file mode 100644 index 0000000..ad006d7 --- /dev/null +++ b/sys/kernel/main.pyw @@ -0,0 +1,124 @@ +#导入模块 +from tools import * +import login +import mount +import UI + + +#操作系统核心 +class System: + def __init__(self): + #临时 + self.username="root" + + + #将程序工作目录改到系统根目录 + os.chdir(os.path.dirname(os.path.realpath(sys.argv[0]))) + + self.ReadConfig() + + mount.endMount(self.DiskSite+":")#取消挂载虚拟磁盘,以防止过去的过期记录影响正常挂载 + if not mount.Mount("\\".join(os.getcwd().split("\\")[:-2]),self.DiskSite+":"):#挂载虚拟磁盘,如果返回值为False,表示错误,加not变为True,运行If语句内容 + print("EFI: Error, Mount DiskSite "+self.DiskSite+" not true")#输出虚拟磁盘挂载错误信息 + os._exit(0)#补上的,如果运行失败程序需要停止运行 + os.chdir(self.DiskSite+":")#将目录转移至虚拟磁盘 + + + self.root = tk.Tk() + self.root.title('MikOS') + # 通过config.json个性化窗口 + for i in self.config["res"]["set"]: + if i == "full": + self.root.state("zoomed") + elif i == "overrideredirect": + self.root.overrideredirect(True) + else: + print(f"Error: {i} no know") + UI.index(self.root,self.width,self.height) + self.root.update() + + self.StartSysApp("explorer","__init__.mia") + + self.root.protocol("WM_DELETE_WINDOW",self.CloseEvent) + self.root.mainloop() + def ReadConfig(self): + #获取配置文件 + self.config=json.loads(openr("../config/config.json")) #全部配置句柄 + self.width=self.config["res"]["width"] #窗口长 + self.height=self.config["res"]["height"] #窗口宽 + self.chicun=str(self.width)+"x"+str(self.height) #窗口长宽(可直接应用到self.root.geometry) + self.EFI=self.config["EFI"] #引导(EFI)配置句柄 + self.Kernel=self.config["Kernel"] #内核(Kernel)配置句柄 + self.DOS=self.config["DOS"] #命令行(DOS)配置句柄 + self.DiskSite=self.EFI["DiskSite"] #虚拟磁盘挂载地址 + self.BootSite=self.EFI["BootSite"] #操作系统程序文件所在 + self.SysAppSite=self.BootSite+self.Kernel["SysAppSite"] #系统级程序文件所在 + self.NorAppSite=self.Kernel["NorAppSite"] #全局用户级程序文件所在 + self.ui_mik=self.BootSite+self.Kernel["ui"] #MikOs窗口图标文件所在 + self.images_mik=self.BootSite+self.Kernel["images"] #MikOs桌面图标文件所在 + self.tkinter_mik=self.BootSite+self.Kernel["tkinter"] #MikOs-Tkinter支持文件所在 + UI.ui_mik=self.ui_mik #将MikOs窗口图标文件所在注册到UI + UI.tkinter_mik=self.tkinter_mik #将MikOs-Tkinter支持文件所在注册到UI + self.UsersSite=self.Kernel["UsersSite"] #用户组文件所在 + self.bg=self.BootSite+self.config["bg"]["sys"] #桌面壁纸 + self.suffixs=self.config["suffixs"] #文件图标后缀关联 + self.filesuffixs=self.config["filesuffixs"] #文件名称图标关联(无后缀但需显示图标文件)(如:MakeFile) + self.color=self.config["color"] #主题色配置句柄 + self.SysFileSuffixMapping=self.config["SysFileSuffixMapping"] #文件功能后缀关联 + def CloseEvent(self):#关闭事件 + if tm.askokcancel('MikOS:提示','确认要关闭MikOS吗?'): + os._exit(0) + def ERROR(self,WrongDevice,IOFlowErrorMessage,DebuggerApp,MemoryAddresss,EndMemoryAddress): + ERROR=tk.Frame(self.root,bg="#000") + ERROR.place(x=0,y=0) + def Text(text): + tk.Label(ERROR,text=text,fg="#FFF",bg="#000",font=("Moder DOS 437",15)).pack(anchor="sw") + def FText(): + tk.Label(ERROR,text="",bg="#000",font=("Moder DOS 437",15)).pack(anchor="sw") + Text("There are some problems with your MikOS,") + Text("This may come from MikOs itself or some of its settings,") + Text("Python version problems, Or because of your own external operating system,") + Text("In short, MikOs has an error, We are not sure if the program can still run normally,") + Text("So we interrupted the program, But there may be some subprograms that have not") + Text("stopped completely, We can only do it here, the following are some error prompts") + FText() + Text(f'Error({WrongDevice}): "{IOFlowErrorMessage}"') + Text(f"Debugger Called: <{DebuggerApp}>") + Text("Specific Error Points:") + for i in MemoryAddresss:Text(f"{i[0]} : {i[1]} ()") + Text(f"Error Terminated At {{EndMemoryAddress}} Memory Pointer") + FText() + Text("Operating System Has Been Terminated") + FText() + Text("Kernel version:") + Text(f"MikOS Kernel V{self.Kernel['VerSion']} / EFI Boot System V{self.EFI['VerSion']}") + FText() + FText() + FText() + def StartSysApp(self,appname,file,*args,**kw): + self.global_dict=globals() + self.global_dict["args"]=args + self.global_dict["kw"]=kw + self.global_dict["app_info"]={"path":self.SysAppSite+"/"+appname+"/"} + self.global_dict["OperatingSystemHandle"]=self + code=openr(self.global_dict["app_info"]["path"]+file) + exec(code,self.global_dict) + def StartApp(self,appname,file,*args,**kw): + self.global_dict=globals() + self.global_dict["args"]=args + self.global_dict["kw"]=kw + self.global_dict["app_info"]={"path":self.NorAppSite+"/"+appname+"/"} + self.global_dict["OperatingSystemHandle"]=self + code=openr(self.global_dict["app_info"]["path"]+file) + exec(code,self.global_dict) + def StartFile(self,File=str,*args): + if os.path.isfile(File): + if (suffix := File.split(".")[-1].lower()) in self.SysFileSuffixMapping: + self.StartSysApp(self.SysFileSuffixMapping[suffix],"__init__.mia",f=File,*args) + +#免登录 +#login.login(root,bg=BootSite+config["bg"]["login"],width=root.winfo_width(),height=root.winfo_height(),callback=verifylogin) +System() +s=tk.Tk()#堵塞进程 +s.withdraw() +s.mainloop() diff --git a/sys/kernel/mount.py b/sys/kernel/mount.py new file mode 100644 index 0000000..959c6cc --- /dev/null +++ b/sys/kernel/mount.py @@ -0,0 +1,16 @@ +import os + +def Mount(dir,Note): + get=os.popen(f"subst {Note} {dir}").read() + if get==f"无效参数 - {Note}\n": + return "error:Note" + elif get==f"找不到路径 - {dir}\n": + return "error:dir" + else: + return True +def endMount(Note): + get=os.popen(f"subst {Note} /d").read() + if get==f"无效参数 - {Note}\n": + return "error:Note" + else: + return True \ No newline at end of file diff --git a/sys/kernel/tools.py b/sys/kernel/tools.py new file mode 100644 index 0000000..a0dc242 --- /dev/null +++ b/sys/kernel/tools.py @@ -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 diff --git a/sys/lib/MikDOS/DOS/Command.txt b/sys/lib/MikDOS/DOS/Command.txt new file mode 100644 index 0000000..b6bd1e7 --- /dev/null +++ b/sys/lib/MikDOS/DOS/Command.txt @@ -0,0 +1,8 @@ +shutdown 关闭终端 +help 帮助 +startMik 启动MikOS +setting 设置 +repair 修复运行环境 +time 时间 +open 打开 +restart 重启 \ No newline at end of file diff --git a/sys/lib/MikDOS/DOS/file/Command.txt b/sys/lib/MikDOS/DOS/file/Command.txt new file mode 100644 index 0000000..a024572 --- /dev/null +++ b/sys/lib/MikDOS/DOS/file/Command.txt @@ -0,0 +1,10 @@ +shutdown 关闭终端 +help 帮助 +startMik 启动MikOS +setting 设置 +repair 修复运行环境 +time 时间 +open 打开 +restart 重启 +about 关于 +setting 设置 \ No newline at end of file diff --git a/sys/lib/MikDOS/DOS/file/config.json b/sys/lib/MikDOS/DOS/file/config.json new file mode 100644 index 0000000..0b6b802 --- /dev/null +++ b/sys/lib/MikDOS/DOS/file/config.json @@ -0,0 +1 @@ +{"Debug":"True"} \ No newline at end of file diff --git a/sys/lib/MikDOS/DOS/file/config_eg.txt b/sys/lib/MikDOS/DOS/file/config_eg.txt new file mode 100644 index 0000000..37e31f1 --- /dev/null +++ b/sys/lib/MikDOS/DOS/file/config_eg.txt @@ -0,0 +1,2 @@ +选项名称 值1(最小值)/值2(最大值) +Debug True/False \ No newline at end of file diff --git a/sys/lib/MikDOS/DOS/lib/DOSLib.py b/sys/lib/MikDOS/DOS/lib/DOSLib.py new file mode 100644 index 0000000..edd541d --- /dev/null +++ b/sys/lib/MikDOS/DOS/lib/DOSLib.py @@ -0,0 +1,31 @@ +""" +本程序为MikDOS的运行库 +变量path为DOS工作目录,p_path为DOS上级目录 +""" +import os, time + + + +#帮助指令 +def helpdos(path): + with open(path + '\\DOS\\file\\Command.txt', mode='r', encoding='utf-8') as cmd: + file = cmd.read() + print(file) +#启动MikOS +def startmik(p_path): + os.startfile(p_path + '\\logon.pyw') +#打开设置 +def setting(p_path): + os.startfile(p_path + '\\setting\\setting.pyw') +#打印时间 +def p_time(): + print(time.ctime()) +#延时打印(故意滴doge) +def show_later(): + time.sleep(1) +def dos_config(path): + print('请阅读下面的教程') + print('---------------------------------') + with open(path + '\\DOS\\file\\config_eg.txt', mode='r', encoding='utf-8') as config_eg: + file_con_eg = config_eg.read() + print(file_con_eg) diff --git a/sys/lib/MikDOS/DOS/lib/__pycache__/DOSLib.cpython-311.pyc b/sys/lib/MikDOS/DOS/lib/__pycache__/DOSLib.cpython-311.pyc new file mode 100644 index 0000000..fb384c5 Binary files /dev/null and b/sys/lib/MikDOS/DOS/lib/__pycache__/DOSLib.cpython-311.pyc differ diff --git a/sys/lib/MikDOS/DOS/lib/__pycache__/DOSLib.cpython-312.pyc b/sys/lib/MikDOS/DOS/lib/__pycache__/DOSLib.cpython-312.pyc new file mode 100644 index 0000000..1efaffb Binary files /dev/null and b/sys/lib/MikDOS/DOS/lib/__pycache__/DOSLib.cpython-312.pyc differ diff --git a/sys/lib/MikDOS/MikDOS_Main.py b/sys/lib/MikDOS/MikDOS_Main.py new file mode 100644 index 0000000..55a9fa6 --- /dev/null +++ b/sys/lib/MikDOS/MikDOS_Main.py @@ -0,0 +1,45 @@ +import os, sys +import DOS.lib.DOSLib as DOSLib +from DOS.lib.DOSLib import show_later + + +# 获取工作目录、上级目录 +path = os.path.dirname(os.path.realpath(sys.argv[0])) + +parent_path = os.path.abspath('.') +#打印系统信息 + +print('MikDOS V1') +print('© Ark Krin Studio MikOS Dev Team 保留所有权利') +while True: + #获取用户输入 + inp = input('MikDOS>>') + #统一输入格式 + comd = inp.lower() + #判断 + #帮助 + if comd == 'help': + show_later() + DOSLib.helpdos(path) + #关机 + elif comd == 'shutdown': + print('正在关闭') + show_later() + sys.exit() + #启动MikOS + elif comd == 'startmik': + show_later() + DOSLib.startmik(parent_path) + sys.exit() + #打开设置 + elif comd == 'setting': + show_later() + DOSLib.setting(parent_path) + #打印时间 + elif comd == 'time': + show_later() + DOSLib.p_time() + #未输入指令 + else: + print(inp, '不是一个可以执行的命令') + continue diff --git a/sys/lib/RUN-MIKSC/__init__.mia b/sys/lib/RUN-MIKSC/__init__.mia new file mode 100644 index 0000000..3324f3c --- /dev/null +++ b/sys/lib/RUN-MIKSC/__init__.mia @@ -0,0 +1,28 @@ +import tkinter as tk +try: + #绝对会报错,只是用于高亮提示,可以删除,真正的导入部分在Kernel + import sys.kernel.UI as UI + from sys.kernel.tools import * +except: + pass + + +class Run_Miksc: + def __init__(self): + self.File=kw["f"] + self.json=json.loads(openr(self.File)) + if "File" in self.json: + OperatingSystemHandle.StartFile(self.json["File"]) + elif "SApp" in self.json and "Start" in self.json: + f="" + if "F" in self.json: + f=self.json["F"] + OperatingSystemHandle.StartSysApp(self.json["SApp"],self.json["Start"],f=f) + elif "App" in self.json and "Start" in self.json: + f="" + if "F" in self.json: + f=self.json["F"] + OperatingSystemHandle.StartApp(self.json["SApp"],self.json["Start"],f=f) + else: + pass +Run_Miksc() \ No newline at end of file diff --git a/sys/lib/RUN-TXT/ICO.png b/sys/lib/RUN-TXT/ICO.png new file mode 100644 index 0000000..14042ab Binary files /dev/null and b/sys/lib/RUN-TXT/ICO.png differ diff --git a/sys/lib/RUN-TXT/__init__.mia b/sys/lib/RUN-TXT/__init__.mia new file mode 100644 index 0000000..25081c8 --- /dev/null +++ b/sys/lib/RUN-TXT/__init__.mia @@ -0,0 +1,180 @@ +import tkinter as tk +try: + #绝对会报错,只是用于高亮提示,可以删除,真正的导入部分在Kernel + import sys.kernel.UI as UI + from sys.kernel.tools import * +except: + pass + + + + + +class Notepad_base(UI.Window): + def __init__(self): + super().__init__() + self.TitleText.config(text="记事本") + self.geometry(f'750x550+{self.winfo_screenwidth() // 4}+{self.winfo_screenheight() // 8}') + + self.Menu=UI.Menu(self) + + """ 文件菜单 """ + self.fileMenu = tk.Menu(self, tearoff=0) + self.Menu.add_sub(label='文件(F)', menu=self.fileMenu) + self.fileMenu.add_command(label=f'新建(N){" " * 28}Ctrl+N') + self.fileMenu.add_command(label=f'新窗口(W){" " * 16}Ctrl+Shift+N') + self.fileMenu.add_command(label=f'打开(O)...{" " * 26}Ctrl+O') + self.fileMenu.add_command(label=f'保存(S){" " * 29}Ctrl+S') + self.fileMenu.add_command(label=f'另存为(A)...{" " * 15}Ctrl+Shift+S') + self.fileMenu.add_command(label=f'页面设置(U)...') + self.fileMenu.add_command(label=f'打印(P)...{" " * 27}Ctrl+P') + self.fileMenu.add_command(label=f'退出(X)') + + """ 编辑菜单 """ + # 创建二级菜单栏(此时为空) + self.editMenu = tk.Menu(self, tearoff=0) + # 向一级菜单栏添加 编辑 项,并与二级菜单(editMenu)建立级联关系(从属/上下级) + self.Menu.add_sub(label='编辑(E)', menu=self.editMenu) + # 编辑的二级菜单栏添加 ... 项 + self.editMenu.add_command(label=f'撤销(U){" " * 26}Ctrl+Z') + self.editMenu.add_command(label=f'剪切(T){" " * 26}Ctrl+X') + self.editMenu.add_command(label=f'复制(C){" " * 26}Ctrl+C') + self.editMenu.add_command(label=f'粘贴(V){" " * 26}Ctrl+V') + self.editMenu.add_command(label=f'删除(L){" " * 27}Delete') + self.editMenu.add_command(label=f'使用 Bing 搜索...{" " * 14}Ctrl+E') + self.editMenu.add_command(label=f'查找(F)...{" " * 25}Ctrl+F') + self.editMenu.add_command(label=f'查找上一个(N){" " * 23}F3') + self.editMenu.add_command(label=f'查找下一个(V){" " * 15}Shift+F3') + self.editMenu.add_command(label=f'替换(R)...{" " * 23}Ctrl+H') + self.editMenu.add_command(label=f'转到(G)...{" " * 23}Ctrl+G') + self.editMenu.add_command(label=f'全选(A){" " * 26}Ctrl+A') + self.editMenu.add_command(label=f'时间/日期(D){" " * 25}F5') + + + """ 格式菜单 """ + # 全局变量 + self.word_wrap = tk.BooleanVar(value=True) # 是否选择勾上 + # 创建二级菜单栏(此时为空) + self.formatMenu = tk.Menu(self, tearoff=0) + # 向一级菜单栏添加 格式 项,并与二级菜单(formatMenu)建立级联关系(从属/上下级) + self.Menu.add_sub(label='格式(O)', menu=self.formatMenu) + # 格式的二级菜单栏添加 ... 项 + self.formatMenu.add_checkbutton(label='自动换行(W)', variable=self.word_wrap, onvalue=1, offvalue=0) + self.formatMenu.add_command(label='字体(F)...') + + """ 查看菜单 """ + # 全局变量 + self.state = tk.BooleanVar(value=True) + # 创建二级菜单栏(此时为空) + self.viewMenu = tk.Menu(self, tearoff=0) + # 向一级菜单栏添加 查看 项,并与二级菜单(checkMenu)建立级联关系(从属/上下级) + self.Menu.add_sub(label='查看(V)', menu=self.viewMenu) + # 创建三级菜单栏(此时为空) + self.threeViewMenu = tk.Menu(self.viewMenu, tearoff=0) + # 查看的二级菜单栏添加 ... 项 + self.viewMenu.add_cascade(label='缩放(Z)', menu=self.threeViewMenu) + self.viewMenu.add_checkbutton(label='状态栏(S)', variable=self.state, onvalue=1, offvalue=0) + # 缩放的三级菜单栏添加 ... 项 + self.threeViewMenu.add_command(label=f'放大(I){" " * 14}Ctrl + 加号') + self.threeViewMenu.add_command(label=f'缩小(O){" " * 13}Ctrl + 减号') + self.threeViewMenu.add_command(label=f'恢复默认缩放{" " * 11}Ctrl+0') + + """ 帮助菜单 """ + # 创建二级菜单栏(此时为空) + self.helpMenu = tk.Menu(self, tearoff=0) + # 向一级菜单栏添加 帮助 项,并与二级菜单(helpMenu)建立级联关系(从属/上下级) + self.Menu.add_sub(label='帮助(H)', menu=self.helpMenu) + # 帮助的二级菜单栏添加 ... 项 + self.helpMenu.add_command(label='查看帮助(H)') + self.helpMenu.add_command(label='发送反馈(F)') + self.helpMenu.add_command(label='关于文本编辑器(A)') + # 菜单之间插入分隔线 + self.helpMenu.insert_separator(2) + + """ 右键菜单 """ + # 创建二级菜单栏(此时为空) + self.rightKeyMenu = tk.Menu(self, tearoff=0) + # 创建三级菜单栏(此时为空) + self.threeRightMenu = tk.Menu(self.rightKeyMenu, tearoff=0) + # 右键菜单的二级菜单栏添加 ... 项 + self.rightKeyMenu.add_command(label='撤销(U)') + self.rightKeyMenu.add_command(label='剪切(T)') + self.rightKeyMenu.add_command(label='复制(C)') + self.rightKeyMenu.add_command(label='粘贴(P)') + self.rightKeyMenu.add_command(label='删除(D)') + self.rightKeyMenu.add_command(label='全选(A)') + self.rightKeyMenu.add_checkbutton(label='从右到左的阅读顺序(R)') + self.rightKeyMenu.add_checkbutton(label='显示 Unicode 控制字符(S)') + self.rightKeyMenu.add_cascade(label='插入 Unicode 控制字符(I)', menu=self.threeRightMenu) + self.rightKeyMenu.add_command(label='关闭输入法(L)') + self.rightKeyMenu.add_command(label='汉字重选(R)') + self.rightKeyMenu.add_command(label='使用 Bing 搜索(B)...') + # 插入 Unicode 控制字符(I)的三级菜单栏添加 ... 项 + self.threeRightMenu.add_command(label='特殊字符1') + self.threeRightMenu.add('command', label='特殊字符2') + self.threeRightMenu.insert(3, 'command', label='特殊字符3') + # ... + # 菜单之间插入分隔线 + self.rightKeyMenu.insert_separator(1) + self.rightKeyMenu.insert_separator(6) + self.rightKeyMenu.insert_separator(8) + self.rightKeyMenu.insert_separator(12) + self.rightKeyMenu.insert_separator(15) + + # 捆绑鼠标右键事件 + self.bind('', lambda event: self.rightKeyEvent(event, self.rightKeyMenu)) + + """ 底行内容显示 """ + # 底部内容框架 + self.bottomFrame = tk.Frame(self.Widget) + self.bottomFrame.pack(side=tk.BOTTOM, fill='both') + # 状态栏框架 + self.stateFrame = tk.Frame(self.bottomFrame) + self.stateFrame.pack(side=tk.BOTTOM, fill='both') + # 字符编码 + self.charCodeLabel = tk.Label(self.stateFrame,text=' UTF-8',width=16,anchor='w') + self.charCodeLabel.pack(side=tk.RIGHT) + # 换行方式(回车换行) + self.CRLFlabel = tk.Label(self.stateFrame,text=' Windows (CRLF)',width=17,anchor='w') + self.CRLFlabel.pack(side=tk.RIGHT) + # 字体大小 + self.fontSizeLabel = tk.Label(self.stateFrame, text='100%', width=6) + self.fontSizeLabel.pack(side=tk.RIGHT) + # 光标位置 + self.locationLabel = tk.Label(self.stateFrame,text=' 第 1 行,第 1 列',width=19,anchor='w') + self.locationLabel.pack(side=tk.RIGHT) + + # 右侧滚动条 + self.rightScrollbar = tk.Scrollbar(self.Widget, orient='vertical') + self.rightScrollbar.pack(side=tk.RIGHT, fill='both') + # 底侧滚动条 + self.bottomScrollbar = tk.Scrollbar(self.bottomFrame, orient="horizontal") + self.bottomScrollbar.pack(side=tk.BOTTOM, fill='both') + + # 文本编辑区域 + self.text = tk.Text(self.Widget) + self.text.pack(expand=True, fill='both') + # 将焦点设置到Text控件上 + self.text.focus() + + # 修改窗口标题的图片 + self.notepad_photo = tk.PhotoImage(file=app_info["path"]+"ICO.png") + self.TitleICO.config(image=self.notepad_photo) + self.TaskICO.config(image=self.notepad_photo) + self.TaskICO.update() + + self.open() + # Text文本鼠标右键菜单事件 + def rightKeyEvent(self, event, object): + object.post(event.x_root, event.y_root) + + def open(self): + if os.path.isfile(kw["f"]): + self.text.insert("insert",openr(kw["f"],2)) +# 代码测试 +if __name__ == '__main__': + ui = Notepad_base() # 实例化记事本UI + ui.mainloop() # 循环窗口运行 +else: + print(f'导入【{__name__}】') + \ No newline at end of file diff --git a/sys/lib/calc/ICO.png b/sys/lib/calc/ICO.png new file mode 100644 index 0000000..207daab Binary files /dev/null and b/sys/lib/calc/ICO.png differ diff --git a/sys/lib/calc/__init__.mia b/sys/lib/calc/__init__.mia new file mode 100644 index 0000000..3500df0 --- /dev/null +++ b/sys/lib/calc/__init__.mia @@ -0,0 +1,123 @@ +import tkinter as tk +try: + #绝对会报错,只是用于高亮提示,可以删除,真正的导入部分在Kernel + import sys.kernel.UI as UI + from sys.kernel.tools import * +except: + pass + + + + +# 定义主窗口 +root = UI.Window() +root.TitleText.config(text="计算器") +root.geometry("250x360") +root.resizable(False, False) + +# 修改窗口标题的图片 +notepad_photo = ImageTk.PhotoImage(Image.open(app_info["path"]+"ICO.png").resize([12,16])) +root.TitleICO.config(image=notepad_photo) +root.TaskICO.config(image=notepad_photo) +root.TaskICO.update() + +def Button_main(text,bg='#D4F1F4',width=3): + return tk.Button(root, text=text, font=("Arial", 14), width=width, height=1, bd=4, bg=bg,command=lambda :yunsuan(text),overrelief='sunken',activebackground="light yellow") + + +c = tk.Canvas(root, width=250, height=340) +c.yunsuan = '' +c.color = 'black' + + +def update(): + c.create_rectangle(0, 0, 250, 340, fill='light gray', outline=None) + c.create_rectangle(20, 20, 230, 70, width=2, fill='white',outline='black') + if c.yunsuan == 'ERROR': + c.color = 'tomato' + else: + c.color = 'black' + c.create_text(225,70, text=c.yunsuan,font=('arial',30),fill = c.color,anchor='se') + c.create_rectangle(0,19,18,70,fill='light gray',outline='light gray') + + + + + +def yunsuan(num): + num = str(num) + if c.yunsuan == 'ERROR' and num != 'CE': + print('Debug:ERROR状态下无法运算') + return + + + if num in '0123456789+-*/.': + if c.yunsuan == 0 or c.yunsuan =='0': + c.yunsuan = num + else: + c.yunsuan += num + elif num == '←': + c.yunsuan = ''.join(list(c.yunsuan)[0:-1]) + elif num == 'CE': + c.yunsuan = '0' + elif num == '=': + try: + c.yunsuan = str(eval(c.yunsuan)) + except: + c.yunsuan = 'ERROR' + finally: + print('Debug:try语句资源释放成功') + print('Deubg:显示框内容',c.yunsuan) + update() + +# 定义数字按钮 +btn_1 = Button_main('1') +btn_2 = Button_main('2') +btn_3 = Button_main('3') +btn_4 = Button_main('4') +btn_5 = Button_main('5') +btn_6 = Button_main('6') +btn_7 = Button_main('7') +btn_8 = Button_main('8') +btn_9 = Button_main('9') +btn_0 = Button_main('0',width=9) +btn_point = Button_main('.') + + +# 定义操作符按钮 +btn_add = Button_main('+') +btn_sub = Button_main('-') +btn_mul = Button_main('*') +btn_div = Button_main('/') +btn_eq = Button_main('=',width=8) +btn_ce = Button_main(text='CE',bg='#F7AF9D') +btn_back = Button_main(text='←') + + +btn_1.place(x=10, y=100) +btn_2.place(x=70, y=100) +btn_3.place(x=130, y=100) +btn_4.place(x=10, y=150) +btn_5.place(x=70, y=150) +btn_6.place(x=130, y=150) +btn_7.place(x=10, y=200) +btn_8.place(x=70, y=200) +btn_9.place(x=130, y=200) +btn_0.place(x=10, y=250) +btn_point.place(x=70, y=300) + + + +btn_add.place(x=190, y=100) +btn_sub.place(x=190, y=150) +btn_mul.place(x=190, y=200) +btn_div.place(x=190, y=250) +btn_eq.place(x=130, y=300) +btn_ce.place(x=10, y=300) +btn_back.place(x=130,y=250) + +c.pack() +# 运行主循环 + +update() +root.mainloop() \ No newline at end of file diff --git a/sys/lib/explorer/__init__.mia b/sys/lib/explorer/__init__.mia new file mode 100644 index 0000000..9189617 --- /dev/null +++ b/sys/lib/explorer/__init__.mia @@ -0,0 +1,152 @@ +import tkinter as tk +try: + #绝对会报错,只是用于高亮提示,可以删除,真正的导入部分在Kernel + import sys.kernel.UI as UI + from sys.kernel.tools import * +except: + pass + + + +def Omit(s): + return s[:15] + '...' if len(s) > 15 else s + +class DesktopFile: + def __init__(self,c,username,i,desktop_imgs,nx,ny,dx,dy,global_dict,f,startapp): + self.root=c.master + self.username=username + self.new_x=nx + self.new_y=ny + self.desktop_x=dx + self.desktop_y=dy + self.global_dict=global_dict + self.f=f + self.c=c + self.i=i + self.StartSysApp=startapp + self.suffix=i.split(".")[-1].lower() + if os.path.isfile(OperatingSystemHandle.UsersSite+self.username+"/Desktop/"+self.i): + if self.suffix != i: + if self.suffix in OperatingSystemHandle.suffixs: + self.desktop_img = Image.open(OperatingSystemHandle.images_mik+OperatingSystemHandle.suffixs[self.suffix]+".ico") + else: + self.desktop_img = Image.open(OperatingSystemHandle.images_mik+OperatingSystemHandle.suffixs["[None]*"]+".ico") + else: + if i in OperatingSystemHandle.filesuffixs: + self.desktop_img = Image.open(OperatingSystemHandle.images_mik+OperatingSystemHandle.filesuffixs[self.suffix]+".ico") + else: + self.desktop_img = Image.open(OperatingSystemHandle.images_mik+OperatingSystemHandle.suffixs["[None]*"]+".ico") + if os.path.isdir(OperatingSystemHandle.UsersSite+self.username+"/Desktop/"+self.i): + self.desktop_img = Image.open(OperatingSystemHandle.images_mik+OperatingSystemHandle.suffixs["[Dir]*"]+".ico") + self.desktop_img = self.desktop_img.resize((90,90)) + if os.path.isfile(OperatingSystemHandle.UsersSite+self.username+"/Desktop/"+self.i): + if self.suffix == "miksc": + try: + self.json=json.loads(openr(OperatingSystemHandle.UsersSite+self.username+"/Desktop/"+self.i)) + if "display-ico" in self.json: + if "App" in self.json and "Start" in self.json: + self.desktop_img = self.resize_and_return(Image.open(OperatingSystemHandle.NorAppSite+"/"+self.json["App"]+"/"+self.json["display-ico"])) + if "SApp" in self.json and "Start" in self.json: + self.desktop_img = self.resize_and_return(Image.open(OperatingSystemHandle.SysAppSite+"/"+self.json["SApp"]+"/"+self.json["display-ico"])) + except: + pass + self.desktop_img = ImageTk.PhotoImage(self.desktop_img) + desktop_imgs.append(self.desktop_img) + self.desktop_btn = self.c.create_image((self.new_x-1)*100+50, 50+self.new_y*100, image=self.desktop_img) + self.c.create_text((self.new_x-1)*100+50, (self.new_y+1)*100, text=Omit(i),font=('arial',10),fill="white") + #self.layer.move(text, self.width//2-(self.layer.bbox(text)[2] - self.layer.bbox(text)[0])+27.5+add_xy, 0+add_xy) + self.c.tag_bind(self.desktop_btn,'',self.Start) + self.c.tag_bind(self.desktop_btn, '', self.mouse_hand) + self.c.tag_bind(self.desktop_btn, '', self.mouse_arrow) + if self.new_y < self.desktop_y-1:self.new_y+=1 + else: + self.new_y=0 + self.new_x+=1 + if self.new_x >= self.desktop_x-1: + self.f.ERROR("Desktop Draw","File Across Desktop Max","Main",[["0x00","0x00"]],"0x00") + def mouse_hand(self,*args): + self.root.config(cursor = 'hand2') + def mouse_arrow(self,*args): + self.root.config(cursor = 'arrow') + def Start(self,event): + OperatingSystemHandle.StartFile(OperatingSystemHandle.UsersSite+self.username+"/Desktop/"+self.i) + def resize_and_return(self,image): + width, height = image.size + ratio = 50 / width + new_height = int(height * ratio) + resized_image = image.resize((50, new_height)) + return resized_image + + + +class LogoPopUp(tk.Toplevel): + def __init__(self): + super().__init__() + self.overrideredirect(True) + self.withdraw() + self.config(bg=OperatingSystemHandle.color["tasks"]["win"]) + self.width=int(OperatingSystemHandle.root.winfo_width()*0.35) + self.height=int(OperatingSystemHandle.root.winfo_height()*0.9) + self.Tasks=tk.Frame + self.geometry(f"{self.width}x{self.height}") + self.Is_Focus() + self.EmbedParentWindow() + def Draw(self,event=tk.Event): + if self.state() == "withdrawn": + self.deiconify() + self.geometry(f"+{event.widget.winfo_x()}+{OperatingSystemHandle.root.winfo_height()-self.Tasks.winfo_height()-self.height}") + self.focus() + @asyncs + def Is_Focus(self): + while True: + if self.focus_get() != self: + self.withdraw() + time.sleep(0.1) + @asyncs + def EmbedParentWindow(self): + #while True: + # if master: + # u32.SetParent(u32.GetParent(self.winfo_id()),master.winfo_id()) + # time.sleep(1) + for i in range(10): + u32.SetParent(u32.GetParent(self.winfo_id()),OperatingSystemHandle.root.winfo_id()) +class Explorer: + def __init__(self): + desktop_imgs=[] + self.c = tk.Canvas(OperatingSystemHandle.root,width=OperatingSystemHandle.root.winfo_width(),height=OperatingSystemHandle.root.winfo_height()-30,highlightthickness=0) + self.c.pack() + + UI.master=self.c + self.Tasks = tk.Frame(OperatingSystemHandle.root,height=30,bg=OperatingSystemHandle.color["tasks"]["bg"]) + self.Tasks.pack(side="bottom",fill="x") + UI.TasksFrame=self.Tasks + self.TasksIconImg=ImageTk.PhotoImage(Image.open(OperatingSystemHandle.images_mik+'/[MICO].png').resize([30,30])) + self.TasksIconHovImg=ImageTk.PhotoImage(Image.open(OperatingSystemHandle.images_mik+'/[EICO].png').resize([30,30])) + + self.LPU=LogoPopUp() + self.LPU.Tasks=self.Tasks + + self.TasksIconButton=tk.Button(self.Tasks,image=self.TasksIconImg,bg=OperatingSystemHandle.color["tasks"]["bg"],bd=0) + self.TasksIconButton.pack(side="left") + self.TasksIconButton.bind("", lambda _: self.TasksIconButton.config(image=self.TasksIconHovImg)) + self.TasksIconButton.bind("", lambda _: self.TasksIconButton.config(image=self.TasksIconImg)) + self.TasksIconButton.bind("",self.LPU.Draw) + + self.bgimg = Image.open(OperatingSystemHandle.bg) + self.bgimg = self.bgimg.resize((OperatingSystemHandle.root.winfo_width(), OperatingSystemHandle.root.winfo_height())) + self.bgimg = ImageTk.PhotoImage(self.bgimg) + + self.background = self.c.create_image(0, 0, anchor='nw', image=self.bgimg) + + self.desktop_x=OperatingSystemHandle.root.winfo_width()//90-2 + self.desktop_y=OperatingSystemHandle.root.winfo_height()//90-2 + + self.new_x=1 + self.new_y=0 + DisplayContent=tk.Canvas(OperatingSystemHandle.root,width=OperatingSystemHandle.root.winfo_width(),height=OperatingSystemHandle.root.winfo_height()-30,highlightthickness=0) + DisplayContent.pack(fill="both",expand=True) + for i in os.listdir(OperatingSystemHandle.UsersSite+OperatingSystemHandle.username+"/Desktop"): + i=DesktopFile(self.c,OperatingSystemHandle.username,i,desktop_imgs,self.new_x,self.new_y,self.desktop_x,self.desktop_y,globals(),self,OperatingSystemHandle.StartSysApp) + self.new_x,self.new_y,self.desktop_x,self.desktop_y=i.new_x,i.new_y,i.desktop_x,i.desktop_y + +Task_Explorer=Explorer() \ No newline at end of file diff --git a/sys/lib/music/ICO.png b/sys/lib/music/ICO.png new file mode 100644 index 0000000..5360f0f Binary files /dev/null and b/sys/lib/music/ICO.png differ diff --git a/sys/lib/music/MMC Download.pyw b/sys/lib/music/MMC Download.pyw new file mode 100644 index 0000000..46a142a --- /dev/null +++ b/sys/lib/music/MMC Download.pyw @@ -0,0 +1,69 @@ +from tkinter.messagebox import showinfo +from tkinter import Tk, Listbox, Label +from tkinter.simpledialog import askstring +import requests, json +from shutil import move, Error + + +# 伪装自己的信息 +headers = { + 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:106.0) Gecko/20100101 Firefox/106.0', + 'Accept': 'application/json, text/plain, */*', + 'Referer': 'https://kuwo.cn', + 'Secret': '10373b58aee58943f95eaf17d38bc9cf50fbbef8e4bf4ec6401a3ae3ef8154560507f032', + 'Cookie': 'Hm_lvt_cdb524f42f0ce19b169a8071123a4797=1687520303,1689840209; _ga=GA1.2.2021483490.1666455184; _ga_ETPBRPM9ML=GS1.2.1689840210.4.1.1689840304.60.0.0; Hm_Iuvt_cdb524f42f0ce19b169b8072123a4727=NkA4TadJGeBWwmP2mNGpYRrM8f62K8Cm; Hm_lpvt_cdb524f42f0ce19b169a8071123a4797=1689840223; _gid=GA1.2.1606176174.1689840209; _gat=1', + +} + +name = askstring('获取名称', "请输入你要搜索的“音乐名称”或“歌手") +# 音乐列表的地址 +list_url = f'https://songsearch.kugou.com/song_search_v2?keyword={name}&platform=WebFilter' + +list_resp = requests.get(list_url, headers=headers) +m_list = json.loads(list_resp.text[:])['data']['lists'] +name_list = [] +for i, s in enumerate(m_list): + name_list.append(f'{i + 1}------{s.get("FileName")}') +Download_window = Tk() +Download_window.geometry('300x300') +Download_window.title('搜索结果') +MusicN_List = Listbox(Download_window, width = 40, height = 37) +MusicN_List.pack() +for j in name_list: + MusicN_List.insert("end", j) +num = askstring('输入序列号', '请输入要下载的音乐号(输入格式为 1 2):').split() +for s in num: + # 此处的 header1 可有可无 但是不带 cookie 的 headers 请求时 可能会出现问题 + headers1 = { + 'UserAgent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:106.0) Gecko/20100101 Firefox/106.0', + 'Cookie': 'kg_mid=536e52feec7d1c95137aa1d341f8144e; kg_dfid=3exupN3BZJMQ3ftR4x0KOXDk; kg_dfid_collect=d41d8cd98f00b204e9800998ecf8427e; kg_mid_temp=536e52feec7d1c95137aa1d341f8144e'} + + # 构造你请求资源的URL + + info_url = f'https://wwwapi.kugou.com/yy/index.php?r=play/getdata&hash={m_list[int(s) - 1].get("FileHash")}&album_audio_id={m_list[int(s) - 1].get("ID")}' + + # 进行访问 + info_resp = requests.get(info_url, headers=headers1) + + # 拿取你所请求资源的数据(这里是得到播放音乐的地址) + get_music_url = info_resp.json()['data']['play_url'] + # print(f"音乐的播放地址为:'\n'{get_music_url}") + + # 发送请求到服务器,获取音乐资源 + m_resp = requests.get(get_music_url, headers=headers1) + + # 服务器回应的数据 --保存数据 + name = m_list[int(s) - 1].get('FileName') + '.mp3' + + # 打开一个文件 写入二进制数据 并输出提示信息 + with open(name, 'wb') as f: # wb 写进二进制 + f.write(m_resp.content) + if s in num: + showinfo('成功', f"第{s}首,已经OK啦!") + f.close() + try: + move(name, 'Music_Download') + except Error: + pass + if s == num[-1]: + showinfo('成功', f"\n您挑选的{len(num)}首音乐,已经全部下载完成!") \ No newline at end of file diff --git a/sys/lib/music/MMC Main.py b/sys/lib/music/MMC Main.py new file mode 100644 index 0000000..d6e373c --- /dev/null +++ b/sys/lib/music/MMC Main.py @@ -0,0 +1,43 @@ +from tkinter import * +import requests +import json +from tkinter.simpledialog import askstring +from os import getcwd, mkdir, startfile +from tkinter.messagebox import showinfo +from shutil import move, Error +from os.path import exists +def init(): + if exists('Music_Download') == True: + pass + else: + dir_name = getcwd() + mkdir(dir_name + '\\Music_Download') +def search(): + startfile(getcwd() + '\\music\\MMC Download.pyw') +def open_MMC_Paly_File(): + startfile(getcwd() + '\\music\\MMC Player.py') +def info(): + showinfo('关于', '网络歌曲来源于酷狗音乐,仅供学习交流使用,请勿用于商业用途\n主要开发:肝肝甘甘的野生电脑\nGUI修改以及美化:一只悠然自得\n版本:MyOS Special Edition V1(β2)') +#初始化 +init() +#创建窗口对象 +main_window = Tk() +main_window.resizable(False, False) +#窗口大小 +main_window.geometry('202x30') +#窗口标题 +main_window.title('MMC') +#--菜单栏 +#搜索网络歌曲选项 +into_search = Button(main_window, text = '搜索网络歌曲', command = search) +into_search.grid(row = 0, column = 0) +#播放歌曲选项 +into_play = Button(main_window, text = '播放本地歌曲', command = open_MMC_Paly_File) +into_play.grid(row = 0, column = 1) +#关于选项 +into_play = Button(main_window, text = '关于', command = info) +into_play.grid(row = 0, column = 2) +#定义背景颜色 +main_window.configure(background='gray') +#显示窗口 +main_window.mainloop() \ No newline at end of file diff --git a/sys/lib/music/MMC Player.py b/sys/lib/music/MMC Player.py new file mode 100644 index 0000000..762c07d --- /dev/null +++ b/sys/lib/music/MMC Player.py @@ -0,0 +1,69 @@ +from os import listdir +from tkinter import Tk, StringVar,Button,messagebox, Radiobutton +from tkinter import ttk +from sys import exit as ex +from pygame import mixer +import threading +from tkinter.simpledialog import askfloat +from tkinter.messagebox import showerror +play_window = Tk() +play_window.title('播放') +play_window.configure(background='gray') +play_window.geometry("500x150") + +play_window.resizable(width=False, height=False) +music_name = listdir('Music_Download') +try: + selected_music = StringVar(value=music_name[0]) +except: + showerror('错误', '没有找到') +else: + music_dropdown = ttk.Combobox(play_window, textvariable=selected_music, values=music_name,state='readonly', width = 60) + music_dropdown.place(x=20,y=20) + def play_m(): + mixer.init() + mixer.music.set_volume(0.1) + music_name_in_def = music_dropdown.get() + mixer.music.load('Music_Download/' + music_name_in_def) + mixer.music.play(2) + while mixer.music.get_busy(): + pass + def pause_m(): + mixer.init() + mixer.music.pause() + def start_pause(): + mixer.init() + global fadeout_TF + mixer.music.unpause() + + #创建多线程,以防应用未响应 + def start_tread_1(): + thread = threading.Thread(target = pause_m, args = ()) + thread.setDaemon(True) + thread.start() + def start_tread_2(): + thread = threading.Thread(target = play_m, args = ()) + thread.setDaemon(True) + thread.start() + def start_tread_3(): + thread = threading.Thread(target = start_pause, args = ()) + thread.setDaemon(True) + thread.start() + def val_set(): + mixer.init() + val = askfloat('音量设置', '请输入音量大小(0-1之间的小数)') + if val > 1 or val < 0: + showerror('错误', '请输入一个小于1或大于0的数') + else: + mixer.music.set_volume(val) + + play_button = Button(play_window, text="开始播放", command=start_tread_2,overrelief='sunken',bd=4,cursor='hand2') + play_button.place(x=50, y=60) + + pause_button = Button(play_window, text="暂停", command=start_tread_1,overrelief='sunken',bd=4,cursor='hand2') + pause_button.place(x=400, y=60) + unpause_button = Button(play_window, text="继续播放", command=start_tread_3,overrelief='sunken',bd=4,cursor='hand2') + unpause_button.place(x=200, y=60) + val_button = Button(play_window, text = "声音设置", command = val_set, overrelief='sunken',bd=4,cursor='hand2') + val_button.place(x = 300, y = 60) + play_window.mainloop() \ No newline at end of file diff --git a/sys/lib/music/__init__.mia b/sys/lib/music/__init__.mia new file mode 100644 index 0000000..32e4953 --- /dev/null +++ b/sys/lib/music/__init__.mia @@ -0,0 +1,182 @@ +import tkinter as tk +try: + #绝对会报错,只是用于高亮提示,可以删除,真正的导入部分在Kernel + import sys.kernel.UI as UI + from sys.kernel.tools import * +except: + pass +import requests +import json +from tkinter.simpledialog import askstring +from os import getcwd, mkdir, startfile +from tkinter.messagebox import showinfo +from shutil import move, Error +from os.path import exists +from os import listdir +from tkinter import Tk, StringVar,Button,messagebox, Radiobutton +from tkinter import ttk +from sys import exit as ex +from pygame import mixer +import threading +from tkinter.simpledialog import askfloat +from tkinter.messagebox import showerror + +def init(): + if exists('Music_Download') == True: + pass + else: + dir_name = getcwd() + mkdir(dir_name + '\\Music_Download') +def search(): + # 伪装自己的信息 + headers = { + 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:106.0) Gecko/20100101 Firefox/106.0', + 'Accept': 'application/json, text/plain, */*', + 'Referer': 'https://kuwo.cn', + 'Secret': '10373b58aee58943f95eaf17d38bc9cf50fbbef8e4bf4ec6401a3ae3ef8154560507f032', + 'Cookie': 'Hm_lvt_cdb524f42f0ce19b169a8071123a4797=1687520303,1689840209; _ga=GA1.2.2021483490.1666455184; _ga_ETPBRPM9ML=GS1.2.1689840210.4.1.1689840304.60.0.0; Hm_Iuvt_cdb524f42f0ce19b169b8072123a4727=NkA4TadJGeBWwmP2mNGpYRrM8f62K8Cm; Hm_lpvt_cdb524f42f0ce19b169a8071123a4797=1689840223; _gid=GA1.2.1606176174.1689840209; _gat=1', + + } + + name = askstring('获取名称', "请输入你要搜索的“音乐名称”或“歌手") + # 音乐列表的地址 + list_url = f'https://songsearch.kugou.com/song_search_v2?keyword={name}&platform=WebFilter' + + list_resp = requests.get(list_url, headers=headers) + m_list = json.loads(list_resp.text[:])['data']['lists'] + name_list = [] + for i, s in enumerate(m_list): + name_list.append(f'{i + 1}------{s.get("FileName")}') + Download_window = UI.Window() + Download_window.geometry('300x300') + Download_window.TitleText.config(text="搜素结果") + Download_window=Download_window.Widget + MusicN_List = tk.Listbox(Download_window, width = 40, height = 37) + MusicN_List.pack() + for j in name_list: + MusicN_List.insert("end", j) + num = askstring('输入序列号', '请输入要下载的音乐号(输入格式为 1 2):').split() + for s in num: + # 此处的 header1 可有可无 但是不带 cookie 的 headers 请求时 可能会出现问题 + headers1 = { + 'UserAgent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:106.0) Gecko/20100101 Firefox/106.0', + 'Cookie': 'kg_mid=536e52feec7d1c95137aa1d341f8144e; kg_dfid=3exupN3BZJMQ3ftR4x0KOXDk; kg_dfid_collect=d41d8cd98f00b204e9800998ecf8427e; kg_mid_temp=536e52feec7d1c95137aa1d341f8144e'} + + # 构造你请求资源的URL + + info_url = f'https://wwwapi.kugou.com/yy/index.php?r=play/getdata&hash={m_list[int(s) - 1].get("FileHash")}&album_audio_id={m_list[int(s) - 1].get("ID")}' + + # 进行访问 + info_resp = requests.get(info_url, headers=headers1) + + # 拿取你所请求资源的数据(这里是得到播放音乐的地址) + get_music_url = info_resp.json()['data']['play_url'] + # print(f"音乐的播放地址为:'\n'{get_music_url}") + + # 发送请求到服务器,获取音乐资源 + m_resp = requests.get(get_music_url, headers=headers1) + + # 服务器回应的数据 --保存数据 + name = m_list[int(s) - 1].get('FileName') + '.mp3' + + # 打开一个文件 写入二进制数据 并输出提示信息 + with open(name, 'wb') as f: # wb 写进二进制 + f.write(m_resp.content) + if s in num: + showinfo('成功', f"第{s}首,已经OK啦!") + f.close() + try: + move(name, 'Music_Download') + except Error: + pass + if s == num[-1]: + showinfo('成功', f"\n您挑选的{len(num)}首音乐,已经全部下载完成!") + +def open_MMC_Paly_File(): + play_window = UI.Window() + play_window.TitleText.config(text="播放") + play_window.configure(background='gray') + play_window.geometry("500x150") + + play_window.resizable(width=False, height=False) + play_window=play_window.Widget + music_name = listdir('Music_Download') + try: + selected_music = StringVar(value=music_name[0]) + except: + showerror('错误', '没有找到') + else: + music_dropdown = ttk.Combobox(play_window, textvariable=selected_music, values=music_name,state='readonly', width = 60) + music_dropdown.place(x=20,y=20) + def play_m(): + mixer.init() + mixer.music.set_volume(0.1) + music_name_in_def = music_dropdown.get() + mixer.music.load('Music_Download/' + music_name_in_def) + mixer.music.play(2) + while mixer.music.get_busy(): + pass + def pause_m(): + mixer.init() + mixer.music.pause() + def start_pause(): + mixer.init() + global fadeout_TF + mixer.music.unpause() + + #创建多线程,以防应用未响应 + def start_tread_1(): + thread = threading.Thread(target = pause_m, args = ()) + thread.setDaemon(True) + thread.start() + def start_tread_2(): + thread = threading.Thread(target = play_m, args = ()) + thread.setDaemon(True) + thread.start() + def start_tread_3(): + thread = threading.Thread(target = start_pause, args = ()) + thread.setDaemon(True) + thread.start() + def val_set(): + mixer.init() + val = askfloat('音量设置', '请输入音量大小(0-1之间的小数)') + if val > 1 or val < 0: + showerror('错误', '请输入一个小于1或大于0的数') + else: + mixer.music.set_volume(val) + + play_button = Button(play_window, text="开始播放", command=start_tread_2,overrelief='sunken',bd=4,cursor='hand2') + play_button.place(x=50, y=60) + + pause_button = Button(play_window, text="暂停", command=start_tread_1,overrelief='sunken',bd=4,cursor='hand2') + pause_button.place(x=400, y=60) + unpause_button = Button(play_window, text="继续播放", command=start_tread_3,overrelief='sunken',bd=4,cursor='hand2') + unpause_button.place(x=200, y=60) + val_button = Button(play_window, text = "声音设置", command = val_set, overrelief='sunken',bd=4,cursor='hand2') + val_button.place(x = 300, y = 60) + play_window.mainloop() +def info(): + showinfo('关于', '网络歌曲来源于酷狗音乐,仅供学习交流使用,请勿用于商业用途\n主要开发:肝肝甘甘的野生电脑\nGUI修改以及美化:一只悠然自得\n版本:MyOS Special Edition V1(β2)') +#初始化 +init() +#创建窗口对象 +main_window = UI.Window() +main_window.resizable(False, False) +#窗口大小 +main_window.geometry('202x50') +#窗口标题 +main_window.TitleText.config(text="MMC") +#--菜单栏 +#搜索网络歌曲选项 +into_search = Button(main_window.Widget, text = '搜索网络歌曲', command = search) +into_search.grid(row = 0, column = 0) +#播放歌曲选项 +into_play = Button(main_window.Widget, text = '播放本地歌曲', command = open_MMC_Paly_File) +into_play.grid(row = 0, column = 1) +#关于选项 +into_play = Button(main_window.Widget, text = '关于', command = info) +into_play.grid(row = 0, column = 2) +#定义背景颜色 +main_window.Widget.configure(background='gray') +#显示窗口 +main_window.Widget.mainloop() \ No newline at end of file diff --git a/sys/lib/setting/ICO.png b/sys/lib/setting/ICO.png new file mode 100644 index 0000000..f5994ee Binary files /dev/null and b/sys/lib/setting/ICO.png differ diff --git a/sys/lib/setting/__init__.mia b/sys/lib/setting/__init__.mia new file mode 100644 index 0000000..a6a8086 --- /dev/null +++ b/sys/lib/setting/__init__.mia @@ -0,0 +1,98 @@ +from tkinter import Tk,Button,Canvas,messagebox,OptionMenu,StringVar +from os import startfile,path,getcwd,system +from sys import exit as ex + +#----------Made by 悠然自得、添亮了(肝肝甘甘的野生电脑)----------# + + + + + + + + + + +#设置尺寸为None值 +chicun = None + +# 创建主窗口 +root = UI.Window() + +#创建调整大小窗口 + +root2 = UI.Window() + +#暂时隐藏副窗口 +root2.withdraw() + +#设置尺寸 +root.geometry("400x300") +root2.geometry("100x150") + +#标题设置 +root.title("设置") + +#设置背景色 +root.configure(background='gray') +root2.configure(background='gray') + + +#不可放大缩小:设置 +root.resizable(width=False, height=False) +root2.resizable(width=False, height=False) + + +def Button1(): + global chicun + chicun = '500x300' + root2.withdraw() + +def Button2(): + global chicun + chicun = '750x450' + root2.withdraw() + +def Button3(): + global chicun + chicun = '1000x600' + root2.withdraw() +#副窗口按钮 +button1 = Button(root2.Widget, text="500x300",overrelief='sunken',bd=4,command=Button1) +button1.pack(side="top", pady=8) + +button2 = Button(root2.Widget, text="750x450",overrelief='sunken',bd=4,command=Button2) +button2.pack(side="top", pady=8) + +button3 = Button(root2.Widget, text="1000x600",overrelief='sunken',bd=4,command=Button3) +button3.pack(side="top", pady=8) + + + + +def open4(): + root = UI.Window() + root.withdraw() + messagebox.showinfo('操作系统信息',f'名称:MikOS \n版本号:{Kernel["VerSion"]}\nPowered by Python Tkinter\n© 2023 G Dev Hub MikOS Dev Team') + messagebox.showinfo('终端信息', f'名称:MayDOS \n版本号:{DOS["VerSion"]}© 2023 MayDOS Team') + root.mainloop() + + +# 创建按钮 +button1 = Button(root.Widget, text="设置窗口大小", command=None, width=20,overrelief='sunken',bd=4) +button2 = Button(root.Widget, text="修改背景", command=None, width=20,overrelief='sunken',bd=4) +button3 = Button(root.Widget, text="修改配置文件", command=None, width=20,overrelief='sunken',bd=4) +button4 = Button(root.Widget, text="终端", command=None, width=20,overrelief='sunken',bd=4) +button5 = Button(root.Widget, text="关于系统", command=open4, width=20,overrelief='sunken',bd=4) + +# 将按钮竖着并排显示在窗口中 +button1.grid(row=0, column=0, padx=40, pady=(16,0)) +button2.grid(row=1, column=0, padx=40, pady=(10,0)) +button3.grid(row=2, column=0, padx=40, pady=(10,0)) +button4.grid(row=3, column=0, padx=40, pady=(10,0)) +button5.grid(row=4, column=0, padx=40, pady=(10,0)) + +root2.protocol("WM_DELETE_WINDOW", root2.withdraw) +root.protocol("WM_DELETE_WINDOW",ex) +# 运行主程序 +root.mainloop() diff --git a/sys/lib/setting/setting_bg.pyw b/sys/lib/setting/setting_bg.pyw new file mode 100644 index 0000000..377dbe8 --- /dev/null +++ b/sys/lib/setting/setting_bg.pyw @@ -0,0 +1,96 @@ +from os import listdir +from tkinter import Tk, StringVar,Button,messagebox +from tkinter import ttk +from tkinter.filedialog import askopenfilename +from sys import exit as ex + + +#----------Made by 悠然自得、添亮了(肝肝甘甘的野生电脑)----------# + + +# 创建主窗口 +root = Tk() +root.title("修改背景") + +#设置背景色 +root.configure(background='gray') +#设置大小及不可缩放 + +root.geometry("200x100") + +root.resizable(width=False, height=False) +# 读取BG文件夹内容 +try: + bg_files = listdir("bg") +except: + bg_files = listdir("../bg") + +# 创建下拉菜单并添加选项 +selected_bg = StringVar(value=bg_files[0]) +bg_dropdown = ttk.Combobox(root, textvariable=selected_bg, values=bg_files,state='readonly') +bg_dropdown.place(x=20,y=20) + + + +def get_new_img(): + main_img = askopenfilename(initialdir='C:/Users/', filetypes=[('图片', '*.png;*.jpg;*.jpeg;*.bmp;')]) + if main_img == '' or main_img == None: + print('Debug:检测到路径失效或关闭路径选择窗口,已取消写入配置文件') + return + print('Debug:导入选择路径为:',main_img) + current_selection = bg_dropdown.get() + try: + with open("配置.txt", "r") as f: + lines = f.readlines() + lines[1] = f"{main_img}\n" + with open("配置.txt", "w") as f: + f.writelines(lines) + print(f"Debug:将 {repr(main_img)} 写入配置文件") + except: + with open("..\配置.txt", "r") as f: + lines = f.readlines() + lines[1] = f"{main_img}\n" + with open("..\配置.txt", "w") as f: + f.writelines(lines) + print(f"Debug:将 {repr(main_img)} 写入配置文件") + finally: + print('Debug:try语句资源释放成功') + messagebox.showinfo('MyOS:提示', '背景修改成功!') + ex() + + +def modify_config(): + current_selection = bg_dropdown.get() + try: + with open("配置.txt", "r") as f: + lines = f.readlines() + lines[1] = f"bg\{current_selection}\n" + + with open("配置.txt", "w") as f: + f.writelines(lines) + print(f"Debug:将选项 {current_selection} 写入配置文件") + except: + with open("..\配置.txt", "r") as f: + lines = f.readlines() + lines[1] = f"bg\{current_selection}\n" + with open("..\配置.txt", "w") as f: + f.writelines(lines) + print(f"Debug:将选项 {current_selection} 写入配置文件") + finally: + print('Debug:try语句资源释放成功') + messagebox.showinfo('MyOS:提示','背景修改成功!') + ex() + + + +modify_button = Button(root, text="修改背景", command=modify_config,overrelief='sunken',bd=4,cursor='hand2') +modify_button.place(x=20, y=60) + +new_img_button = Button(root,text="自定义", command=get_new_img,overrelief='sunken',bd=4,cursor='hand2') +new_img_button.place(x=86, y=60) + + +quit_button = Button(root, text="关闭", command=ex,overrelief='sunken',bd=4,cursor='hand2') +quit_button.place(x=140, y=60) +# 运行主循环 +root.mainloop() \ No newline at end of file diff --git a/sys/tkinter.mik/ICO.png b/sys/tkinter.mik/ICO.png new file mode 100644 index 0000000..6f7aeb2 Binary files /dev/null and b/sys/tkinter.mik/ICO.png differ diff --git a/sys/ui.mik/close_100.png b/sys/ui.mik/close_100.png new file mode 100644 index 0000000..59d1234 Binary files /dev/null and b/sys/ui.mik/close_100.png differ diff --git a/sys/ui.mik/close_50.png b/sys/ui.mik/close_50.png new file mode 100644 index 0000000..9c923d4 Binary files /dev/null and b/sys/ui.mik/close_50.png differ diff --git a/sys/ui.mik/fullwin_100.png b/sys/ui.mik/fullwin_100.png new file mode 100644 index 0000000..de9aadb Binary files /dev/null and b/sys/ui.mik/fullwin_100.png differ diff --git a/sys/ui.mik/fullwin_50.png b/sys/ui.mik/fullwin_50.png new file mode 100644 index 0000000..1af1677 Binary files /dev/null and b/sys/ui.mik/fullwin_50.png differ diff --git a/sys/ui.mik/minisize_100.png b/sys/ui.mik/minisize_100.png new file mode 100644 index 0000000..17fcd29 Binary files /dev/null and b/sys/ui.mik/minisize_100.png differ diff --git a/sys/ui.mik/minisize_50.png b/sys/ui.mik/minisize_50.png new file mode 100644 index 0000000..b34fecd Binary files /dev/null and b/sys/ui.mik/minisize_50.png differ diff --git a/sys/ui.mik/text_file.png b/sys/ui.mik/text_file.png new file mode 100644 index 0000000..d26bdc9 Binary files /dev/null and b/sys/ui.mik/text_file.png differ diff --git a/sys/ui.mik/togglefull_100.png b/sys/ui.mik/togglefull_100.png new file mode 100644 index 0000000..01c4551 Binary files /dev/null and b/sys/ui.mik/togglefull_100.png differ diff --git a/sys/ui.mik/togglefull_50.png b/sys/ui.mik/togglefull_50.png new file mode 100644 index 0000000..2a9c725 Binary files /dev/null and b/sys/ui.mik/togglefull_50.png differ diff --git a/sys/wallpaper/translucent.png b/sys/wallpaper/translucent.png new file mode 100644 index 0000000..d1b69b5 Binary files /dev/null and b/sys/wallpaper/translucent.png differ diff --git a/sys/wallpaper/夕阳1.png b/sys/wallpaper/夕阳1.png new file mode 100644 index 0000000..1bda0bf Binary files /dev/null and b/sys/wallpaper/夕阳1.png differ diff --git a/sys/wallpaper/森林1.png b/sys/wallpaper/森林1.png new file mode 100644 index 0000000..9155d4a Binary files /dev/null and b/sys/wallpaper/森林1.png differ diff --git a/sys/wallpaper/森林2.png b/sys/wallpaper/森林2.png new file mode 100644 index 0000000..c727212 Binary files /dev/null and b/sys/wallpaper/森林2.png differ diff --git a/sys/wallpaper/田野1.png b/sys/wallpaper/田野1.png new file mode 100644 index 0000000..25c5387 Binary files /dev/null and b/sys/wallpaper/田野1.png differ diff --git a/sys/wallpaper/红色 b/sys/wallpaper/红色 new file mode 100644 index 0000000..457f88f Binary files /dev/null and b/sys/wallpaper/红色 differ diff --git a/sys/wallpaper/绿色 b/sys/wallpaper/绿色 new file mode 100644 index 0000000..2c89172 Binary files /dev/null and b/sys/wallpaper/绿色 differ diff --git a/sys/wallpaper/蓝色 b/sys/wallpaper/蓝色 new file mode 100644 index 0000000..f262688 Binary files /dev/null and b/sys/wallpaper/蓝色 differ diff --git a/sys/wallpaper/黄色 b/sys/wallpaper/黄色 new file mode 100644 index 0000000..1759bdb Binary files /dev/null and b/sys/wallpaper/黄色 differ