Initial commit with README
3
Autorun.ini
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
[autorun]
|
||||||
|
Open=python.exe /sys/kernel/main.py
|
||||||
|
Icon=/sys/images.mik/[MICO].png
|
||||||
80
README.md
Normal file
@@ -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
|
||||||
0
home/root/Desktop/1 - 副本 (10).txt
Normal file
0
home/root/Desktop/1 - 副本 (11).txt
Normal file
0
home/root/Desktop/1 - 副本 (12).txt
Normal file
0
home/root/Desktop/1 - 副本 (13).txt
Normal file
0
home/root/Desktop/1 - 副本 (14).txt
Normal file
0
home/root/Desktop/1 - 副本 (15).txt
Normal file
0
home/root/Desktop/1 - 副本 (16).txt
Normal file
0
home/root/Desktop/1 - 副本 (17).txt
Normal file
0
home/root/Desktop/1 - 副本 (18).txt
Normal file
0
home/root/Desktop/1 - 副本 (19).txt
Normal file
0
home/root/Desktop/1 - 副本 (2).txt
Normal file
0
home/root/Desktop/1 - 副本 (20).txt
Normal file
0
home/root/Desktop/1 - 副本 (21).txt
Normal file
0
home/root/Desktop/1 - 副本 (22).txt
Normal file
0
home/root/Desktop/1 - 副本 (23).txt
Normal file
0
home/root/Desktop/1 - 副本 (24).txt
Normal file
0
home/root/Desktop/1 - 副本 (25).txt
Normal file
0
home/root/Desktop/1 - 副本 (26).txt
Normal file
0
home/root/Desktop/1 - 副本 (27).txt
Normal file
0
home/root/Desktop/1 - 副本 (28).txt
Normal file
0
home/root/Desktop/1 - 副本 (29).txt
Normal file
0
home/root/Desktop/1 - 副本 (3).txt
Normal file
0
home/root/Desktop/1 - 副本 (30).txt
Normal file
0
home/root/Desktop/1 - 副本 (31).txt
Normal file
0
home/root/Desktop/1 - 副本 (4).txt
Normal file
0
home/root/Desktop/1 - 副本 (5).txt
Normal file
0
home/root/Desktop/1 - 副本 (6).txt
Normal file
0
home/root/Desktop/1 - 副本 (7).txt
Normal file
0
home/root/Desktop/1 - 副本 (8).txt
Normal file
0
home/root/Desktop/1 - 副本 (9).txt
Normal file
0
home/root/Desktop/1 - 副本.txt
Normal file
55
home/root/Desktop/1.js
Normal file
@@ -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();
|
||||||
|
});
|
||||||
|
})();
|
||||||
11
home/root/Desktop/1.txt
Normal file
@@ -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==
|
||||||
|
|
||||||
6
home/root/Desktop/MMC音乐.Miksc
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"SApp":"music",
|
||||||
|
"Start":"__init__.mia",
|
||||||
|
"display-ico":"ICO.png",
|
||||||
|
"F":""
|
||||||
|
}
|
||||||
BIN
home/root/Desktop/WIN_20231112_07_46_41_Pro.jpg
Normal file
|
After Width: | Height: | Size: 173 KiB |
6
home/root/Desktop/计算器.Miksc
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"SApp":"CALC",
|
||||||
|
"Start":"__init__.mia",
|
||||||
|
"display-ico":"ICO.png",
|
||||||
|
"F":""
|
||||||
|
}
|
||||||
6
home/root/Desktop/设置.Miksc
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"SApp":"setting",
|
||||||
|
"Start":"__init__.mia",
|
||||||
|
"display-ico":"ICO.png",
|
||||||
|
"F":""
|
||||||
|
}
|
||||||
1
home/root/PASSWD
Normal file
@@ -0,0 +1 @@
|
|||||||
|
ROOT
|
||||||
47
sys/config/config.json
Normal file
@@ -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"
|
||||||
|
}
|
||||||
|
}
|
||||||
BIN
sys/images.mik/[App].ico
Normal file
|
After Width: | Height: | Size: 52 KiB |
BIN
sys/images.mik/[Dir].ico
Normal file
|
After Width: | Height: | Size: 64 KiB |
BIN
sys/images.mik/[EICO].png
Normal file
|
After Width: | Height: | Size: 52 KiB |
BIN
sys/images.mik/[ESP32].ico
Normal file
|
After Width: | Height: | Size: 77 KiB |
BIN
sys/images.mik/[MICO].png
Normal file
|
After Width: | Height: | Size: 492 KiB |
BIN
sys/images.mik/[None].ico
Normal file
|
After Width: | Height: | Size: 43 KiB |
BIN
sys/images.mik/[audio].ico
Normal file
|
After Width: | Height: | Size: 73 KiB |
BIN
sys/images.mik/[cmd].ico
Normal file
|
After Width: | Height: | Size: 45 KiB |
BIN
sys/images.mik/[iso].ico
Normal file
|
After Width: | Height: | Size: 56 KiB |
BIN
sys/images.mik/[ppt].ico
Normal file
|
After Width: | Height: | Size: 67 KiB |
BIN
sys/images.mik/[sql].ico
Normal file
|
After Width: | Height: | Size: 67 KiB |
BIN
sys/images.mik/[text].ico
Normal file
|
After Width: | Height: | Size: 43 KiB |
BIN
sys/images.mik/[word].ico
Normal file
|
After Width: | Height: | Size: 67 KiB |
BIN
sys/images.mik/[xls].ico
Normal file
|
After Width: | Height: | Size: 68 KiB |
34
sys/kernel/AskDuc.md
Normal file
@@ -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/|||目录|用户级程序|
|
||||||
183
sys/kernel/UI.py
Normal file
@@ -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("<Enter>", lambda _: self.Exit.config(background="#dd0009"))
|
||||||
|
self.Exit.bind("<Leave>", 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("<Double-Button-1>", lambda event:ComMaxSmall())
|
||||||
|
def ComMaxSmall():
|
||||||
|
self.wm_state("normal")
|
||||||
|
self.Max.config(image=self.MaxImg,command=ComMax)
|
||||||
|
self.Title.bind("<Double-Button-1>", 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("<Enter>", lambda _: self.Max.config(background="#f2efef"))
|
||||||
|
self.Max.bind("<Leave>", 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("<Double-Button-1>", 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("<Enter>", lambda _: self.Min.config(background="#f2efef"))
|
||||||
|
self.Min.bind("<Leave>", 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("<ButtonPress-1>", start_move)
|
||||||
|
self.Title.bind("<ButtonRelease-1>", stop_move)
|
||||||
|
self.Title.bind("<B1-Motion>", on_motion)
|
||||||
|
self.TitleText.bind("<ButtonPress-1>", start_move)
|
||||||
|
self.TitleText.bind("<ButtonRelease-1>", stop_move)
|
||||||
|
self.TitleText.bind("<B1-Motion>", 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())
|
||||||
BIN
sys/kernel/__pycache__/UI.cpython-312.pyc
Normal file
BIN
sys/kernel/__pycache__/login.cpython-312.pyc
Normal file
BIN
sys/kernel/__pycache__/mount.cpython-312.pyc
Normal file
BIN
sys/kernel/__pycache__/tools.cpython-312.pyc
Normal file
41
sys/kernel/login.py
Normal file
@@ -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)
|
||||||
124
sys/kernel/main.pyw
Normal file
@@ -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()
|
||||||
16
sys/kernel/mount.py
Normal file
@@ -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
|
||||||
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
|
||||||
8
sys/lib/MikDOS/DOS/Command.txt
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
shutdown 关闭终端
|
||||||
|
help 帮助
|
||||||
|
startMik 启动MikOS
|
||||||
|
setting 设置
|
||||||
|
repair 修复运行环境
|
||||||
|
time 时间
|
||||||
|
open 打开
|
||||||
|
restart 重启
|
||||||
10
sys/lib/MikDOS/DOS/file/Command.txt
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
shutdown 关闭终端
|
||||||
|
help 帮助
|
||||||
|
startMik 启动MikOS
|
||||||
|
setting 设置
|
||||||
|
repair 修复运行环境
|
||||||
|
time 时间
|
||||||
|
open 打开
|
||||||
|
restart 重启
|
||||||
|
about 关于
|
||||||
|
setting 设置
|
||||||
1
sys/lib/MikDOS/DOS/file/config.json
Normal file
@@ -0,0 +1 @@
|
|||||||
|
{"Debug":"True"}
|
||||||
2
sys/lib/MikDOS/DOS/file/config_eg.txt
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
选项名称 值1(最小值)/值2(最大值)
|
||||||
|
Debug True/False
|
||||||
31
sys/lib/MikDOS/DOS/lib/DOSLib.py
Normal file
@@ -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)
|
||||||
BIN
sys/lib/MikDOS/DOS/lib/__pycache__/DOSLib.cpython-311.pyc
Normal file
BIN
sys/lib/MikDOS/DOS/lib/__pycache__/DOSLib.cpython-312.pyc
Normal file
45
sys/lib/MikDOS/MikDOS_Main.py
Normal file
@@ -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
|
||||||
28
sys/lib/RUN-MIKSC/__init__.mia
Normal file
@@ -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()
|
||||||
BIN
sys/lib/RUN-TXT/ICO.png
Normal file
|
After Width: | Height: | Size: 670 B |
180
sys/lib/RUN-TXT/__init__.mia
Normal file
@@ -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('<Button-3>', 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__}】')
|
||||||
|
|
||||||
BIN
sys/lib/calc/ICO.png
Normal file
|
After Width: | Height: | Size: 261 B |
123
sys/lib/calc/__init__.mia
Normal file
@@ -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()
|
||||||
152
sys/lib/explorer/__init__.mia
Normal file
@@ -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,'<Button-1>',self.Start)
|
||||||
|
self.c.tag_bind(self.desktop_btn, '<Enter>', self.mouse_hand)
|
||||||
|
self.c.tag_bind(self.desktop_btn, '<Leave>', 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("<Enter>", lambda _: self.TasksIconButton.config(image=self.TasksIconHovImg))
|
||||||
|
self.TasksIconButton.bind("<Leave>", lambda _: self.TasksIconButton.config(image=self.TasksIconImg))
|
||||||
|
self.TasksIconButton.bind("<Button-1>",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()
|
||||||
BIN
sys/lib/music/ICO.png
Normal file
|
After Width: | Height: | Size: 723 B |
69
sys/lib/music/MMC Download.pyw
Normal file
@@ -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)}首音乐,已经全部下载完成!")
|
||||||
43
sys/lib/music/MMC Main.py
Normal file
@@ -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()
|
||||||
69
sys/lib/music/MMC Player.py
Normal file
@@ -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()
|
||||||
182
sys/lib/music/__init__.mia
Normal file
@@ -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()
|
||||||
BIN
sys/lib/setting/ICO.png
Normal file
|
After Width: | Height: | Size: 3.3 KiB |
98
sys/lib/setting/__init__.mia
Normal file
@@ -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()
|
||||||
96
sys/lib/setting/setting_bg.pyw
Normal file
@@ -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()
|
||||||
BIN
sys/tkinter.mik/ICO.png
Normal file
|
After Width: | Height: | Size: 359 B |
BIN
sys/ui.mik/close_100.png
Normal file
|
After Width: | Height: | Size: 195 B |
BIN
sys/ui.mik/close_50.png
Normal file
|
After Width: | Height: | Size: 186 B |
BIN
sys/ui.mik/fullwin_100.png
Normal file
|
After Width: | Height: | Size: 103 B |
BIN
sys/ui.mik/fullwin_50.png
Normal file
|
After Width: | Height: | Size: 105 B |
BIN
sys/ui.mik/minisize_100.png
Normal file
|
After Width: | Height: | Size: 94 B |
BIN
sys/ui.mik/minisize_50.png
Normal file
|
After Width: | Height: | Size: 106 B |
BIN
sys/ui.mik/text_file.png
Normal file
|
After Width: | Height: | Size: 185 B |
BIN
sys/ui.mik/togglefull_100.png
Normal file
|
After Width: | Height: | Size: 114 B |
BIN
sys/ui.mik/togglefull_50.png
Normal file
|
After Width: | Height: | Size: 115 B |
BIN
sys/wallpaper/translucent.png
Normal file
|
After Width: | Height: | Size: 3.7 KiB |
BIN
sys/wallpaper/夕阳1.png
Normal file
|
After Width: | Height: | Size: 6.4 MiB |
BIN
sys/wallpaper/森林1.png
Normal file
|
After Width: | Height: | Size: 984 KiB |