Initial commit with README

This commit is contained in:
GVSADS
2026-01-25 17:01:16 +08:00
commit 246bbd8fd9
106 changed files with 2071 additions and 0 deletions

47
sys/config/config.json Normal file
View 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

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

BIN
sys/images.mik/[Dir].ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 64 KiB

BIN
sys/images.mik/[EICO].png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

BIN
sys/images.mik/[ESP32].ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 77 KiB

BIN
sys/images.mik/[MICO].png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 492 KiB

BIN
sys/images.mik/[None].ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

BIN
sys/images.mik/[audio].ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 73 KiB

BIN
sys/images.mik/[cmd].ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 45 KiB

BIN
sys/images.mik/[iso].ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 56 KiB

BIN
sys/images.mik/[ppt].ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 67 KiB

BIN
sys/images.mik/[sql].ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 67 KiB

BIN
sys/images.mik/[text].ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

BIN
sys/images.mik/[word].ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 67 KiB

BIN
sys/images.mik/[xls].ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 68 KiB

34
sys/kernel/AskDuc.md Normal file
View 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
View 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())

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

41
sys/kernel/login.py Normal file
View 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
View 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
View 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
View 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

View File

@@ -0,0 +1,8 @@
shutdown 关闭终端
help 帮助
startMik 启动MikOS
setting 设置
repair 修复运行环境
time 时间
open 打开
restart 重启

View File

@@ -0,0 +1,10 @@
shutdown 关闭终端
help 帮助
startMik 启动MikOS
setting 设置
repair 修复运行环境
time 时间
open 打开
restart 重启
about 关于
setting 设置

View File

@@ -0,0 +1 @@
{"Debug":"True"}

View File

@@ -0,0 +1,2 @@
选项名称 值1(最小值)/值2(最大值)
Debug True/False

View 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)

View 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

View 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

Binary file not shown.

After

Width:  |  Height:  |  Size: 670 B

View 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

Binary file not shown.

After

Width:  |  Height:  |  Size: 261 B

123
sys/lib/calc/__init__.mia Normal file
View 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()

View 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

Binary file not shown.

After

Width:  |  Height:  |  Size: 723 B

View 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
View 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()

View 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
View 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

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

View 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()

View 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

Binary file not shown.

After

Width:  |  Height:  |  Size: 359 B

BIN
sys/ui.mik/close_100.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 195 B

BIN
sys/ui.mik/close_50.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 186 B

BIN
sys/ui.mik/fullwin_100.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 103 B

BIN
sys/ui.mik/fullwin_50.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 105 B

BIN
sys/ui.mik/minisize_100.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 94 B

BIN
sys/ui.mik/minisize_50.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 106 B

BIN
sys/ui.mik/text_file.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 185 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 114 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 115 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 KiB

BIN
sys/wallpaper/夕阳1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.4 MiB

BIN
sys/wallpaper/森林1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 984 KiB

BIN
sys/wallpaper/森林2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.9 MiB

BIN
sys/wallpaper/田野1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 MiB

BIN
sys/wallpaper/红色 Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

BIN
sys/wallpaper/绿色 Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

BIN
sys/wallpaper/蓝色 Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

BIN
sys/wallpaper/黄色 Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB