From aa210ac678698d84ea664cfa3b0888ffb3af783e Mon Sep 17 00:00:00 2001 From: EillesWan Date: Sun, 6 Feb 2022 18:59:45 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BB=A3=E7=A0=81=E9=87=8D=E6=9E=84=E7=AC=AC?= =?UTF-8?q?=E4=B8=80=E6=AD=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Musicreater.New.py | 5 ---- msctLib/data.py | 25 ++++++++++---------- msctLib/display.py | 47 ++++++++++++++++++++++++++++++++++++++ msctLib/开发说明兼指南.md | 41 +++++++++++++++++++++++++++++++++ options/__init__.py | 0 resources/myWords.txt | 32 ++++++++++++++++++++++++++ 测试用/1.msct | Bin 181284 -> 0 bytes 7 files changed, 132 insertions(+), 18 deletions(-) create mode 100644 msctLib/display.py create mode 100644 msctLib/开发说明兼指南.md delete mode 100644 options/__init__.py delete mode 100644 测试用/1.msct diff --git a/Musicreater.New.py b/Musicreater.New.py index 76b22de..4b64f3d 100644 --- a/Musicreater.New.py +++ b/Musicreater.New.py @@ -38,14 +38,9 @@ __ver__ = f'{version.version[1]} {version.version[0]}' __author__ = '金羿Eilles' -import tkinter -import tkinter.simpledialog as sdialog -import tkinter.filedialog as fdialog -from msctLib.settings import settings - diff --git a/msctLib/data.py b/msctLib/data.py index 4290dce..d913fd1 100644 --- a/msctLib/data.py +++ b/msctLib/data.py @@ -78,7 +78,7 @@ class jsonIO: class uniteIO: - def __init__(self,fileName:str,fileType,data: Any = None) -> None: + def __init__(self,fileName:str,fileType = None,data: Any = None) -> None: '''简单的文件数据IO操作功能''' self.filename = fileName if not fileType is None: @@ -91,21 +91,12 @@ class uniteIO: with open (self.file, 'rb') as f: self._type = pickle - if self._type == json: - with open (self.filename, 'r', encoding='utf-8') as f: - self._rfile = f - with open (self.filename, 'w', encoding='utf-8') as f: - self._wfile = f - elif self._type == pickle: - with open (self.file, 'rb') as f: - self._rfile = f - with open (self.file, 'wb') as f: - self._wfile = f + if not data is None: self._data = data else: - self._data = self._type.load(self._rfile) + self._data = self.load() def __call__(self, *args: Any, **kwds: Any) -> Any: @@ -113,11 +104,19 @@ class uniteIO: def write(self): '''将数据写入文件''' + if self._type == json: + self._wfile = open(self.filename, 'w', encoding='utf-8') + elif self._type == pickle: + self._wfile = open(self.file, 'wb') self._type.dump(self._data, self._wfile) def load(self) -> Any: '''从文件读取数据''' + if self._type == json: + self._rfile = open(self.filename, 'r', encoding='utf-8') + elif self._type == pickle: + self._rfile = open(self.file, 'rb') self._data = self._type.load(self._rfile) return self.data @@ -131,4 +130,4 @@ if __name__ == '__main__': from sys import argv if argv[1]: - input(pickle(argv[1]).data) \ No newline at end of file + input(uniteIO(argv[1]).data) \ No newline at end of file diff --git a/msctLib/display.py b/msctLib/display.py new file mode 100644 index 0000000..7832026 --- /dev/null +++ b/msctLib/display.py @@ -0,0 +1,47 @@ +# -*- coding: utf-8 -*- +'''音·创的GUI界面显示库 +:若要使用其他界面显示,请详见: +:开发说明|指南''' + + +import tkinter as tk +import tkinter.simpledialog as sdialog +import tkinter.filedialog as fdialog + +root = tk.Tk() + +class disp: + + def __init__(self,root:tk.Tk = root,debug:bool = False,**kwgs) -> None: + '''传入root参数为窗口根,kwgs详见开发说明|指南''' + + self.root = root + + self.FUNCLIST = { + 'title' : self.setTitle, + 'geometry': self.setGeometry, + 'iconbitmap': self.setIcon, + } + '''注:此处为引导传参,若传参错误且debug模式关闭则不会有任何反馈''' + + def setTitle(self,title:str = '') -> None: + self.root.title = title + + def setGeometry(self,geometry) -> None: + self.root.geometry(geometry) + + def setIcon(self,*icon) -> None: + self.root.iconbitmap(*icon) + + def setMenu(self,**kwgs) -> None: + menus = [] + mainMenuBar = tk.Menu(self.root) + for menuName,menuCmd in kwgs.items(): + menu = tk.Menu(mainMenuBar,tearoff=0) + for cmdName,cmdFunc in menuCmd.items(): + if cmdName: + menu.add_command(label = cmdName, command = cmdFunc) + else: + menu.add_separator() + mainMenuBar.add_cascade(label=menuName,menu=menu) + menus.append(menu) \ No newline at end of file diff --git a/msctLib/开发说明兼指南.md b/msctLib/开发说明兼指南.md new file mode 100644 index 0000000..13bb56b --- /dev/null +++ b/msctLib/开发说明兼指南.md @@ -0,0 +1,41 @@ + +# 开发说明\|指南 + +此文件旨在使后期欲参与开发之人员减轻其开发负担,同时也为了我们正在开发的人员详细说明功能与用法 +掌握开发指南之后,在调用函数等的过程中将会更加方便 + +## 文件结构 + +从主文件调用display.py以实现显示,调用functions.py以使用功能 + +functions.py中会调取./addon/目录下的全部功能文件,这些功能文件必须先由./addon/addons.pkl来预先定义好 + +## 详细说明 + +### msctLib + +用于支持主要功能 + +#### display.py + +1. class disp + - 参数 + 1. `**kwgs`对窗口的基础设定 + `{ '组件名称' : 函数自设定 }` + 例如: + ```python + { + 'version': '0.0.1' # version指的是 + 'title': "音·创", + 'geometry': '1200x900', + 'iconbitmap': ('./resources/musicreater.ico', './resources/musicreater.ico'), + 'menu' : { #对setMenu有特殊说明 + '文件': { + '新建': lambda : x, + '打开': lambda : x, + }, + }, + } + ``` + - 函数 + 1. `setMenu`对菜单的基础设定 diff --git a/options/__init__.py b/options/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/resources/myWords.txt b/resources/myWords.txt index 74e57ac..45d8687 100644 --- a/resources/myWords.txt +++ b/resources/myWords.txt @@ -41,3 +41,35 @@ 一切过程与结果都不重要 重要的是热爱与真情 给大家带来笑容 这就是我存在的使命 不忘本源 牢记故地 +一厢情愿即是真 心海浮沉即为灵 +听戏时要点最红的名伶,\n遛鸟时要买最名贵的画眉\n——此即人生 ——原神 +「精巧」是千年的积淀,而其背后皆存于「意义」 +世事无常,悲喜难料 ——原神 +金钱在死亡面前毫不重要 +风雨兄弟情 +微笑面对现实 +人于磨难中练就 +Long live the People's Republic of China. +There is NO heroes, only honors. +A man achieve with challenges. +种果得果,等的就是这份收获的喜悦 ——原神 +事了拂衣去,深藏功与名 +万事开头虽难,倾注的情感也多;\n而欲永恒,仍需重新审视自身\n不小心处理,灵魂便留下裂纹无法挽回。 +历经历史的沉淀,留下希望的继承 +身为凡民,血脉脆弱,却也坚强 +民为本,社稷次之,君为轻 ——孟子 +不如归去 +你完成了你的职责,现在,去休息吧。 +一场长梦,梦醒之后,人就学会了诀别。 +你们——会祝福下一个时代吗? ——原神 +任何旅途中的旅伴同行,都会有分别的一日。 ——原神 +「永恒」最接近于天理 ——原神 +等旅途到达了终点,再考虑停留于何处吧。 ——原神 +人海中相遇,本是缘分。 ——原神 +凡缘朦朦仙缘滔 +因果红尘渺渺,烟消 ——原神 +未入尘世,而心远之 +灵心而静,莫问归期 +美酒宜人,宜人的却不只是美酒。 ——原神 +戏会落幕,人生却不会。 ——原神 +历史越久远,土地上的每一件事物就会承载更多价值。 ——原神 diff --git a/测试用/1.msct b/测试用/1.msct deleted file mode 100644 index 8857f3766026c3dd455473a852f670ad17a9fc05..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 181284 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