diff --git a/LICENSE b/LICENSE index 7060aa2..3f6b16f 100644 --- a/LICENSE +++ b/LICENSE @@ -92,16 +92,16 @@ meet the following conditions: (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and + Derivative Works a copy of this License and (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and + stating that You changed the files and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of - the Derivative Works; and + the Derivative Works and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must @@ -109,8 +109,8 @@ within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, + as part of the Derivative Works within the Source form or + documentation, if provided along with the Derivative Works or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and @@ -178,7 +178,7 @@ Copyright 2022 Eilles Wan (金羿) - Licensed under the Apache License, Version 2.0 (the "License"); + Licensed under the Apache License, Version 2.0 (the "License") you may not use this file except in compliance with the License. You may obtain a copy of the License at diff --git a/Musicreater.py b/Musicreater.py index d275e75..1f3f0f3 100644 --- a/Musicreater.py +++ b/Musicreater.py @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- #! python3 + # W-YI 金羿 # QQ 2647547478 # 音·创 开发交流群 861684859 @@ -8,24 +9,27 @@ # 版权所有 Team-Ryoun 金羿 # 若需转载或借鉴 请附作者 + ''' Copyright 2022 Eilles Wan (金羿) - Licensed under the Apache License, Version 2.0 (the "License"); + Licensed under the Apache License, Version 2.0 (the 'License') you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, + distributed under the License is distributed on an 'AS IS' BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. ''' + # 代码写的并非十分的漂亮,还请大佬多多包涵;本软件源代码依照Apache软件协议公开 + import json import os import shutil @@ -36,6 +40,7 @@ import tkinter.filedialog import tkinter.messagebox import tkinter.simpledialog +from languages.lang import * from msctspt.threadOpera import NewThread from nmcsup.vers import VER @@ -48,7 +53,6 @@ __author__ = 'W-YI (金羿)' -from languages.lang import READABLETEXT @@ -127,7 +131,7 @@ dataset = [ is_new_file = True is_save = True ProjectName = '' -clearLog = False; +clearLog = False NowMusic = 0 root = tk.Tk() @@ -204,7 +208,7 @@ def __main__(): from nmcsup.nmcreader import ReadFile as fileRead k = fileRead(fn) if k == False : - tk.messagebox.showerror(title=READABLETEXT[0], message="找不到文件😢:{}".format(fn)) + tk.messagebox.showerror(title=READABLETEXT[0], message=READABLETEXT[105].format(fn)) return else: return k @@ -214,7 +218,7 @@ def __main__(): from nmcsup.nmcreader import ReadMidi as midiRead k = midiRead(midfile) if k == False : - tk.messagebox.showerror(title=READABLETEXT[0], message="找不到文件或无法读取文件😢:{}".format(midfile)) + tk.messagebox.showerror(title=READABLETEXT[0], message=READABLETEXT[105].format(midfile)) return else: return k @@ -226,12 +230,12 @@ def __main__(): # 菜单命令 - print('加载菜单命令...'); + print('加载菜单命令...') def exitapp(): global is_save if is_save != True: - if tkinter.messagebox.askyesno(title=READABLETEXT[1], message="您当前的项目已修改但未存储,是否先保存当前项目?"): + if tkinter.messagebox.askyesno(title=READABLETEXT[1], message=READABLETEXT[106]): SaveProject() log('程序正常退出') @@ -279,7 +283,7 @@ def __main__(): log('存储已有文件:{}'.format(ProjectName)) with open(ProjectName, 'w', encoding='utf-8') as f: json.dump(dataset[0], f) - tkinter.messagebox.showinfo(title=READABLETEXT[4], message="项目已经存储至:{}".format(ProjectName)) + tkinter.messagebox.showinfo(title=READABLETEXT[4], message=READABLETEXT[107].format(ProjectName)) global is_save is_save = True @@ -289,13 +293,13 @@ def __main__(): def SaveAsProject(): # 另存为项目 - fn = tkinter.filedialog.asksaveasfilename(title=READABLETEXT[5], initialdir=r'./', filetypes=[("音·创工程文件", '.msct'), ("任意类型", '*')], defaultextension='Noname.msct') + fn = tkinter.filedialog.asksaveasfilename(title=READABLETEXT[5], initialdir=r'./', filetypes=[(READABLETEXT[108], '.msct'), (READABLETEXT[109], '*')], defaultextension='Noname.msct') if fn == None or fn =='': return ProjectName = fn with open(ProjectName, 'w', encoding='utf-8') as f: json.dump(dataset[0], f) - tkinter.messagebox.showinfo(title=READABLETEXT[4], message="项目已经存储至:{}".format(ProjectName)) + tkinter.messagebox.showinfo(title=READABLETEXT[4], message=READABLETEXT[107].format(ProjectName)) global is_save is_save = True @@ -306,10 +310,10 @@ def __main__(): def openOldProject(): global is_save if is_save != True: - result = tkinter.messagebox.askyesno(title=READABLETEXT[1], message="您当前的项目已修改但未存储,是否先保存当前项目?") + result = tkinter.messagebox.askyesno(title=READABLETEXT[1], message=READABLETEXT[106]) if result: SaveProject() - fn = tkinter.filedialog.askopenfilename(title=READABLETEXT[6], initialdir=r'./', filetypes=[("函数音创工程文件", '.ry.nfc'), ("MMFM0.0.6版本工程文件", '.ry.mfm'), ("全部类型", '*')], multiple=True) + fn = tkinter.filedialog.askopenfilename(title=READABLETEXT[6], initialdir=r'./', filetypes=[(READABLETEXT[110], '.ry.nfc'), (READABLETEXT[111], '.ry.mfm'), (READABLETEXT[112], '*')], multiple=True) if fn == None or fn == '': return else: @@ -322,10 +326,10 @@ def __main__(): def openProject(): global is_save if is_save != True: - result = tkinter.messagebox.askyesno(title=READABLETEXT[1], message="您当前的项目已修改但未存储,是否先保存当前项目?") + result = tkinter.messagebox.askyesno(title=READABLETEXT[1], message=READABLETEXT[106]) if result: SaveProject() - fn = tkinter.filedialog.askopenfilename(title=READABLETEXT[7], initialdir=r'./', filetypes=[("音·创工程文件", '.msct'),("全部类型", '*')], multiple=True) + fn = tkinter.filedialog.askopenfilename(title=READABLETEXT[7], initialdir=r'./', filetypes=[(READABLETEXT[108], '.msct'),(READABLETEXT[112], '*')], multiple=True) if fn == None or fn == '': return else: @@ -353,7 +357,7 @@ def __main__(): def appabout(): aabw = tk.Tk() aabw.title(READABLETEXT[9]) - aabw.geometry('400x600') # 像素 + aabw.geometry('550x600') # 像素 tk.Label(aabw, text='', font=('', 15)).pack() tk.Label(aabw, text=READABLETEXT[10], font=('', 35)).pack() tk.Label(aabw, text=READABLETEXT[11].format(VER[1]+VER[0]), font=('', 15)).pack() @@ -365,13 +369,18 @@ def __main__(): #del pic tk.Label(aabw, text='', font=('', 5)).pack() tk.Label(aabw, text=READABLETEXT[12], font=('', 20)).pack() - tk.Label(aabw, text=READABLETEXT[13], font=('', 20)).pack() - tk.Label(aabw, text=READABLETEXT[14], font=('', 20)).pack() tk.Label(aabw, text='', font=('', 15)).pack() - tk.Label(aabw, text=READABLETEXT[15], font=('', 15)).pack() - tk.Label(aabw, text=READABLETEXT[16], font=('', 15)).pack() - tk.Label(aabw, text=READABLETEXT[17], font=('', 15)).pack() - tk.Label(aabw, text=READABLETEXT[18], font=('', 15)).pack() + for i in READABLETEXT[15]: + tk.Label(aabw, text=i[0], font=('', 17 if i[1] else 15,'bold' if i[1] else '')).pack() + tk.Label(aabw, text='', font=('', 5)).pack() + if DEFAULTLANGUAGE != 'zh-CN': + tk.Label(aabw, text=READABLETEXT[16], font=('', 15)).pack() + for i in READABLETEXT['Translator']: + tk.Label(aabw, text=i[0], font=('', 17 if i[1] else 15,'bold' if i[1] else '')).pack() + def exitAboutWindow(): + aabw.destroy() + + tk.Button(aabw,text=READABLETEXT[13],command=exitAboutWindow).pack() aabw.mainloop() @@ -392,7 +401,7 @@ def __main__(): def FromMP3(): log('从MP3导入音乐') - mp3file = tkinter.filedialog.askopenfilename(title=READABLETEXT[20], initialdir=r'./', filetypes=[("钢琴声音的音频文件", '.mp3 .m4a'), ("全部类型", '*')], multiple=True) + mp3file = tkinter.filedialog.askopenfilename(title=READABLETEXT[20], initialdir=r'./', filetypes=[(READABLETEXT[113], '.mp3 .m4a'), (READABLETEXT[112], '*')], multiple=True) if mp3file == None or mp3file == '': log('取消') return @@ -426,7 +435,7 @@ def __main__(): def FromMidi(): log('从midi导入音乐') - midfile = tkinter.filedialog.askopenfilename(title=READABLETEXT[21], initialdir=r'./', filetypes=[("Midi文件", '.mid .midi'), ("全部类型", '*')], multiple=True) + midfile = tkinter.filedialog.askopenfilename(title=READABLETEXT[21], initialdir=r'./', filetypes=[(READABLETEXT[114], '.mid .midi'), (READABLETEXT[112], '*')], multiple=True) if midfile == None or midfile == '': log('取消') return @@ -455,7 +464,7 @@ def __main__(): def FromForm(): log('从文本读入音轨') - fn = tkinter.filedialog.askopenfilename(title=READABLETEXT[22], initialdir=r'./', filetypes=[("文本文件", '.txt'), ("全部类型", '*')], multiple=True) + fn = tkinter.filedialog.askopenfilename(title=READABLETEXT[22], initialdir=r'./', filetypes=[(READABLETEXT[115], '.txt'), (READABLETEXT[112], '*')], multiple=True) if fn == None or fn =='': log('取消') return @@ -482,7 +491,7 @@ def __main__(): def FromText(): log('写入音符至音轨') - dat = tkinter.simpledialog.askstring(title=READABLETEXT[23], prompt="请输入音符:", initialvalue='`1 .2 C') + dat = tkinter.simpledialog.askstring(title=READABLETEXT[23], prompt=READABLETEXT[14], initialvalue='`1 .2 C') if dat == None: return datas = [] @@ -571,12 +580,12 @@ def __main__(): from nmcsup.trans import Cmd2World, Datas2BlkWorld, Notes2Player while True: try: - dire = tkinter.simpledialog.askstring(title = READABLETEXT[28],prompt="请输入坐标:",initialvalue = '16 4 16') + dire = tkinter.simpledialog.askstring(title = READABLETEXT[28],prompt=READABLETEXT[116],initialvalue = '16 4 16') if dire == None or dire == '': return dire = [int(dire.split(' ')[0]), int(dire.split(' ')[1]), int(dire.split(' ')[2])] except: - tkinter.messagebox.showerror(title=READABLETEXT[0], message="您输入的格式有误,请重新输入!") + tkinter.messagebox.showerror(title=READABLETEXT[0], message=READABLETEXT[117]) continue break Outdire = tkinter.filedialog.askdirectory(title=READABLETEXT[29], initialdir=r'./') @@ -604,12 +613,12 @@ def __main__(): from nmcsup.trans import Cmd2World, Datas2BlkWorld, Notes2Player while True: try: - dire = tkinter.simpledialog.askstring(title = READABLETEXT[28],prompt="请输入坐标:",initialvalue = '16 4 16') + dire = tkinter.simpledialog.askstring(title = READABLETEXT[28],prompt=READABLETEXT[116],initialvalue = '16 4 16') if dire == None or dire == '': - return; + return dire = [int(dire.split(' ')[0]), int(dire.split(' ')[1]), int(dire.split(' ')[2])] except: - tkinter.messagebox.showerror(title=READABLETEXT[0], message="您输入的格式有误,请重新输入!") + tkinter.messagebox.showerror(title=READABLETEXT[0], message=READABLETEXT[117]) continue break Outdire = tkinter.filedialog.askdirectory(title=READABLETEXT[29], initialdir=r'./') @@ -634,17 +643,17 @@ def __main__(): def MakeFuncPlayer(): while True: try: - dire = tkinter.simpledialog.askstring(title = READABLETEXT[28],prompt="请输入坐标:",initialvalue = '16 4 16') + dire = tkinter.simpledialog.askstring(title = READABLETEXT[28],prompt=READABLETEXT[116],initialvalue = '16 4 16') if dire == None or dire == '': - return; + return dire = [int(dire.split(' ')[0]), int(dire.split(' ')[1]), int(dire.split(' ')[2])] except: - tkinter.messagebox.showerror(title=READABLETEXT[0], message="您输入的格式有误,请重新输入!"); + tkinter.messagebox.showerror(title=READABLETEXT[0], message=READABLETEXT[117]) continue break - Outdire = tkinter.filedialog.askdirectory(title=READABLETEXT[30], initialdir=r'./'); + Outdire = tkinter.filedialog.askdirectory(title=READABLETEXT[30], initialdir=r'./') if Outdire == None or Outdire == '': - return; + return else: Outdire = '{}/{}/'.format(Outdire,dataset[0]['mainset']['PackName']) from nmcsup.trans import Notes2Player @@ -662,21 +671,21 @@ def __main__(): from nmcsup.trans import Cmd2World, Note2Cmd while True: try: - dire = tkinter.simpledialog.askstring(title = READABLETEXT[28],prompt="请输入坐标:",initialvalue = '16 4 16'); + dire = tkinter.simpledialog.askstring(title = READABLETEXT[28],prompt=READABLETEXT[116],initialvalue = '16 4 16') if dire == None or dire == '': - return; - dire = [int(dire.split(' ')[0]), int(dire.split(' ')[1]), int(dire.split(' ')[2])]; + return + dire = [int(dire.split(' ')[0]), int(dire.split(' ')[1]), int(dire.split(' ')[2])] except: - tkinter.messagebox.showerror(title=READABLETEXT[0], message="您输入的格式有误,请重新输入!"); - continue; - break; - Outdire = tkinter.filedialog.askdirectory(title=READABLETEXT[29], initialdir=r'./'); + tkinter.messagebox.showerror(title=READABLETEXT[0], message=READABLETEXT[117]) + continue + break + Outdire = tkinter.filedialog.askdirectory(title=READABLETEXT[29], initialdir=r'./') if Outdire == None or Outdire == '': - return; + return else: - Outdire+='/'+dataset[0]['mainset']['PackName']+'/'; + Outdire+='/'+dataset[0]['mainset']['PackName']+'/' with zipfile.ZipFile('./nmcsup/EptWorld.zip', 'r') as zipobj: - zipobj.extractall(Outdire); + zipobj.extractall(Outdire) for i in range(len(dataset[0]['musics'])): Cmd2World(Note2Cmd(dataset[0]['musics'][i]['notes'],dataset[0]['musics'][i]['set']['ScoreboardName'],dataset[0]['musics'][i]['set']['Instrument'],dataset[0]['mainset']['PlayerSelect'],True),Outdire,[dire[0],dire[1],dire[2]+i]) del dire,Outdire @@ -688,15 +697,15 @@ def __main__(): from nmcsup.trans import Cmd2World, Note2Cmd while True: try: - dire = tkinter.simpledialog.askstring(title = READABLETEXT[28],prompt="请输入坐标:",initialvalue = '16 4 16') + dire = tkinter.simpledialog.askstring(title = READABLETEXT[28],prompt=READABLETEXT[116],initialvalue = '16 4 16') if dire == None or dire == '': - return; + return dire = [int(dire.split(' ')[0]), int(dire.split(' ')[1]), int(dire.split(' ')[2])] except: - tkinter.messagebox.showerror(title=READABLETEXT[0], message="您输入的格式有误,请重新输入!"); + tkinter.messagebox.showerror(title=READABLETEXT[0], message=READABLETEXT[117]) continue break - Outdire = tkinter.filedialog.askdirectory(title=READABLETEXT[29], initialdir=r'./'); + Outdire = tkinter.filedialog.askdirectory(title=READABLETEXT[29], initialdir=r'./') if Outdire == None or Outdire == '': return else: @@ -714,20 +723,20 @@ def __main__(): from nmcsup.trans import Cmd2World while True: try: - dire = tkinter.simpledialog.askstring(title = READABLETEXT[28],prompt="请输入坐标:",initialvalue = '16 4 16') + dire = tkinter.simpledialog.askstring(title = READABLETEXT[28],prompt=READABLETEXT[116],initialvalue = '16 4 16') if dire == None or dire == '': - return; + return dire = [int(dire.split(' ')[0]), int(dire.split(' ')[1]), int(dire.split(' ')[2])] except: - tkinter.messagebox.showerror(title=READABLETEXT[0], message="您输入的格式有误,请重新输入!"); + tkinter.messagebox.showerror(title=READABLETEXT[0], message=READABLETEXT[117]) continue break - Outdire = tkinter.filedialog.askdirectory(title=READABLETEXT[29], initialdir=r'./'); + Outdire = tkinter.filedialog.askdirectory(title=READABLETEXT[29], initialdir=r'./') if Outdire == None or Outdire == '': - return; + return else: - Outdire+='/'; - Cmd2World(open(tkinter.filedialog.askopenfilename(title=READABLETEXT[31], initialdir=r'./', filetypes=[("我的世界指令函数文件", '.mcfunction'), ("全部类型", '*')], multiple=True)[0],'r',encoding='utf-8').readlines(),Outdire,dire) + Outdire+='/' + Cmd2World(open(tkinter.filedialog.askopenfilename(title=READABLETEXT[31], initialdir=r'./', filetypes=[(READABLETEXT[118], '.mcfunction'), (READABLETEXT[112], '*')], multiple=True)[0],'r',encoding='utf-8').readlines(),Outdire,dire) @@ -742,38 +751,38 @@ def __main__(): from nmcsup.trans import Cmd2World while True: try: - dire = tkinter.simpledialog.askstring(title = READABLETEXT[28],prompt="请输入执行链生成坐标:",initialvalue = '16 4 16'); + dire = tkinter.simpledialog.askstring(title = READABLETEXT[28],prompt=READABLETEXT[119],initialvalue = '16 4 16') if dire == None or dire == '': - return; - dire = [int(dire.split(' ')[0]), int(dire.split(' ')[1]), int(dire.split(' ')[2])]; + return + dire = [int(dire.split(' ')[0]), int(dire.split(' ')[1]), int(dire.split(' ')[2])] except: - tkinter.messagebox.showerror(title=READABLETEXT[0], message="您输入的格式有误,请重新输入。"); + tkinter.messagebox.showerror(title=READABLETEXT[0], message=READABLETEXT[120]) continue break - Outdire = tkinter.filedialog.askdirectory(title=READABLETEXT[29], initialdir=r'./'); + Outdire = tkinter.filedialog.askdirectory(title=READABLETEXT[29], initialdir=r'./') if Outdire == None or Outdire == '': log('取消') return else: - Outdire+='/'; + Outdire+='/' log('获得地图地址:'+Outdire) - fileName = tkinter.filedialog.askopenfilename(title=READABLETEXT[31], initialdir=r'./', filetypes=[("我的世界指令函数文件", '.mcfunction'), ("全部类型", '*')], multiple=True) + fileName = tkinter.filedialog.askopenfilename(title=READABLETEXT[31], initialdir=r'./', filetypes=[(READABLETEXT[118], '.mcfunction'), (READABLETEXT[112], '*')], multiple=True) if fileName == None or fileName == '': log('取消') - return; + return else: fileName = fileName[0] log('获得文件名:'+fileName) bigFile = open(fileName,'r',encoding='utf-8') parts = funSplit(bigFile) if parts == -1: - tkinter.messagebox.showerror(title=READABLETEXT[0], message="您的函数文件不大于一万条指令,无需进行分割操作。"); - return; + tkinter.messagebox.showerror(title=READABLETEXT[0], message=READABLETEXT[121]) + return log('创建函数文件夹') packName = fileName[len(fileName)-fileName[::-1].index('/'):fileName.index('.')] packDire = hans2pinyin(packName) try: - os.makedirs(Outdire+'behavior_packs/'+packDire+'/functions/'); + os.makedirs(Outdire+'behavior_packs/'+packDire+'/functions/') except: log('已存在文件夹') log('创建manifest.json以及world_behavior_packs.json') @@ -792,7 +801,7 @@ def __main__(): f.write('{\n \'format_version\': 1,\n \'header\': {\n \'description\': \''+packName+' Pack : behavior pack\',\n \'version\': [ 0, 0, 1 ],\n \'name\': \''+packName+'Pack\',\n \'uuid\': \'' + str(behaviorUuid) + '\'\n },\n \'modules\': [\n {\n \'description\': \''+packName+' Pack : behavior pack\',\n \'type\': \'data\',\n \'version\': [ 0, 0, 1 ],\n \'uuid\': \'' + str(uuid.uuid4()) + '\'\n }\n ]\n}') cmdlist = [] for i in parts : - open(Outdire+'behavior_packs/'+packDire+'/functions/'+packDire+str(parts.index(i)+1)+'.mcfunction','w',encoding='utf-8').writelines(i); + open(Outdire+'behavior_packs/'+packDire+'/functions/'+packDire+str(parts.index(i)+1)+'.mcfunction','w',encoding='utf-8').writelines(i) cmdlist.append('function '+packDire+str(parts.index(i)+1)) Cmd2World(cmdlist,Outdire,dire) del cmdlist,behaviorUuid,Outdire,fileName,bigFile,parts,dire,packName,packDire @@ -804,33 +813,33 @@ def __main__(): from msctspt.transfer import note2bdx while True: try: - dire = tkinter.simpledialog.askstring(title = READABLETEXT[28],prompt="请输入执行链生成相对坐标:",initialvalue = '0 0 0'); + dire = tkinter.simpledialog.askstring(title = READABLETEXT[28],prompt=READABLETEXT[122],initialvalue = '0 0 0') if dire == None or dire == '': - return; - dire = [int(dire.split(' ')[0]), int(dire.split(' ')[1]), int(dire.split(' ')[2])]; + return + dire = [int(dire.split(' ')[0]), int(dire.split(' ')[1]), int(dire.split(' ')[2])] except: - tkinter.messagebox.showerror(title=READABLETEXT[0], message="您输入的格式有误,请重新输入。"); + tkinter.messagebox.showerror(title=READABLETEXT[0], message=READABLETEXT[120]) continue break - fileName = tkinter.filedialog.asksaveasfilename(title=READABLETEXT[32], initialdir=r'./', filetypes=[("FastBuilder结构文件", '.bdx'), ("全部类型", '*')], defaultextension=dataset[0]['mainset']['PackName']+'.bdx',initialfile=dataset[0]['mainset']['PackName']+'.bdx') + fileName = tkinter.filedialog.asksaveasfilename(title=READABLETEXT[32], initialdir=r'./', filetypes=[(READABLETEXT[123], '.bdx'), (READABLETEXT[112], '*')], defaultextension=dataset[0]['mainset']['PackName']+'.bdx',initialfile=dataset[0]['mainset']['PackName']+'.bdx') if fileName == None or fileName == '': log('取消') - return; + return log('获得文件名:'+fileName) res = note2bdx(fileName,dire,dataset[0]['musics'][NowMusic]['notes'],dataset[0]['musics'][NowMusic]['set']['ScoreboardName'],dataset[0]['musics'][NowMusic]['set']['Instrument'],dataset[0]['mainset']['PlayerSelect']) log('转换结束!\n'+str(res)) - tkinter.messagebox.showinfo(READABLETEXT[33],"转换结束!\n{}".format(str(res))) + tkinter.messagebox.showinfo(READABLETEXT[33],READABLETEXT[124].format(str(res))) def wsPlay(): from msctspt.transfer import note2webs - spd = tkinter.simpledialog.askfloat(READABLETEXT[34],prompt="一秒,音乐走几拍?",initialvalue = '5.0') - tkinter.messagebox.showinfo(title=READABLETEXT[35], message="按下确认后,在游戏中使用connect指令连接localhost:8080,即可播放") + spd = tkinter.simpledialog.askfloat(READABLETEXT[34],prompt=READABLETEXT[125],initialvalue = '5.0') + tkinter.messagebox.showinfo(title=READABLETEXT[35], message=READABLETEXT[126]) note2webs(dataset[0]['musics'][NowMusic]['notes'],dataset[0]['musics'][NowMusic]['set']['Instrument'],spd,dataset[0]['mainset']['PlayerSelect']) @@ -843,25 +852,25 @@ def __main__(): from msctspt.transfer import note2RSworld while True: try: - dire = tkinter.simpledialog.askstring(title = READABLETEXT[28],prompt="请输入坐标:",initialvalue = '16 4 16'); + dire = tkinter.simpledialog.askstring(title = READABLETEXT[28],prompt=READABLETEXT[116],initialvalue = '16 4 16') if dire == None or dire == '': - return; - dire = [int(dire.split(' ')[0]), int(dire.split(' ')[1]), int(dire.split(' ')[2])]; + return + dire = [int(dire.split(' ')[0]), int(dire.split(' ')[1]), int(dire.split(' ')[2])] except: - tkinter.messagebox.showerror(title=READABLETEXT[0], message="您输入的格式有误,请重新输入!"); - continue; - break; - Outdire = tkinter.filedialog.askdirectory(title=READABLETEXT[29], initialdir=r'./'); + tkinter.messagebox.showerror(title=READABLETEXT[0], message=READABLETEXT[117]) + continue + break + Outdire = tkinter.filedialog.askdirectory(title=READABLETEXT[29], initialdir=r'./') if Outdire == None or Outdire == '': - return; + return else: - Outdire+='/'+dataset[0]['mainset']['PackName']+'/'; + Outdire+='/'+dataset[0]['mainset']['PackName']+'/' with zipfile.ZipFile('./nmcsup/EptWorld.zip', 'r') as zipobj: - zipobj.extractall(Outdire); + zipobj.extractall(Outdire) for i in range(len(dataset[0]['musics'])): note2RSworld(Outdire,dire,dataset[0]['musics'][i]['notes'],dataset[0]['musics'][i]['set']['Instrument']) - del dire,Outdire; + del dire,Outdire @@ -869,54 +878,54 @@ def __main__(): from msctspt.transfer import note2RSworld while True: try: - dire = tkinter.simpledialog.askstring(title = READABLETEXT[28],prompt="请输入坐标:",initialvalue = '16 4 16') + dire = tkinter.simpledialog.askstring(title = READABLETEXT[28],prompt=READABLETEXT[116],initialvalue = '16 4 16') if dire == None or dire == '': - return; + return dire = [int(dire.split(' ')[0]), int(dire.split(' ')[1]), int(dire.split(' ')[2])] except: - tkinter.messagebox.showerror(title=READABLETEXT[0], message="您输入的格式有误,请重新输入!"); + tkinter.messagebox.showerror(title=READABLETEXT[0], message=READABLETEXT[117]) continue break - Outdire = tkinter.filedialog.askdirectory(title=READABLETEXT[29], initialdir=r'./'); + Outdire = tkinter.filedialog.askdirectory(title=READABLETEXT[29], initialdir=r'./') if Outdire == None or Outdire == '': - return; + return else: - Outdire+='/'; + Outdire+='/' for i in range(len(dataset[0]['musics'])): note2RSworld(Outdire,dire,dataset[0]['musics'][i]['notes'],dataset[0]['musics'][i]['set']['Instrument']) - del dire,Outdire; + del dire,Outdire def world2RyStruct(): - outdir = tkinter.filedialog.askdirectory(title=READABLETEXT[36], initialdir=r'./'); + outdir = tkinter.filedialog.askdirectory(title=READABLETEXT[36], initialdir=r'./') if outdir == None or outdir == '': - return; + return else: - outdir+='/'; + outdir+='/' while True: try: - begp = tkinter.simpledialog.askstring(title = READABLETEXT[28],prompt="请输入区域选择的开始坐标:",initialvalue = '16 4 16') + begp = tkinter.simpledialog.askstring(title = READABLETEXT[28],prompt=READABLETEXT[127],initialvalue = '16 4 16') if begp == None or begp == '': - return; + return begp = [int(begp.split(' ')[0]), int(begp.split(' ')[1]), int(begp.split(' ')[2])] except: - tkinter.messagebox.showerror(title=READABLETEXT[0], message="您输入的格式有误,请重新输入!"); + tkinter.messagebox.showerror(title=READABLETEXT[0], message=READABLETEXT[117]) continue break while True: try: - endp = tkinter.simpledialog.askstring(title = READABLETEXT[28],prompt="请输入区域选择的结束坐标:",initialvalue = '16 4 16') + endp = tkinter.simpledialog.askstring(title = READABLETEXT[28],prompt=READABLETEXT[128],initialvalue = '16 4 16') if endp == None or endp == '': - return; + return endp = [int(endp.split(' ')[0]), int(endp.split(' ')[1]), int(endp.split(' ')[2])] except: - tkinter.messagebox.showerror(title=READABLETEXT[0], message="您输入的格式有误,请重新输入!"); + tkinter.messagebox.showerror(title=READABLETEXT[0], message=READABLETEXT[117]) continue break - isAir = tkinter.messagebox.askyesno(READABLETEXT[37],"所选区块导出时是否需要保留空气方块?") - fileName = tkinter.filedialog.asksaveasfilename(title=READABLETEXT[38], initialdir=r'./', filetypes=[("音·创结构文件", '.RyStruct'), ("全部类型", '*')], defaultextension='*.RyStruct',initialfile='*.RyStruct') + isAir = tkinter.messagebox.askyesno(READABLETEXT[37],READABLETEXT[129]) + fileName = tkinter.filedialog.asksaveasfilename(title=READABLETEXT[38], initialdir=r'./', filetypes=[(READABLETEXT[130], '.RyStruct'), (READABLETEXT[112], '*')], defaultextension='*.RyStruct',initialfile='*.RyStruct') if fileName == None or fileName == '': log('取消') return @@ -926,15 +935,15 @@ def __main__(): try: with open(fileName,'w',encoding='utf-8') as f: json.dump(rys.RyStruct,f,sort_keys=True, indent=4, separators=(', ', ': '), ensure_ascii=False) - tkinter.messagebox.showinfo(READABLETEXT[33],"文件已生成\n{}".format(fileName)) + tkinter.messagebox.showinfo(READABLETEXT[33],READABLETEXT[131].format(fileName)) except: - tkinter.messagebox.showerror(READABLETEXT[39],"文件无法生成\n{}\n{}".format(fileName,str(rys.RyStruct))) + tkinter.messagebox.showerror(READABLETEXT[39],READABLETEXT[132].format(fileName,str(rys.RyStruct))) rys.closeLevel() def world2BDX(): - tkinter.messagebox.showerror(READABLETEXT[0],"本功能尚未开发。") + tkinter.messagebox.showerror(READABLETEXT[0],READABLETEXT[133]) @@ -952,9 +961,9 @@ def __main__(): #使用邮件反馈bug def sendBugReport(): from msctspt.bugReporter import report - name = tkinter.simpledialog.askstring(title = READABLETEXT[40],prompt="您的称呼") - contact = tkinter.simpledialog.askstring(title = READABLETEXT[40],prompt="您的联系方式") - describetion = tkinter.simpledialog.askstring(title = READABLETEXT[40],prompt="您对问题的描述") + name = tkinter.simpledialog.askstring(title = READABLETEXT[40],prompt=READABLETEXT[134]) + contact = tkinter.simpledialog.askstring(title = READABLETEXT[40],prompt=READABLETEXT[135]) + describetion = tkinter.simpledialog.askstring(title = READABLETEXT[40],prompt=READABLETEXT[136]) report(name,contact,describetion).emailReport() del name,contact,describetion @@ -969,12 +978,12 @@ def __main__(): def ClearLog(): - global clearLog; - clearLog = not clearLog; + global clearLog + clearLog = not clearLog if clearLog: - tkinter.messagebox.showinfo(READABLETEXT[33],"在程序结束后将清除日志及临时文件信息。") + tkinter.messagebox.showinfo(READABLETEXT[33],READABLETEXT[137]) else: - tkinter.messagebox.showinfo(READABLETEXT[33],"在程序结束后将不会清除日志及临时文件信息。") + tkinter.messagebox.showinfo(READABLETEXT[33],READABLETEXT[138]) @@ -1052,7 +1061,7 @@ def __main__(): def changePackName(event): - a = tkinter.simpledialog.askstring(title=READABLETEXT[50], prompt="修改包名", initialvalue='Ryoun') + a = tkinter.simpledialog.askstring(title=READABLETEXT[50], prompt=READABLETEXT[139], initialvalue='Ryoun') if a == None: return dataset[0]['mainset']['PackName'] = a @@ -1061,7 +1070,7 @@ def __main__(): def changeMusicTitle(event): - a = tkinter.simpledialog.askstring(title=READABLETEXT[50], prompt="修改音乐标题", initialvalue='Noname') + a = tkinter.simpledialog.askstring(title=READABLETEXT[50], prompt=READABLETEXT[140], initialvalue='Noname') if a == None: return dataset[0]['mainset']['MusicTitle'] = a @@ -1074,7 +1083,7 @@ def __main__(): def changePlayerSelect(event): - dataset[0]['mainset']['PlayerSelect'] = tkinter.simpledialog.askstring(title=READABLETEXT[50], prompt="修改玩家选择器\n注意!要加上中括号“[]”", initialvalue='') + dataset[0]['mainset']['PlayerSelect'] = tkinter.simpledialog.askstring(title=READABLETEXT[50], prompt=READABLETEXT[141], initialvalue='') if dataset[0]['mainset']['PlayerSelect'] == None: dataset[0]['mainset']['PlayerSelect'] = '' RefreshMain() @@ -1082,7 +1091,7 @@ def __main__(): def changeEntityName(event): global NowMusic - a = tkinter.simpledialog.askstring(title=READABLETEXT[51], prompt="修改本音轨的执行实体名", initialvalue='musicSupport') + a = tkinter.simpledialog.askstring(title=READABLETEXT[51], prompt=READABLETEXT[142], initialvalue='musicSupport') if a == None: return dataset[0]['musics'][NowMusic]['set']['EntityName'] = a @@ -1091,7 +1100,7 @@ def __main__(): def changeScoreboardName(event): global NowMusic - a = tkinter.simpledialog.askstring(title=READABLETEXT[51], prompt="修改本音轨所用的积分板", initialvalue='musicSupport') + a = tkinter.simpledialog.askstring(title=READABLETEXT[51], prompt=READABLETEXT[143], initialvalue='musicSupport') if a == None: return dataset[0]['musics'][NowMusic]['set']['ScoreboardName'] = a @@ -1102,9 +1111,9 @@ def __main__(): from nmcsup.const import Instuments as inst global NowMusic while(True): - instemp = tkinter.simpledialog.askstring(title=READABLETEXT[51], prompt="修改本音轨所用乐器", initialvalue='note.harp') + instemp = tkinter.simpledialog.askstring(title=READABLETEXT[51], prompt=READABLETEXT[144], initialvalue='note.harp') if not instemp in inst.keys(): - if tkinter.messagebox.askyesno(title=READABLETEXT[1], message="您输入的乐器并非游戏内置乐器,是否继续用您输入的字符作为乐器?"): + if tkinter.messagebox.askyesno(title=READABLETEXT[1], message=READABLETEXT[145]): dataset[0]['musics'][NowMusic]['set']['Instrument'] = instemp del instemp break @@ -1123,7 +1132,7 @@ def __main__(): def changeFileName(event): global NowMusic - a = tkinter.simpledialog.askstring(title=READABLETEXT[51], prompt="修改本音轨生成的文件名", initialvalue='Music') + a = tkinter.simpledialog.askstring(title=READABLETEXT[51], prompt=READABLETEXT[146], initialvalue='Music') if a == None: return dataset[0]['musics'][NowMusic]['set']['FileName'] = a @@ -1199,31 +1208,31 @@ def __main__(): #创建世界菜单 - worldmenu = tk.Menu(main_menu_bar, tearoff=0); - worldmenu.add_command(label=READABLETEXT[68], command=ToBlockWorldEpt); - worldmenu.add_command(label=READABLETEXT[69], command=ToBlockWorld); + worldmenu = tk.Menu(main_menu_bar, tearoff=0) + worldmenu.add_command(label=READABLETEXT[68], command=ToBlockWorldEpt) + worldmenu.add_command(label=READABLETEXT[69], command=ToBlockWorld) worldmenu.add_separator() - worldmenu.add_command(label=READABLETEXT[70], command=ToCmdWorldEpt); - worldmenu.add_command(label=READABLETEXT[71], command=ToCmdWorld); + worldmenu.add_command(label=READABLETEXT[70], command=ToCmdWorldEpt) + worldmenu.add_command(label=READABLETEXT[71], command=ToCmdWorld) worldmenu.add_separator() - worldmenu.add_command(label=READABLETEXT[72], command=toRSworldEPT); - worldmenu.add_command(label=READABLETEXT[73], command=toRSworld); + worldmenu.add_command(label=READABLETEXT[72], command=toRSworldEPT) + worldmenu.add_command(label=READABLETEXT[73], command=toRSworld) # 将子菜单加入到菜单条中 - main_menu_bar.add_cascade(label=READABLETEXT[74], menu=worldmenu); + main_menu_bar.add_cascade(label=READABLETEXT[74], menu=worldmenu) # 创建其他功能菜单 otherMenu = tk.Menu(main_menu_bar, tearoff=0) otherMenu.add_command(label=READABLETEXT[75], command=MakeFuncPlayer) - otherMenu.add_separator(); + otherMenu.add_separator() otherMenu.add_command(label=READABLETEXT[76], command=toScbBDXfile) otherMenu.add_command(label=READABLETEXT[77], command=world2BDX) otherMenu.add_command(label=READABLETEXT[78], command=world2RyStruct) - otherMenu.add_separator(); - otherMenu.add_command(label=READABLETEXT[79], command=func2World); - otherMenu.add_command(label=READABLETEXT[80], command=bigFunc2World); + otherMenu.add_separator() + otherMenu.add_command(label=READABLETEXT[79], command=func2World) + otherMenu.add_command(label=READABLETEXT[80], command=bigFunc2World) - main_menu_bar.add_cascade(label=READABLETEXT[81], menu=otherMenu); + main_menu_bar.add_cascade(label=READABLETEXT[81], menu=otherMenu) # 创建实验功能菜单 @@ -1265,10 +1274,10 @@ def __main__(): # 大标题 tk.Label(UpLeftFrame, text=READABLETEXT[91], font=('', 20)).pack() # 按钮式文本 - LabelPackName = tk.Label(UpLeftFrame, bg='white', text=READABLETEXT[92], font=('', 15)) - LabelMusicTitle = tk.Label(UpLeftFrame, bg='white',text=READABLETEXT[93], font=('', 15)) - LabelIsRepeat = tk.Label(UpLeftFrame, bg='white', text=READABLETEXT[94], font=('', 15)) - LabelPlayerSelect = tk.Label(UpLeftFrame, bg='white', text=READABLETEXT[95], font=('', 15)) + LabelPackName = tk.Label(UpLeftFrame, bg='white', text=READABLETEXT[46], font=('', 15)) + LabelMusicTitle = tk.Label(UpLeftFrame, bg='white',text=READABLETEXT[47], font=('', 15)) + LabelIsRepeat = tk.Label(UpLeftFrame, bg='white', text=READABLETEXT[48], font=('', 15)) + LabelPlayerSelect = tk.Label(UpLeftFrame, bg='white', text=READABLETEXT[49], font=('', 15)) # 绑定按钮 LabelPackName.bind('', changePackName) LabelMusicTitle.bind('', changeMusicTitle) @@ -1306,10 +1315,10 @@ def __main__(): # 大标题 tk.Label(UpRightFrame, text=READABLETEXT[97], font=('', 20)).pack() # 按钮式文本 - LabelEntityName = tk.Label(UpRightFrame, bg='white',text=READABLETEXT[98], font=('', 15)) - LabelScoreboardName = tk.Label(UpRightFrame, bg='white', text=READABLETEXT[99], font=('', 15)) - LabelInstrument = tk.Label(UpRightFrame, bg='white',text=READABLETEXT[100], font=('', 15)) - LabelFileName = tk.Label(UpRightFrame, bg='white',text=READABLETEXT[101], font=('', 15)) + LabelEntityName = tk.Label(UpRightFrame, bg='white',text=READABLETEXT[42], font=('', 15)) + LabelScoreboardName = tk.Label(UpRightFrame, bg='white', text=READABLETEXT[43], font=('', 15)) + LabelInstrument = tk.Label(UpRightFrame, bg='white',text=READABLETEXT[44], font=('', 15)) + LabelFileName = tk.Label(UpRightFrame, bg='white',text=READABLETEXT[45], font=('', 15)) # 绑定按钮 LabelEntityName.bind('', changeEntityName) LabelScoreboardName.bind('', changeScoreboardName) @@ -1399,6 +1408,6 @@ def __main__(): if __name__ == '__main__': - __main__(); + __main__() diff --git a/Musicreater_ONLY DEV.py b/Musicreater_ONLY DEV.py deleted file mode 100644 index dad9ea2..0000000 --- a/Musicreater_ONLY DEV.py +++ /dev/null @@ -1,1391 +0,0 @@ -# -*- coding: utf-8 -*- -#! python3 - -# W-YI 金羿 -# QQ 2647547478 -# 音·创 开发交流群 861684859 -# Email EillesWan2006@163.com W-YI_DoctorYI@outlook.com EillesWan@outlook.com -# 版权所有 Team-Ryoun 金羿 -# 若需转载或借鉴 请附作者 - - -# 代码写的并非十分的漂亮,还请大佬多多包涵;本软件源代码依照Apache软件协议公开 - -import json -import os -import shutil -import sys -import threading -import tkinter as tk -import tkinter.filedialog -import tkinter.messagebox -import tkinter.simpledialog - -from msctspt.threadOpera import NewThread -from nmcsup.vers import VER - -__version__ = VER[1]+VER[0] -__author__ = 'W-YI (金羿)' - - - - - - - -from languages.lang import READABLETEXT - - - - - - -print('建立变量,存入内存,载入字典常量函数') - - - - -# 主体部分 - -# 支持多文件同时操作 - -# dataset[{ 'mainset':{ 'x':'y' }, 'musics': [ { 'set' :{ 'A':'B' } , 'note' : [ [ 'a' , b ], ] }, ] }, ] - -# 编辑: -# 修改主设置: dataset[第几个项目]['mainset']['什么设置'] = '设置啥' -# 修改音乐: dataset[第几个项目]['musics'][第几个音轨]['notes'][第几个音符][音符还是时间(0,1)] = 改成啥 -# 修改音轨设置: dataset[第几个项目]['musics'][第几个音轨]['set']['什么设置'] = '设置啥' -# -# 新增音轨: dataset[第几个项目]['musics'].append(datasetmodelpart) -# -''' -dataset=[ - { - 'mainset':{ - 'PackName':'Ryoun', - 'MusicTitle':'Noname', - 'IsRepeat':False, - 'PlayerSelect':'' - }, - 'musics':[ - { - 'set':{ - 'EntityName':'music_support', - 'ScoreboardName':'music_support', - 'Instrument':'harp', - 'FileName':'Music' - }, - 'notes':[ - [0.0,1.0], - ] - }, - ], - }, - ] -''' - - - -dataset = [ - { - 'mainset': { - 'PackName': 'Ryoun', - 'MusicTitle': 'Noname', - 'IsRepeat': False, - 'PlayerSelect': '' - }, - 'musics': [ - { - 'set': { - 'EntityName': 'MusicSupport', - 'ScoreboardName': 'MusicSupport', - 'Instrument': 'note.harp', - 'FileName': 'Music' - }, - 'notes': [ - [0.0, 1.0], - ] - }, - ], - }, -] - - -is_new_file = True -is_save = True -ProjectName = '' -clearLog = False; -NowMusic = 0 -root = tk.Tk() - - -def DMM(): # 反回字典用于编辑 - datasetmodelpart = { - 'set': { - 'EntityName': 'MusicSupport', - 'ScoreboardName': 'MusicSupport', - 'Instrument': 'note.harp', - 'FileName': 'Music' - }, - 'notes': [] - } - return datasetmodelpart - - -print('完成') - - - - - - - - - - - -def __main__(): - '''音·创 本体\n - W-YI 金羿\n - QQ 2647547478\n - 音·创 开发交流群 861684859\n - Email EillesWan2006@163.com W-YI_DoctorYI@outlook.com\n - 版权所有 Team-Ryoun 金羿\n - 若需转载或借鉴 请附作者\n - ''' - - print('音·创 正在启动……') - - - - print('载入日志功能...') - from nmcsup.log import log - print('完成!') - - - - print('更新执行位置...') - if sys.platform == 'win32': - try: - os.chdir(__file__[:len(__file__)-__file__[len(__file__)::-1].index('\\')]) - log('更新执行位置,当前文件位置 {}'.format(__file__)) - except: - pass - else: - try: - os.chdir(__file__[:len(__file__)-__file__[len(__file__)::-1].index('/')]) - except: - pass - log('其他平台:{} 更新执行位置,当前文件位置 {}'.format(sys.platform,__file__)) - print('完成!') - - - - - # 读取文件 - - - print('载入文件读取函数') - - def ReadFile(fn:str) -> list: - from nmcsup.nmcreader import ReadFile as fileRead - k = fileRead(fn) - if k == False : - tk.messagebox.showerror(title="错误❌", message="找不到文件😢:{}".format(fn)) - return - else: - return k - - - def ReadMidi(midfile:str) -> str: - from nmcsup.nmcreader import ReadMidi as midiRead - k = midiRead(midfile) - if k == False : - tk.messagebox.showerror(title="错误❌", message="找不到文件或无法读取文件😢:{}".format(midfile)) - return - else: - return k - - - print('完成!') - - - - - # 菜单命令 - print('加载菜单命令...'); - - def exitapp(): - global is_save - if is_save != True: - if tkinter.messagebox.askyesno(title="提示❗", message="您当前的项目已修改但未存储,是否先保存当前项目?"): - SaveProject() - log('程序正常退出') - - - - - try: - global dataset - del dataset - global root - root.destroy() - del root - except: - pass - - - - if clearLog : - print("清除log(此句不载入日志)") - try: - if os.path.exists('./log/'): - shutil.rmtree('./log/') - if os.path.exists('./logs/'): - shutil.rmtree('./logs/') - if os.path.exists('./cache/'): - shutil.rmtree('./cache/') - except: - print("无法清除日志及临时文件") - - - exit() - - - print('退出命令加载完成!') - - - - def SaveProject(): - if is_new_file: - # 新的项目相等于另存为 - SaveAsProject() - return - else: - # 旧项目旧存着吧 - log('存储已有文件:{}'.format(ProjectName)) - with open(ProjectName, 'w', encoding='utf-8') as f: - json.dump(dataset[0], f) - tkinter.messagebox.showinfo(title="已存储", message="项目已经存储至:{}".format(ProjectName)) - global is_save - is_save = True - - - print('保存项目命令加载完成!') - - - def SaveAsProject(): - # 另存为项目 - fn = tkinter.filedialog.asksaveasfilename(title="新建 音·创 项目", initialdir=r'./', filetypes=[("音·创工程文件", '.msct'), ("任意类型", '*')], defaultextension='Noname.msct') - if fn == None or fn =='': - return - ProjectName = fn - with open(ProjectName, 'w', encoding='utf-8') as f: - json.dump(dataset[0], f) - tkinter.messagebox.showinfo(title="已存储", message="项目已经存储至:{}".format(ProjectName)) - global is_save - is_save = True - - - print('另存项目命令加载完成!') - - - def openOldProject(): - global is_save - if is_save != True: - result = tkinter.messagebox.askyesno(title="提示❗", message="您当前的项目已修改但未存储,是否先保存当前项目?") - if result: - SaveProject() - fn = tkinter.filedialog.askopenfilename(title="请选择旧类型的项目", initialdir=r'./', filetypes=[("函数音创工程文件", '.ry.nfc'), ("MMFM0.0.6版本工程文件", '.ry.mfm'), ("全部类型", '*')], multiple=True) - if fn == None or fn == '': - return - else: - fn = fn[0] - from nmcsup.nmcreader import ReadOldProject - dataset[0] = ReadOldProject(fn) - - - - def openProject(): - global is_save - if is_save != True: - result = tkinter.messagebox.askyesno(title="提示❗", message="您当前的项目已修改但未存储,是否先保存当前项目?") - if result: - SaveProject() - fn = tkinter.filedialog.askopenfilename(title="请选择 音·创 项目", initialdir=r'./', filetypes=[("音·创工程文件", '.msct'),("全部类型", '*')], multiple=True) - if fn == None or fn == '': - return - else: - fn = fn[0] - try: - with open(fn, 'r', encoding='UTF-8') as c: - dataset[0] = json.load(c) - except: - print("无法打开文件:{},请查看您是否输入正确".format(fn)) - log('无法打开{}'.format(fn)) - return - global is_new_file - global ProjectName - is_new_file = False - ProjectName = fn - del fn - global NowMusic - RefreshMain() - RefreshMusic(NowMusic) - - print('打开项目命令加载完成!') - - - - def appabout(): - aabw = tk.Tk() - aabw.title("音·创 - 关于") - aabw.geometry('400x600') # 像素 - tk.Label(aabw, text='', font=('', 15)).pack() - tk.Label(aabw, text="我的世界音·创", font=('', 35)).pack() - tk.Label(aabw, text="当前版本:{}".format(VER[1]+VER[0]), font=('', 15)).pack() - # pack 的side可以赋值为LEFT RTGHT TOP BOTTOM - # grid 的row 是列数、column是行排,注意,这是针对空间控件本身大小来的,即是指向当前控件的第几个。 - # place的 x、y是(x,y)坐标 - #pic = tk.PhotoImage(file='./bin/pics/Ryoun_S.png') - #tk.Label(aabw, image=pic, width=200, height=200).pack() - #del pic - tk.Label(aabw, text='', font=('', 5)).pack() - tk.Label(aabw, text="凌云我的世界开发团队", font=('', 20)).pack() - tk.Label(aabw, text="×", font=('', 20)).pack() - tk.Label(aabw, text="凌云软件开发团队", font=('', 20)).pack() - tk.Label(aabw, text='', font=('', 15)).pack() - tk.Label(aabw, text="唯一开发者:金羿(W-YI)", font=('', 15)).pack() - tk.Label(aabw, text="Email: EillesWan@outlook.com", font=('', 15)).pack() - tk.Label(aabw, text="QQ: 2647547478", font=('', 15)).pack() - tk.Label(aabw, text="讨论群: 861684859", font=('', 15)).pack() - - aabw.mainloop() - - - print('关于命令加载完成!') - - - def apphelp(): - ahpw = tk.Tk() - ahpw.title("音·创 - 帮助") - ahpw.geometry('400x600') # 像素 - - ahpw.mainloop() - - print('帮助命令加载完成!') - - - - def FromMP3(): - log('从MP3导入音乐') - mp3file = tkinter.filedialog.askopenfilename(title="请选择钢琴声音的 MP3 文件", initialdir=r'./', filetypes=[("钢琴声音的音频文件", '.mp3 .m4a'), ("全部类型", '*')], multiple=True) - if mp3file == None or mp3file == '': - log('取消') - return - else: - mp3file = mp3file[0] - from nmcsup.nmcreader import ReadMidi - from nmcsup.trans import Mp32Mid - if not os.path.exists('./Temp/'): - os.makedirs('./Temp/') - Mp32Mid(mp3file,'./Temp/Trans.mid') - log('打开midi文件./Temp/Trans.mid') - th = NewThread(ReadMidi, ('./Temp/Trans.mid',)) - th.start() - del mp3file - def midiSPT(th): - for i in th.getResult(): - datas = DMM() - datas['notes'] = i - dataset[0]['musics'].append(datas) - del th - global is_save - is_save = False - global NowMusic - RefreshMain() - RefreshMusic(NowMusic) - threading.Thread(target=midiSPT, args=(th,)).start() - del th - - print('读MP3加载完成') - - - def FromMidi(): - log('从midi导入音乐') - midfile = tkinter.filedialog.askopenfilename(title="请选择 MIDI 文件", initialdir=r'./', filetypes=[("Midi文件", '.mid .midi'), ("全部类型", '*')], multiple=True) - if midfile == None or midfile == '': - log('取消') - return - else: - midfile = midfile[0] - th = NewThread(ReadMidi, (midfile,)) - th.start() - del midfile - def midiSPT(th): - for i in th.getResult(): - datas = DMM() - datas['notes'] = i - dataset[0]['musics'].append(datas) - del th - global is_save - is_save = False - global NowMusic - RefreshMain() - RefreshMusic(NowMusic) - threading.Thread(target=midiSPT, args=(th,)).start() - del th - - - print('读midi命令加载完成!') - - - def FromForm(): - log('从文本读入音轨') - fn = tkinter.filedialog.askopenfilename(title="请选择 音符文本 文件", initialdir=r'./', filetypes=[("文本文件", '.txt'), ("全部类型", '*')], multiple=True) - if fn == None or fn =='': - log('取消') - return - else: - fn = fn[0] - th = NewThread(ReadFile, (fn,)) - th.start() - def midiSPT(th): - for i in th.getResult(): - datas = DMM() - datas['notes'] = i - dataset[0]['musics'].append(datas) - del th - global is_save - is_save = False - global NowMusic - RefreshMain() - RefreshMusic(NowMusic) - threading.Thread(target=midiSPT, args=(th,)).start() - - - print('读txt命令加载完成!') - - - def FromText(): - log('写入音符至音轨') - dat = tkinter.simpledialog.askstring(title="获取信息", prompt="请输入音符:", initialvalue='`1 .2 C') - if dat == None: - return - datas = [] - for i in dat.split(' '): - datas.append([str(i), 1.0]) - log("音符数据写入{}".format(str(datas))) - from nmcsup.trans import note2list - datat = DMM() - datat['notes'] = note2list(datas) - dataset[0]['musics'].append(datat) - del datas, datat, dat - global is_save - is_save = False - global NowMusic - RefreshMain() - RefreshMusic(NowMusic) - - - print('写入命令加载完成!') - - - - def ShowCMD(): - log('展示指令') - global NowMusic - from nmcsup.trans import Note2Cmd - RefreshCMDList(Note2Cmd(dataset[0]['musics'][NowMusic]['notes'],dataset[0]['musics'][NowMusic]['set']['ScoreboardName'],dataset[0]['musics'][NowMusic]['set']['Instrument'],dataset[0]['mainset']['PlayerSelect'])) - - - def MakeCMD(): - log('生成文件') - from msctspt.funcOpera import makeFuncFiles - file = tkinter.filedialog.askdirectory(title="请选择文件生成的位置", initialdir=r'./') - if file == None or file =='': - log('取消') - return - else: - makeFuncFiles(dataset[0], file+'/') - - - def MakeCMDdir(): - log('生成函数包') - from msctspt.funcOpera import makeFunDir - file = tkinter.filedialog.askdirectory(title="请选择文件夹生成的位置", initialdir=r'./') - if file == None or file =='': - log('取消') - return - else: - makeFunDir(dataset[0], file+'/') - - - def MakePackFile(): - file = tkinter.filedialog.askdirectory(title="请选择.mcpack文件生成的位置", initialdir=r'./') - if file == None or file =='': - log('取消') - return - import zipfile - - from msctspt.funcOpera import makeFunDir - log('生成附加包文件') - if not os.path.exists('./temp/'): - os.makedirs('./temp/') - makeFunDir(dataset[0], './temp/') - - shutil.move('./temp/{}Pack/behavior_packs/{}/functions'.format(dataset[0]['mainset']['PackName'],dataset[0]['mainset']['PackName']),'./') - - shutil.move('./temp/{}Pack/behavior_packs/{}/manifest.json'.format(dataset[0]['mainset']['PackName'],dataset[0]['mainset']['PackName']),'./') - - with zipfile.ZipFile('{}/{}.mcpack'.format(file,dataset[0]['mainset']['PackName']), 'w') as zipobj: - for i in os.listdir('./functions/'): - zipobj.write('./functions/{}'.format(i)) - zipobj.write('./manifest.json') - shutil.move('./functions','./temp/') - shutil.move('./manifest.json','./temp/') - shutil.rmtree('./temp/') - - - - - - - #转为空方块世界 - def ToBlockWorldEpt(): - import zipfile - - from nmcsup.trans import Cmd2World, Datas2BlkWorld, Notes2Player - while True: - try: - dire = tkinter.simpledialog.askstring(title = "坐标信息输入",prompt="请输入坐标:",initialvalue = '16 4 16') - if dire == None or dire == '': - return - dire = [int(dire.split(' ')[0]), int(dire.split(' ')[1]), int(dire.split(' ')[2])] - except: - tkinter.messagebox.showerror(title="错误❌", message="您输入的格式有误,请重新输入!") - continue - break - Outdire = tkinter.filedialog.askdirectory(title="请选择世界文件夹生成的位置", initialdir=r'./') - if Outdire == None or Outdire == '': - log('取消') - return - else: - Outdire = '{}/{}/'.format(Outdire[0],dataset[0]['mainset']['PackName']) - with zipfile.ZipFile('./nmcsup/EptWorld.zip', 'r') as zipobj: - zipobj.extractall(Outdire) - NoteData = [] - for i in dataset[0]['musics']: - NoteData.append(i['notes']) - Datas2BlkWorld(NoteData,Outdire,dire) - del NoteData - for i in range(len(dataset[0]['musics'])): - Cmd2World(Notes2Player(dataset[0]['musics'][i]['notes'],[dire[0],dire[1],dire[2]+i],{'Ent':dataset[0]['musics'][i]['set']['EntityName'],'Pls':dataset[0]['mainset']['PlayerSelect'],'Ins':dataset[0]['musics'][i]['set']['Instrument']}),Outdire,[dire[0]-5-i,dire[1],dire[2]]) - del dire, Outdire - - - - - #转为已存在的方块世界 - def ToBlockWorld(): - from nmcsup.trans import Cmd2World, Datas2BlkWorld, Notes2Player - while True: - try: - dire = tkinter.simpledialog.askstring(title = "坐标信息输入",prompt="请输入坐标:",initialvalue = '16 4 16') - if dire == None or dire == '': - return; - dire = [int(dire.split(' ')[0]), int(dire.split(' ')[1]), int(dire.split(' ')[2])] - except: - tkinter.messagebox.showerror(title="错误❌", message="您输入的格式有误,请重新输入!") - continue - break - Outdire = tkinter.filedialog.askdirectory(title="请选择世界文件夹生成的位置", initialdir=r'./') - if Outdire == None or Outdire == '': - log('取消') - return - else: - Outdire+='/' - NoteData = [] - for i in dataset[0]['musics']: - NoteData.append(i['notes']) - Datas2BlkWorld(NoteData,Outdire,dire) - del NoteData - for i in range(len(dataset[0]['musics'])): - Cmd2World(Notes2Player(dataset[0]['musics'][i]['notes'],[dire[0],dire[1],dire[2]+i],{'Ent':dataset[0]['musics'][i]['set']['EntityName'],'Pls':dataset[0]['mainset']['PlayerSelect'],'Ins':dataset[0]['musics'][i]['set']['Instrument']}),Outdire,[dire[0]-5-i,dire[1],dire[2]]) - del dire, Outdire - - - - - #生成函数播放器 - def MakeFuncPlayer(): - while True: - try: - dire = tkinter.simpledialog.askstring(title = "坐标信息输入",prompt="请输入坐标:",initialvalue = '16 4 16') - if dire == None or dire == '': - return; - dire = [int(dire.split(' ')[0]), int(dire.split(' ')[1]), int(dire.split(' ')[2])] - except: - tkinter.messagebox.showerror(title="错误❌", message="您输入的格式有误,请重新输入!"); - continue - break - Outdire = tkinter.filedialog.askdirectory(title="请选择函数包生成的位置", initialdir=r'./'); - if Outdire == None or Outdire == '': - return; - else: - Outdire = '{}/{}/'.format(Outdire,dataset[0]['mainset']['PackName']) - from nmcsup.trans import Notes2Player - for i in range(len(dataset[0]['musics'])): - open(Outdire+dataset[0]['musics'][i]['set']['FileName']+'_'+str(i)+'.mcfunction','w',encoding='utf-8').writelines(Notes2Player(dataset[0]['musics'][i]['notes'],[dire[0],dire[1],dire[2]+i],{'Ent':dataset[0]['musics'][i]['set']['EntityName'],'Pls':dataset[0]['mainset']['PlayerSelect'],'Ins':dataset[0]['musics'][i]['set']['Instrument']})) - - - - - - #转为空指令世界 - def ToCmdWorldEpt(): - import zipfile - - from nmcsup.trans import Cmd2World, Note2Cmd - while True: - try: - dire = tkinter.simpledialog.askstring(title = "坐标信息输入",prompt="请输入坐标:",initialvalue = '16 4 16'); - if dire == None or dire == '': - return; - dire = [int(dire.split(' ')[0]), int(dire.split(' ')[1]), int(dire.split(' ')[2])]; - except: - tkinter.messagebox.showerror(title="错误❌", message="您输入的格式有误,请重新输入!"); - continue; - break; - Outdire = tkinter.filedialog.askdirectory(title="请选择世界文件夹生成的位置", initialdir=r'./'); - if Outdire == None or Outdire == '': - return; - else: - Outdire+='/'+dataset[0]['mainset']['PackName']+'/'; - with zipfile.ZipFile('./nmcsup/EptWorld.zip', 'r') as zipobj: - zipobj.extractall(Outdire); - for i in range(len(dataset[0]['musics'])): - Cmd2World(Note2Cmd(dataset[0]['musics'][i]['notes'],dataset[0]['musics'][i]['set']['ScoreboardName'],dataset[0]['musics'][i]['set']['Instrument'],dataset[0]['mainset']['PlayerSelect'],True),Outdire,[dire[0],dire[1],dire[2]+i]) - del dire,Outdire - - - - #转为已存在的指令世界 - def ToCmdWorld(): - from nmcsup.trans import Cmd2World, Note2Cmd - while True: - try: - dire = tkinter.simpledialog.askstring(title = "坐标信息输入",prompt="请输入坐标:",initialvalue = '16 4 16') - if dire == None or dire == '': - return; - dire = [int(dire.split(' ')[0]), int(dire.split(' ')[1]), int(dire.split(' ')[2])] - except: - tkinter.messagebox.showerror(title="错误❌", message="您输入的格式有误,请重新输入!"); - continue - break - Outdire = tkinter.filedialog.askdirectory(title="请选择世界文件夹生成的位置", initialdir=r'./'); - if Outdire == None or Outdire == '': - return - else: - Outdire+='/' - for i in range(len(dataset[0]['musics'])): - Cmd2World(Note2Cmd(dataset[0]['musics'][i]['notes'],dataset[0]['musics'][i]['set']['ScoreboardName'],dataset[0]['musics'][i]['set']['Instrument'],dataset[0]['mainset']['PlayerSelect'],True),Outdire,[dire[0],dire[1],dire[2]+i]) - del dire,Outdire - - - - - - #函数输入指令块 - def func2World(): - from nmcsup.trans import Cmd2World - while True: - try: - dire = tkinter.simpledialog.askstring(title = "坐标信息输入",prompt="请输入坐标:",initialvalue = '16 4 16') - if dire == None or dire == '': - return; - dire = [int(dire.split(' ')[0]), int(dire.split(' ')[1]), int(dire.split(' ')[2])] - except: - tkinter.messagebox.showerror(title="错误❌", message="您输入的格式有误,请重新输入!"); - continue - break - Outdire = tkinter.filedialog.askdirectory(title="请选择世界文件夹生成的位置", initialdir=r'./'); - if Outdire == None or Outdire == '': - return; - else: - Outdire+='/'; - Cmd2World(open(tkinter.filedialog.askopenfilename(title="请选择 .mcfunction 文件", initialdir=r'./', filetypes=[("我的世界指令函数文件", '.mcfunction'), ("全部类型", '*')], multiple=True)[0],'r',encoding='utf-8').readlines(),Outdire,dire) - - - - - #大函数分割并载入执行链 - def bigFunc2World(): - log('分割大函数') - import uuid - - from msctspt.funcOpera import funSplit - from msctspt.transfer import hans2pinyin - from nmcsup.trans import Cmd2World - while True: - try: - dire = tkinter.simpledialog.askstring(title = "坐标信息输入",prompt="请输入执行链生成坐标:",initialvalue = '16 4 16'); - if dire == None or dire == '': - return; - dire = [int(dire.split(' ')[0]), int(dire.split(' ')[1]), int(dire.split(' ')[2])]; - except: - tkinter.messagebox.showerror(title="错误❌", message="您输入的格式有误,请重新输入。"); - continue - break - Outdire = tkinter.filedialog.askdirectory(title="请选择世界文件夹生成的位置", initialdir=r'./'); - if Outdire == None or Outdire == '': - log('取消') - return - else: - Outdire+='/'; - log('获得地图地址:'+Outdire) - fileName = tkinter.filedialog.askopenfilename(title="请选择 .mcfunction 文件", initialdir=r'./', filetypes=[("我的世界指令函数文件", '.mcfunction'), ("全部类型", '*')], multiple=True) - if fileName == None or fileName == '': - log('取消') - return; - else: - fileName = fileName[0] - log('获得文件名:'+fileName) - bigFile = open(fileName,'r',encoding='utf-8') - parts = funSplit(bigFile) - if parts == -1: - tkinter.messagebox.showerror(title="错误❌", message="您的函数文件不大于一万条指令,无需进行分割操作。"); - return; - log('创建函数文件夹') - packName = fileName[len(fileName)-fileName[::-1].index('/'):fileName.index('.')] - packDire = hans2pinyin(packName) - try: - os.makedirs(Outdire+'behavior_packs/'+packDire+'/functions/'); - except: - log('已存在文件夹') - log('创建manifest.json以及world_behavior_packs.json') - behaviorUuid = uuid.uuid4() - if os.path.exists(Outdire+'world_behavior_packs.json'): - with open(Outdire+'world_behavior_packs.json', 'r') as f: - have = json.load(f) - have.append({'pack_id': str(behaviorUuid), 'version': [ 0, 0, 1 ]}) - with open(Outdire+'world_behavior_packs.json', 'w',encoding='utf-8') as f: - json.dump(have,f) - del have - else: - with open(Outdire+'world_behavior_packs.json', 'w',encoding='utf-8') as f: - f.write('[\n {\'pack_id\': \'' + str(behaviorUuid) +'\',\n \'version\': [ 0, 0, 1 ]}\n]') - with open(Outdire+'behavior_packs/'+packDire+'/manifest.json', 'w') as f: - f.write('{\n \'format_version\': 1,\n \'header\': {\n \'description\': \''+packName+' Pack : behavior pack\',\n \'version\': [ 0, 0, 1 ],\n \'name\': \''+packName+'Pack\',\n \'uuid\': \'' + str(behaviorUuid) + '\'\n },\n \'modules\': [\n {\n \'description\': \''+packName+' Pack : behavior pack\',\n \'type\': \'data\',\n \'version\': [ 0, 0, 1 ],\n \'uuid\': \'' + str(uuid.uuid4()) + '\'\n }\n ]\n}') - cmdlist = [] - for i in parts : - open(Outdire+'behavior_packs/'+packDire+'/functions/'+packDire+str(parts.index(i)+1)+'.mcfunction','w',encoding='utf-8').writelines(i); - cmdlist.append('function '+packDire+str(parts.index(i)+1)) - Cmd2World(cmdlist,Outdire,dire) - del cmdlist,behaviorUuid,Outdire,fileName,bigFile,parts,dire,packName,packDire - - - - - def toScbBDXfile(): - from msctspt.transfer import note2bdx - while True: - try: - dire = tkinter.simpledialog.askstring(title = "坐标信息输入",prompt="请输入执行链生成相对坐标:",initialvalue = '0 0 0'); - if dire == None or dire == '': - return; - dire = [int(dire.split(' ')[0]), int(dire.split(' ')[1]), int(dire.split(' ')[2])]; - except: - tkinter.messagebox.showerror(title="错误❌", message="您输入的格式有误,请重新输入。"); - continue - break - - fileName = tkinter.filedialog.asksaveasfilename(title="请选择需要生成的.bdx文件", initialdir=r'./', filetypes=[("FastBuilder结构文件", '.bdx'), ("全部类型", '*')], defaultextension=dataset[0]['mainset']['PackName']+'.bdx',initialfile=dataset[0]['mainset']['PackName']+'.bdx') - if fileName == None or fileName == '': - log('取消') - return; - - log('获得文件名:'+fileName) - - res = note2bdx(fileName,dire,dataset[0]['musics'][NowMusic]['notes'],dataset[0]['musics'][NowMusic]['set']['ScoreboardName'],dataset[0]['musics'][NowMusic]['set']['Instrument'],dataset[0]['mainset']['PlayerSelect']) - log('转换结束!\n'+str(res)) - tkinter.messagebox.showinfo("完成!✔","转换结束!\n{}".format(str(res))) - - - - - def wsPlay(): - from msctspt.transfer import note2webs - spd = tkinter.simpledialog.askfloat("输入播放速度",prompt="一秒,音乐走几拍?",initialvalue = '5.0') - tkinter.messagebox.showinfo(title="创建中", message="按下确认后,在游戏中使用connect指令连接localhost:8080,即可播放") - note2webs(dataset[0]['musics'][NowMusic]['notes'],dataset[0]['musics'][NowMusic]['set']['Instrument'],spd,dataset[0]['mainset']['PlayerSelect']) - - - - - - def toRSworldEPT(): - import zipfile - - from msctspt.transfer import note2RSworld - while True: - try: - dire = tkinter.simpledialog.askstring(title = "坐标信息输入",prompt="请输入坐标:",initialvalue = '16 4 16'); - if dire == None or dire == '': - return; - dire = [int(dire.split(' ')[0]), int(dire.split(' ')[1]), int(dire.split(' ')[2])]; - except: - tkinter.messagebox.showerror(title="错误❌", message="您输入的格式有误,请重新输入!"); - continue; - break; - Outdire = tkinter.filedialog.askdirectory(title="请选择世界文件夹生成的位置", initialdir=r'./'); - if Outdire == None or Outdire == '': - return; - else: - Outdire+='/'+dataset[0]['mainset']['PackName']+'/'; - with zipfile.ZipFile('./nmcsup/EptWorld.zip', 'r') as zipobj: - zipobj.extractall(Outdire); - for i in range(len(dataset[0]['musics'])): - note2RSworld(Outdire,dire,dataset[0]['musics'][i]['notes'],dataset[0]['musics'][i]['set']['Instrument']) - - del dire,Outdire; - - - - def toRSworld(): - from msctspt.transfer import note2RSworld - while True: - try: - dire = tkinter.simpledialog.askstring(title = "坐标信息输入",prompt="请输入坐标:",initialvalue = '16 4 16') - if dire == None or dire == '': - return; - dire = [int(dire.split(' ')[0]), int(dire.split(' ')[1]), int(dire.split(' ')[2])] - except: - tkinter.messagebox.showerror(title="错误❌", message="您输入的格式有误,请重新输入!"); - continue - break - Outdire = tkinter.filedialog.askdirectory(title="请选择世界文件夹生成的位置", initialdir=r'./'); - if Outdire == None or Outdire == '': - return; - else: - Outdire+='/'; - for i in range(len(dataset[0]['musics'])): - note2RSworld(Outdire,dire,dataset[0]['musics'][i]['notes'],dataset[0]['musics'][i]['set']['Instrument']) - del dire,Outdire; - - - - - def world2RyStruct(): - outdir = tkinter.filedialog.askdirectory(title="请选择世界文件夹所在的位置", initialdir=r'./'); - if outdir == None or outdir == '': - return; - else: - outdir+='/'; - while True: - try: - begp = tkinter.simpledialog.askstring(title = "坐标信息输入",prompt="请输入区域选择的开始坐标:",initialvalue = '16 4 16') - if begp == None or begp == '': - return; - begp = [int(begp.split(' ')[0]), int(begp.split(' ')[1]), int(begp.split(' ')[2])] - except: - tkinter.messagebox.showerror(title="错误❌", message="您输入的格式有误,请重新输入!"); - continue - break - while True: - try: - endp = tkinter.simpledialog.askstring(title = "坐标信息输入",prompt="请输入区域选择的结束坐标:",initialvalue = '16 4 16') - if endp == None or endp == '': - return; - endp = [int(endp.split(' ')[0]), int(endp.split(' ')[1]), int(endp.split(' ')[2])] - except: - tkinter.messagebox.showerror(title="错误❌", message="您输入的格式有误,请重新输入!"); - continue - break - isAir = tkinter.messagebox.askyesno("请确认","所选区块导出时是否需要保留空气方块?") - fileName = tkinter.filedialog.asksaveasfilename(title="生成.RyStruct文件", initialdir=r'./', filetypes=[("音·创结构文件", '.RyStruct'), ("全部类型", '*')], defaultextension='*.RyStruct',initialfile='*.RyStruct') - if fileName == None or fileName == '': - log('取消') - return - from msctspt.transfer import ryStruct - rys = ryStruct(outdir) - rys.world2Rys(begp,endp,isAir) - try: - with open(fileName,'w',encoding='utf-8') as f: - json.dump(rys.RyStruct,f,sort_keys=True, indent=4, separators=(', ', ': '), ensure_ascii=False) - tkinter.messagebox.showinfo("完成!✔","文件已生成\n{}".format(fileName)) - except: - tkinter.messagebox.showerror("失败❌","文件无法生成\n{}\n{}".format(fileName,str(rys.RyStruct))) - rys.closeLevel() - - - - def world2BDX(): - tkinter.messagebox.showerror("错误❌","本功能尚未开发。") - - - - - - - - - - - - - - - #使用邮件反馈bug - def sendBugReport(): - from msctspt.bugReporter import report - name = tkinter.simpledialog.askstring(title = "邮件反馈信息输入",prompt="您的称呼") - contact = tkinter.simpledialog.askstring(title = "邮件反馈信息输入",prompt="您的联系方式") - describetion = tkinter.simpledialog.askstring(title = "邮件反馈信息输入",prompt="您对问题的描述") - report(name,contact,describetion).emailReport() - del name,contact,describetion - - - - - - - - - - - - def ClearLog(): - global clearLog; - clearLog = not clearLog; - if clearLog: - tkinter.messagebox.showinfo("完成!✔","在程序结束后将清除日志及临时文件信息。") - else: - tkinter.messagebox.showinfo("完成!✔","在程序结束后将不会清除日志及临时文件信息。") - - - - - print('生成部分及其余命令加载完成!') - - - print('完成!') - - # 窗口部分 - print('增加窗口元素...') - global root - - root.title("音·创 - 金羿 - {}".format(VER[1]+VER[0])) - root.geometry('900x900') # 像素 - - print('完成!') - - - print('加载点击与页面更新命令...') - - # 音轨菜单被点击 - - - def MusicList_selected(event): - global NowMusic - NowMusic = ListMusicList.get(ListMusicList.curselection()) - log('刷新音轨'+str(NowMusic)) - RefreshMusic(NowMusic) - - - # 音符菜单被点击 - def NoteList_selected(event): - pass # 编辑音符操作 - - - def CMDList_selected(event): - pass # 命令编辑操作 - - - print('菜单点击命令加载完成!') - - - # 刷新音轨部分 - def RefreshMusic(Music=0): - LabelEntityName['text'] = "执行实体名:{}".format(dataset[0]['musics'][Music]['set']['EntityName']) - LabelScoreboardName['text']="使用计分板:{}".format(dataset[0]['musics'][Music]['set']['ScoreboardName']) - LabelInstrument['text'] = "所用的乐器:{}".format(dataset[0]['musics'][Music]['set']['Instrument']) - LabelFileName['text'] = "当前音轨名:{}".format(dataset[0]['musics'][Music]['set']['FileName']) - NoteList_var.set(()) # 为列表框设置新值 - for i in dataset[0]['musics'][Music]['notes']: - ListNoteList.insert(tk.END, str(i)) - - - # 刷新主要部分 - def RefreshMain(): - LabelPackName['text'] = "包名:{}".format(str(dataset[0]['mainset']['PackName'])) - LabelMusicTitle['text'] = "音乐标题:{}".format(str(dataset[0]['mainset']['MusicTitle'])) - LabelIsRepeat['text'] = "是否重复:{}".format(str(dataset[0]['mainset']['IsRepeat'])) - LabelPlayerSelect['text'] = "玩家选择器:{}".format(str(dataset[0]['mainset']['PlayerSelect'])) - MusicList_var.set(()) # 为列表框设置新值 - for i in range(len(dataset[0]['musics'])): - ListMusicList.insert(tk.END, i) - global NowMusic - NowMusic = 0 - - - def RefreshCMDList(CMDList): - ListCMDList.delete(tk.END) - for i in CMDList: - ListCMDList.insert(tk.END, str(i)) - - - print('页面刷新函数加载完成!') - - - def changePackName(event): - a = tkinter.simpledialog.askstring(title="修改主设置", prompt="修改包名", initialvalue='Ryoun') - if a == None: - return - dataset[0]['mainset']['PackName'] = a - del a - RefreshMain() - - - def changeMusicTitle(event): - a = tkinter.simpledialog.askstring(title="修改主设置", prompt="修改音乐标题", initialvalue='Noname') - if a == None: - return - dataset[0]['mainset']['MusicTitle'] = a - RefreshMain() - - - def changeIsRepeat(event): - dataset[0]['mainset']['IsRepeat'] = not dataset[0]['mainset']['IsRepeat'] - RefreshMain() - - - def changePlayerSelect(event): - dataset[0]['mainset']['PlayerSelect'] = tkinter.simpledialog.askstring(title="修改主设置", prompt="修改玩家选择器\n注意!要加上中括号“[]”", initialvalue='') - if dataset[0]['mainset']['PlayerSelect'] == None: - dataset[0]['mainset']['PlayerSelect'] = '' - RefreshMain() - - - def changeEntityName(event): - global NowMusic - a = tkinter.simpledialog.askstring(title="修改节设置", prompt="修改本音轨的执行实体名", initialvalue='musicSupport') - if a == None: - return - dataset[0]['musics'][NowMusic]['set']['EntityName'] = a - RefreshMusic(NowMusic) - - - def changeScoreboardName(event): - global NowMusic - a = tkinter.simpledialog.askstring(title="修改节设置", prompt="修改本音轨所用的积分板", initialvalue='musicSupport') - if a == None: - return - dataset[0]['musics'][NowMusic]['set']['ScoreboardName'] = a - RefreshMusic(NowMusic) - - - def changeInstrument(event): - from nmcsup.const import Instuments as inst - global NowMusic - while(True): - instemp = tkinter.simpledialog.askstring(title="修改节设置", prompt="修改本音轨所用乐器", initialvalue='note.harp') - if not instemp in inst.keys(): - if tkinter.messagebox.askyesno(title="提示❗", message="您输入的乐器并非游戏内置乐器,是否继续用您输入的字符作为乐器?"): - dataset[0]['musics'][NowMusic]['set']['Instrument'] = instemp - del instemp - break - else: - smsg = "游戏内置乐器如下:请输入英文\n" - for i, j in inst.items(): - smsg += i+' : '+j+'\n' - tkinter.messagebox.showinfo(title="提示❗", message=smsg) - del smsg - else: - dataset[0]['musics'][NowMusic]['set']['Instrument'] = instemp - del instemp - break - RefreshMusic(NowMusic) - - - def changeFileName(event): - global NowMusic - a = tkinter.simpledialog.askstring(title="修改节设置", prompt="修改本音轨生成的文件名", initialvalue='Music') - if a == None: - return - dataset[0]['musics'][NowMusic]['set']['FileName'] = a - RefreshMusic(NowMusic) - - - print('标签点击命令加载完成!') - - - def ResetSetting(): - global dataset - dataset[0]['mainset'] = {'PackName': 'Ryoun','MusicTitle': 'Noname','IsRepeat': False,'PlayerSelect': ''} - RefreshMain() - - - def DelNowMusic(): - global NowMusic - del dataset[0]['musics'][NowMusic] - NowMusic -= 1 - RefreshMain() - RefreshMusic(NowMusic) - - - from nmcsup.vers import resetver - - print('按钮点击命令加载完成!') - - print('完成!') - - - print('加载菜单与页面...') - - # 创建一个菜单 - main_menu_bar = tk.Menu(root) - - - # 创建文件菜单 - filemenu = tk.Menu(main_menu_bar, tearoff=0) - - filemenu.add_command(label="打开音·创项目...", command=openProject) - filemenu.add_command(label="打开旧项目...", command=openOldProject) - filemenu.add_command(label="保存项目", command=SaveProject) - filemenu.add_command(label="另存为...", command=SaveAsProject) - - filemenu.add_separator() # 分隔符 - - filemenu.add_command(label="退出", command=exitapp) - - # 将子菜单加入到菜单条中 - main_menu_bar.add_cascade(label="文件", menu=filemenu) - - - # 创建编辑菜单 - editmenu = tk.Menu(main_menu_bar, tearoff=0) - editmenu.add_command(label="从钢琴MP3导入音轨", command=FromMP3) - editmenu.add_command(label="从midi导入音轨", command=FromMidi) - editmenu.add_command(label="从文本文件导入音轨", command=FromForm) - editmenu.add_command(label="输入音符至音轨", command=FromText) - # 将子菜单加入到菜单条中 - main_menu_bar.add_cascade(label="编辑", menu=editmenu) - - - - #创建函数菜单 - funcmenu = tk.Menu(main_menu_bar, tearoff=0) - funcmenu.add_command(label="生成文件至...", command=MakeCMD) - funcmenu.add_command(label="生成函数包至...", command=MakeCMDdir) - funcmenu.add_command(label="生成附加包文件至...", command=MakePackFile) - # 将子菜单加入到菜单条中 - main_menu_bar.add_cascade(label="函数(包)", menu=funcmenu) - - - - - #创建世界菜单 - worldmenu = tk.Menu(main_menu_bar, tearoff=0); - worldmenu.add_command(label="将音乐以方块存储生成地图", command=ToBlockWorldEpt); - worldmenu.add_command(label="将音乐以方块存储载入地图…", command=ToBlockWorld); - worldmenu.add_separator() - worldmenu.add_command(label="将音乐以指令存储生成地图", command=ToCmdWorldEpt); - worldmenu.add_command(label="将音乐以指令存储载入地图…", command=ToCmdWorld); - worldmenu.add_separator() - worldmenu.add_command(label="将音乐以音符盒存储生成地图", command=toRSworldEPT); - worldmenu.add_command(label="将音乐以音符盒存储载入地图…", command=toRSworld); - # 将子菜单加入到菜单条中 - main_menu_bar.add_cascade(label="世界", menu=worldmenu); - - - # 创建其他功能菜单 - otherMenu = tk.Menu(main_menu_bar, tearoff=0) - otherMenu.add_command(label="生成符合当前音乐的函数播放器…", command=MakeFuncPlayer) - otherMenu.add_separator(); - otherMenu.add_command(label="将选中音轨以指令存储生成.bdx文件…", command=toScbBDXfile) - otherMenu.add_command(label="由地图导出至.bdx文件…", command=world2BDX) - otherMenu.add_command(label="由地图导出至.RyStruct文件…", command=world2RyStruct) - otherMenu.add_separator(); - otherMenu.add_command(label="将函数载入世界…", command=func2World); - otherMenu.add_command(label="将大函数分割并建立执行链…", command=bigFunc2World); - - main_menu_bar.add_cascade(label="辅助功能", menu=otherMenu); - - - # 创建实验功能菜单 - trymenu = tk.Menu(main_menu_bar, tearoff=0) - trymenu.add_command(label="展示生成结果", command=ShowCMD) - trymenu.add_command(label="建立位于localhost:8080上的websocket服务器播放选中音轨", command=wsPlay) - # 将子菜单加入到菜单条中 - main_menu_bar.add_cascade(label="实验功能", menu=trymenu) - - - - - - - - # 创建帮助菜单 - helpmenu = tk.Menu(main_menu_bar, tearoff=0) - helpmenu.add_command(label="清除临时文件", command=ClearLog) - helpmenu.add_command(label="清除存在文件", command=resetver) - - helpmenu.add_separator() # 分隔符 - - helpmenu.add_command(label="帮助", command=apphelp) - helpmenu.add_command(label="关于", command=appabout) - helpmenu.add_command(label="发送错误日志反馈",command=sendBugReport) - # 将子菜单加入到菜单条中 - main_menu_bar.add_cascade(label="帮助与疑问", menu=helpmenu) - - - # 窗口内容 - - - #上半部分框 - UpFrame = tk.Frame(root) - - - #左边的框(音乐总设置) - UpLeftFrame = tk.Frame(UpFrame, bg='white') - # 大标题 - tk.Label(UpLeftFrame, text="音乐总设置(项目设置)", font=('', 20)).pack() - # 按钮式文本 - LabelPackName = tk.Label(UpLeftFrame, bg='white', text="地图/函数包名:", font=('', 15)) - LabelMusicTitle = tk.Label(UpLeftFrame, bg='white',text="音乐标题:", font=('', 15)) - LabelIsRepeat = tk.Label(UpLeftFrame, bg='white', text="是否重复:", font=('', 15)) - LabelPlayerSelect = tk.Label(UpLeftFrame, bg='white', text="玩家选择器:", font=('', 15)) - # 绑定按钮 - LabelPackName.bind('', changePackName) - LabelMusicTitle.bind('', changeMusicTitle) - LabelIsRepeat.bind('', changeIsRepeat) - LabelPlayerSelect.bind('', changePlayerSelect) - # 装入容器 - LabelPackName.pack() - LabelMusicTitle.pack() - LabelIsRepeat.pack() - LabelPlayerSelect.pack() - # 按钮:重置项目设置 - tk.Button(UpLeftFrame, text="重置项目设置", command=ResetSetting).pack() - #装入窗口 - UpLeftFrame.pack(side='left') - - - - - # 中间的框容器 - UpMidleFrame = tk.Frame(UpFrame, bg='blue') - # 列表 - MusicList_var = tk.StringVar() - ListMusicList = tk.Listbox(UpMidleFrame, listvariable=MusicList_var) - ListMusicList.bind('', MusicList_selected) # 设置选中响应函数 - ListMusicList.pack(side='left') - # 滑块 - tk.Scrollbar(UpMidleFrame,command=ListMusicList.yview).pack(side='left',fill='y') - #装入窗口 - UpMidleFrame.pack(side='left') - - - - #右边的框容器 - UpRightFrame = tk.Frame(UpFrame, bg='white') - # 大标题 - tk.Label(UpRightFrame, text="当前音轨设置(段落设置)", font=('', 20)).pack() - # 按钮式文本 - LabelEntityName = tk.Label(UpRightFrame, bg='white',text="执行实体名:", font=('', 15)) - LabelScoreboardName = tk.Label(UpRightFrame, bg='white', text="使用计分板:", font=('', 15)) - LabelInstrument = tk.Label(UpRightFrame, bg='white',text="所用的乐器:", font=('', 15)) - LabelFileName = tk.Label(UpRightFrame, bg='white',text="当前音轨名:", font=('', 15)) - # 绑定按钮 - LabelEntityName.bind('', changeEntityName) - LabelScoreboardName.bind('', changeScoreboardName) - LabelInstrument.bind('', changeInstrument) - LabelFileName.bind('', changeFileName) - # 装入框容器 - LabelEntityName.pack() - LabelScoreboardName.pack() - LabelInstrument.pack() - LabelFileName.pack() - # 按钮:删除选中音轨 - tk.Button(UpRightFrame, text="删除选中音轨", command=DelNowMusic).pack() - #装入窗口 - UpRightFrame.pack(side='left') - - #上半部分框容器装入窗口 - UpFrame.pack() - - - - # 下半部分框容器 - DownFrame = tk.Frame(root, bg='blue') - - #经典名言语录 - import random - texts = open('./resources/myWords.txt','r',encoding='utf-8').readlines() - tk.Label(DownFrame,text=texts[random.randint(0,len(texts)-1)].replace('\n','').replace('\\n','\n'),fg='white',bg='black',font=('DengXian Light',20)).pack(fill='x') - del texts - - # 音符列表菜单 - NoteList_var = tk.StringVar() - ListNoteList = tk.Listbox(DownFrame, listvariable=NoteList_var, width=40, height=30) - ListNoteList.bind('', NoteList_selected) # 设置选中响应函数 - ListNoteList.pack(side='left') - # 音符列表滑块 - tk.Scrollbar(DownFrame,command=ListNoteList.yview).pack(side='left',fill='y') - - - # 指令列表菜单 - ListCMDList = tk.Text(DownFrame,height=37,width=40) - ListCMDList.pack(side='left') - # 指令列表滑块 - tk.Scrollbar(DownFrame,command=ListCMDList.yview).pack(fill='y',side='left') - - # 下半部分容器载入窗口 - DownFrame.pack() - - - RefreshMain() - - - # 将菜单添加到主窗口中 - root.config(menu=main_menu_bar) - - print('完成!') - - - log('启动root.mainloop(窗口)') - - - if len(sys.argv) != 1: - log('初始化打开音·创项目'+sys.argv[1]) - global is_save - is_save = True - try: - with open(sys.argv[1], 'r', encoding='UTF-8') as c: - dataset[0] = json.load(c) - except: - print("无法打开文件:{},请查看您是否输入正确".format(sys.argv[1])) - log('无法打开'+sys.argv[1]) - return - global is_new_file - global ProjectName - is_new_file = False - ProjectName = sys.argv[1] - global NowMusic - RefreshMain() - RefreshMusic(NowMusic) - - - # 进入窗口消息循环 - root.mainloop() - log('退出') - del filemenu, editmenu, helpmenu, otherMenu - - exitapp() - - -if __name__ == '__main__': - __main__(); - - diff --git a/README.md b/README.md index 51870fc..74d3fd9 100644 --- a/README.md +++ b/README.md @@ -11,6 +11,8 @@ 支持 Windows7+ 以及各个支持 Python3.8 的 Linux +***各位开发人员注意!!!多语言支持请使用READABLETEXT常量输出文字!!!如需补充,请在相应的语言文件中补充!!!*** + ### 安装教程 diff --git a/languages/__pycache__/enGB.cpython-38.pyc b/languages/__pycache__/enGB.cpython-38.pyc new file mode 100644 index 0000000..6a86f27 Binary files /dev/null and b/languages/__pycache__/enGB.cpython-38.pyc differ diff --git a/languages/__pycache__/lang.cpython-38.pyc b/languages/__pycache__/lang.cpython-38.pyc index 0ccabd5..2b09002 100644 Binary files a/languages/__pycache__/lang.cpython-38.pyc and b/languages/__pycache__/lang.cpython-38.pyc differ diff --git a/languages/__pycache__/zhCN.cpython-38.pyc b/languages/__pycache__/zhCN.cpython-38.pyc new file mode 100644 index 0000000..70d134c Binary files /dev/null and b/languages/__pycache__/zhCN.cpython-38.pyc differ diff --git a/languages/const2string.py b/languages/const2string.py index 8380ad2..473bb0f 100644 --- a/languages/const2string.py +++ b/languages/const2string.py @@ -9,6 +9,23 @@ # 若需转载或借鉴 请附作者 +''' + Copyright 2022 Eilles Wan (金羿) + + Licensed under the Apache License, Version 2.0 (the 'License') + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an 'AS IS' BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +''' + + # 代码写的并非十分的漂亮,还请大佬多多包涵;本软件源代码依照Apache软件协议公开 ''' @@ -17,6 +34,9 @@ 方便进行语言翻译支持。 ''' +startWith = 0 + + import sys @@ -26,24 +46,23 @@ def __main__(): print('读取文件: {}'.format(fileName)) fileText = [] for line in open(fileName, 'r', encoding='utf-8'): - if line.count('"') >=2: + while line.count('"') >=2: # 只有上帝看得懂我在写什么。 if line[line.index('"'):2+line[line.index('"')+1:].index('"')+len(line[:line.index('"')])] in textList: thisText = textList.index(line[line.index('"'):2+line[line.index('"')+1:].index('"')+len(line[:line.index('"')])]) else: thisText = len(textList) textList.append(line[line.index('"'):2+line[line.index('"')+1:].index('"')+len(line[:line.index('"')])]) - fileText.append(line.replace( - line[line.index('"'):2+line[line.index('"')+1:].index('"')+len(line[:line.index('"')])], - 'READABLETEXT[{}]'.format(thisText) - )) - else: - fileText.append(line) + line = line.replace( + line[line.index('"'):2+line[line.index('"') + 1:].index('"')+len(line[:line.index('"')])], + 'READABLETEXT[{}]'.format(thisText+startWith) + ) + fileText.append(line) open(fileName+'_C','w',encoding='utf-8').writelines(fileText) - outFile = open('lang.py','w',encoding='utf-8') + outFile = open('lang__.py','w',encoding='utf-8') outFile.write('''# -*- coding:utf-8 -*- # 由金羿翻译工具生成字符串列表 @@ -54,7 +73,7 @@ def __main__(): READABLETEXT = { ''') for i in range(len(textList)): - outFile.write(" {}:{},\n".format(i,textList[i])) + outFile.write(" {}:{},\n".format(i+startWith,textList[i])) outFile.write('}') outFile.close() diff --git a/languages/enGB.py b/languages/enGB.py new file mode 100644 index 0000000..bbe8c0c --- /dev/null +++ b/languages/enGB.py @@ -0,0 +1,161 @@ +# -*- coding:utf-8 -*- + +# 由金羿翻译工具生成字符串列表 +# 请在所需翻译的文件前from 此文件 import READABLETEXT + + + +READABLETEXT = { + 'Translator':(("Eilles Wan (金羿)",True),), + # 此处是语言翻译者列表,其中每个元组第一项为显示文本,第二项为此文本是否为开发者名字 + 0:"ERROR❌", + 1:"TIPS❗", + 2:"Clearing log(this wont be in the file)", + 3:"Could not clear the temporary files or logs", + 4:"saved", + 5:"New Musicreater Project", + 6:"Select old-type project", + 7:"Select Musicreater Project", + 8:"Cant open:{}, please check if youve entered the right name", + 9:"Musicreat - Aboit", + 10:"Musicreater", + 11:"Ver. {}", + 12:"""Team-Ryoun for Minecraft\n×\nTeam-Ryoun for Software Development""", + 13:"OK", + 14:"Inpute Notes", + 15:(("- Developer(s) -",False),("Eilles Wan (金羿)",True),("EillesWan@outlook.com",False),("QQ 2647547478",False)), + # 此处是开发者列表,其中每个元组第一项为显示文本,第二项为此文本是否为开发者名字 + 16:"- Translators -", + # 17:"", + 18:"QQ Group: 861684859", + 19:"Musicreater - Help", + 20:"Select sound file", + 21:"Select MIDI file", + 22:"Select NoteText file", + 23:"Get Note info", + 24:"Write in Note info: {}", + 25:"Select generating file", + 26:"Select generating folder", + 27:"Select generating .mcpack file", + 28:"Input position info", + 29:"Select generating world folder", + 30:"Select generating Function Pack", + 31:"Select .mcfunction file ", + 32:"Select .bdx file ", + 33:"DONE✔", + 34:"Input playing rate", + 35:"Generating", + 36:"Select a world folder", + 37:"Make sure", + 38:"Generate .RyStruct file", + 39:"FAILED❌", + 40:"Report message inpution", + 41:"Musicreater - Eilles - {}", + 42:"ExecutingEntityName: {}", + 43:"ScoreboardName: {}", + 44:"Instrument: {}", + 45:"TrackName: {}", + 46:"PackName: {}", + 47:"MusicTitle: {}", + 48:"IsRepeat?: {}", + 49:"Player'sTargetSelector: {}", + 50:"Modify Main Option", + 51:"Modify Track Option", + 52:"Default Instrument: Enter English\n", + 53:"Open...", + 54:"Open Old Project...", + 55:"Save", + 56:"Save as...", + 57:"Exit", + 58:"File", + 59:"Load tracks from sound", + 60:"Load tracks from Midi", + 61:"Load tracks from Text", + 62:"Input notes to track", + 63:"Edit", + 64:"Generate file...", + 65:"Generate function pack...", + 66:"Generate .mcpack file...", + 67:"Functions(Pack)", + 68:"Save music as blocks into a map", + 69:"Save music as blocks into a exist map...", + 70:"Save music as commands into a map", + 71:"Save music as commands into a exist map...", + 72:"Save music as notebox into a map", + 73:"Save music as notebox into a exist map...", + 74:"World", + 75:"Generate a function that fits current music...", + 76:"Save selected track as commands in .bdx file...", + 77:"Export .bdx file from map...", + 78:"Export .RyStruct file from map...", + 79:"Load functions into a world...", + 80:"Separate long .mcfunction file into small ones and set them into a world as a chain...", + 81:"Additional Functions", + 82:"Show generating result", + 83:"Set a websocket server on localhost:8080 and play the selected track", + 84:"Experimental Functions", + 85:"Clear log file", + 86:"Clear save file(obsolete)", + 87:"Help", + 88:"About", + 89:"Send a bug report", + 90:"Q&A", + 91:"Main Options", + # 92:"", + # 93:"", + # 94:"", + # 95:"", + 96:"Reset Main Options", + 97:"Track Options", + # 98:"", + # 99:"", + # 100:"", + # 101:"", + 102:"Delete Selected Track", + # 103:"", + # 104:"", + + 105:"找不到或无法读取文件😢:{}", + 106:"您当前的项目已修改但未存储,是否先保存当前项目?", + 107:"项目已经存储至:{}", + 108:"音·创工程文件", + 109:"任意类型", + 110:"函数音创工程文件", + 111:"MMFM0.0.6版本工程文件", + 112:"全部类型", + 113:"钢琴声音的音频文件", + 114:"Midi文件", + 115:"文本文件", + 116:"请输入坐标:", + 117:"您输入的格式有误,请重新输入!", + 118:"我的世界指令函数文件", + 119:"请输入执行链生成坐标:", + 120:"您输入的格式有误,请重新输入。", + 121:"您的函数文件不大于一万条指令,无需进行分割操作。", + 122:"请输入执行链生成相对坐标:", + 123:"FastBuilder结构文件", + 124:"转换结束!\n{}", + 125:"一秒,音乐走几拍?", + 126:"按下确认后,在游戏中使用connect指令连接localhost:8080,即可播放", + 127:"请输入区域选择的开始坐标:", + 128:"请输入区域选择的结束坐标:", + 129:"所选区块导出时是否需要保留空气方块?", + 130:"音·创结构文件", + 131:"文件已生成\n{}", + 132:"文件无法生成\n{}\n{}", + 133:"本功能尚未开发。", + 134:"您的称呼", + 135:"您的联系方式", + 136:"您对问题的描述", + 137:"在程序结束后将清除日志及临时文件信息。", + 138:"在程序结束后将不会清除日志及临时文件信息。", + 139:"修改包名", + 140:"修改音乐标题", + 141:"修改玩家选择器\n注意!要加上中括号“[]”", + 142:"修改本音轨的执行实体名", + 143:"修改本音轨所用的积分板", + 144:"修改本音轨所用乐器", + 145:"您输入的乐器并非游戏内置乐器,是否继续用您输入的字符作为乐器?", + 146:"修改本音轨生成的文件名", + +} \ No newline at end of file diff --git a/languages/lang.py b/languages/lang.py index 30215b8..cb1f436 100644 --- a/languages/lang.py +++ b/languages/lang.py @@ -1,113 +1,23 @@ # -*- coding:utf-8 -*- -# 由金羿翻译工具生成字符串列表 -# 请在所需翻译文件前from 此文件 import READABLETEXT + +DEFAULTLANGUAGE = 'en-GB' +LANGUAGELIST = { + 'zh-CN':( + "简体中文 中国大陆", + "Simplified Chinese, China Mainland", + ), + 'en-GB':( + "英式英语 大不列颠", + "British English, Great Britain", + ), +} + +if DEFAULTLANGUAGE == 'zh-CN': + from languages.zhCN import READABLETEXT +elif DEFAULTLANGUAGE == 'en-GB': + from languages.enGB import READABLETEXT -READABLETEXT = { - 0:"错误❌", - 1:"提示❗", - 2:"清除log(此句不载入日志)", - 3:"无法清除日志及临时文件", - 4:"已存储", - 5:"新建 音·创 项目", - 6:"请选择旧类型的项目", - 7:"请选择 音·创 项目", - 8:"无法打开文件:{},请查看您是否输入正确", - 9:"音·创 - 关于", - 10:"我的世界音·创", - 11:"当前版本:{}", - 12:"凌云我的世界开发团队", - 13:"×", - 14:"凌云软件开发团队", - 15:"唯一开发者:金羿(W-YI)", - 16:"Email: EillesWan@outlook.com", - 17:"QQ: 2647547478", - 18:"讨论群: 861684859", - 19:"音·创 - 帮助", - 20:"请选择钢琴声音的音乐文件", - 21:"请选择 MIDI 文件", - 22:"请选择 音符文本 文件", - 23:"获取音符信息", - 24:"音符数据写入{}", - 25:"请选择文件生成的位置", - 26:"请选择文件夹生成的位置", - 27:"请选择.mcpack文件生成的位置", - 28:"坐标信息输入", - 29:"请选择世界文件夹生成的位置", - 30:"请选择函数包生成的位置", - 31:"请选择 .mcfunction 文件", - 32:"请选择需要生成的.bdx文件", - 33:"完成✔", - 34:"输入播放速度", - 35:"创建中", - 36:"请选择世界文件夹所在的位置", - 37:"请确认", - 38:"生成.RyStruct文件", - 39:"失败❌", - 40:"邮件反馈信息输入", - 41:"音·创 - 金羿 - {}", - 42:"执行实体名:{}", - 43:"使用计分板:{}", - 44:"所用的乐器:{}", - 45:"当前音轨名:{}", - 46:"包名:{}", - 47:"音乐标题:{}", - 48:"是否重复:{}", - 49:"玩家选择器:{}", - 50:"修改主设置", - 51:"修改节设置", - 52:"游戏内置乐器如下:请输入英文\n", - 53:"打开音·创项目...", - 54:"打开旧项目...", - 55:"保存项目", - 56:"另存为...", - 57:"退出", - 58:"文件", - 59:"从钢琴MP3导入音轨", - 60:"从midi导入音轨", - 61:"从文本文件导入音轨", - 62:"输入音符至音轨", - 63:"编辑", - 64:"生成文件至...", - 65:"生成函数包至...", - 66:"生成附加包文件至...", - 67:"函数(包)", - 68:"将音乐以方块存储生成地图", - 69:"将音乐以方块存储载入地图…", - 70:"将音乐以指令存储生成地图", - 71:"将音乐以指令存储载入地图…", - 72:"将音乐以音符盒存储生成地图", - 73:"将音乐以音符盒存储载入地图…", - 74:"世界", - 75:"生成符合当前音乐的函数播放器…", - 76:"将选中音轨以指令存储生成.bdx文件…", - 77:"由地图导出至.bdx文件…", - 78:"由地图导出至.RyStruct文件…", - 79:"将函数载入世界…", - 80:"将大函数分割并建立执行链…", - 81:"辅助功能", - 82:"展示生成结果", - 83:"建立位于localhost:8080上的websocket服务器播放选中音轨", - 84:"实验功能", - 85:"清除临时文件", - 86:"清除存在文件", - 87:"帮助", - 88:"关于", - 89:"发送错误日志反馈", - 90:"帮助与疑问", - 91:"音乐总设置(项目设置)", - 92:"地图/函数包名:", - 93:"音乐标题:", - 94:"是否重复:", - 95:"玩家选择器:", - 96:"重置项目设置", - 97:"当前音轨设置(段落设置)", - 98:"执行实体名:", - 99:"使用计分板:", - 100:"所用的乐器:", - 101:"当前音轨名:", - 102:"删除选中音轨", -} \ No newline at end of file diff --git a/languages/lang_en.py b/languages/lang_en.py deleted file mode 100644 index d2253d8..0000000 --- a/languages/lang_en.py +++ /dev/null @@ -1,113 +0,0 @@ -# -*- coding:utf-8 -*- - -# 由金羿翻译工具generate字符串列表 -# 请在所需翻译 file 前from 此 file import READABLETEXT - - - -READABLETEXT = { - 0:"ERROR❌", - 1:"TIPS❗", - 2:"Clearing log(this wont be in the file)", - 3:"Could not clear the temporary files or logs", - 4:"saved", - 5:"New Musicreater Project", - 6:"Select old-type project", - 7:"Select Musicreater Project", - 8:"Cant open:{}, please check if youve entered the right name", - 9:"Musicreat - Aboit", - 10:"Musicreater", - 11:"Ver. {}", - 12:"RYOUN", - 13:"凌云团队", - 14:"Team-Ryoun", - 15:"Developer: Eilles(W-YI)", - 16:"Email: EillesWan@outlook.com", - 17:"QQ: 2647547478", - 18:"QQ group: 861684859", - 19:"Musicreater - Help", - 20:"Select sound file", - 21:"Select MIDI file", - 22:"Select NoteText file", - 23:"Get Note info", - 24:"Write in Note info: {}", - 25:"Select generating file", - 26:"Select generating folder", - 27:"Select generating .mcpack file", - 28:"Input position info", - 29:"Select generating world folder", - 30:"Select generating Function Pack", - 31:"Select .mcfunction file ", - 32:"Select .bdx file ", - 33:"DONE✔", - 34:"Input playing rate", - 35:"Generating", - 36:"Select a world folder", - 37:"Make sure", - 38:"Generate .RyStruct file", - 39:"FAILED❌", - 40:"邮件反馈信息输入", - 41:"Musicreater - Eilles - {}", - 42:"执行实体名: {}", - 43:"使用计分板: {}", - 44:"所用的乐器: {}", - 45:"当前音轨名: {}", - 46:"Pack Name: {}", - 47:"MusicTitle: {}", - 48:"IsRepeat?: {}", - 49:"玩家选择器: {}", - 50:"修改主设置", - 51:"修改节设置", - 52:"游戏内置乐器如下: 请输入英文\n", - 53:"Open...", - 54:"Open Old Project...", - 55:"Save", - 56:"Save as...", - 57:"Exit", - 58:"File", - 59:"Load tracks from sound", - 60:"Load tracks from Midi", - 61:"Load tracks from Text", - 62:"Input notes to track", - 63:"Edit", - 64:"Generate file...", - 65:"Generate function pack...", - 66:"Generate .mcpack file...", - 67:"Functions(Pack)", - 68:"Save music as blocks into a map", - 69:"Save music as blocks into a exist map...", - 70:"Save music as commands into a map", - 71:"Save music as commands into a exist map...", - 72:"Save music as notebox into a map", - 73:"Save music as notebox into a exist map...", - 74:"World", - 75:"generate符合当前音乐的函数播放器...", - 76:"Save selected track as commands in .bdx file...", - 77:"由 map导出至.bdx file...", - 78:"由 map导出至.RyStruct file...", - 79:"将函数载入 world...", - 80:"将大函数分割并建立执行链...", - 81:"辅助功能", - 82:"Show generating result", - 83:"建立位于localhost:8080上的websocket服务器播放选中音轨", - 84:"实验功能", - 85:"清除临时 file ", - 86:"清除存在 file ", - 87:"帮助", - 88:"关于", - 89:"发送错误日志反馈", - 90:"帮助与疑问", - 91:"音乐总设置(项目设置)", - 92:" map/函数包名: ", - 93:"音乐标题: ", - 94:"是否重复: ", - 95:"玩家选择器: ", - 96:"重置项目设置", - 97:"当前音轨设置(段落设置)", - 98:"执行实体名: ", - 99:"使用计分板: ", - 100:"所用的乐器: ", - 101:"当前音轨名: ", - 102:"删除选中音轨", - -} \ No newline at end of file diff --git a/languages/zhCN.py b/languages/zhCN.py new file mode 100644 index 0000000..e3d4ef0 --- /dev/null +++ b/languages/zhCN.py @@ -0,0 +1,161 @@ +# -*- coding:utf-8 -*- + +# 由金羿翻译工具生成字符串列表 +# 请在所需翻译文件前from 此文件 import READABLETEXT + + + + +READABLETEXT = { + 'Translator':(("金羿 Eilles 原稿",True),), + # 此处是语言翻译者列表,其中每个元组第一项为显示文本,第二项为此文本是否为开发者名字 + 0:"错误❌", + 1:"提示❗", + 2:"清除log(此句不载入日志)", + 3:"无法清除日志及临时文件", + 4:"已存储", + 5:"新建 音·创 项目", + 6:"请选择旧类型的项目", + 7:"请选择 音·创 项目", + 8:"无法打开文件:{},请查看您是否输入正确", + 9:"音·创 - 关于", + 10:"音·创 Musicreater", + 11:"当前版本:{}", + 12:"""凌云我的世界开发团队\n×\n凌云计算机应用软件开发团队""", + 13:"确定", + 14:"请输入音符", + 15:(("- 开发者 -",False),("金羿 Eilles",True),("EillesWan@outlook.com",False),("QQ 2647547478",False)), + # 此处是开发者列表,其中每个元组第一项为显示文本,第二项为此文本是否为开发者名字 + 16:"- 翻译者 -", + # 17:"", + 18:"讨论群: 861684859", + 19:"音·创 - 帮助", + 20:"请选择钢琴声音的音乐文件", + 21:"请选择 MIDI 文件", + 22:"请选择 音符文本 文件", + 23:"获取音符信息", + 24:"音符数据写入{}", + 25:"请选择文件生成的位置", + 26:"请选择文件夹生成的位置", + 27:"请选择.mcpack文件生成的位置", + 28:"坐标信息输入", + 29:"请选择世界文件夹生成的位置", + 30:"请选择函数包生成的位置", + 31:"请选择 .mcfunction 文件", + 32:"请选择需要生成的.bdx文件", + 33:"完成✔", + 34:"输入播放速度", + 35:"创建中", + 36:"请选择世界文件夹所在的位置", + 37:"请确认", + 38:"生成.RyStruct文件", + 39:"失败❌", + 40:"邮件反馈信息输入", + 41:"音·创 - 金羿 - {}", + 42:"执行实体名:{}", + 43:"使用计分板:{}", + 44:"所用的乐器:{}", + 45:"当前音轨名:{}", + 46:"包名:{}", + 47:"音乐标题:{}", + 48:"是否重复:{}", + 49:"玩家选择器:{}", + 50:"修改主设置", + 51:"修改节设置", + 52:"游戏内置乐器如下:请输入英文\n", + 53:"打开音·创项目...", + 54:"打开旧项目...", + 55:"保存项目", + 56:"另存为...", + 57:"退出", + 58:"文件", + 59:"从钢琴MP3导入音轨", + 60:"从midi导入音轨", + 61:"从文本文件导入音轨", + 62:"输入音符至音轨", + 63:"编辑", + 64:"生成文件至...", + 65:"生成函数包至...", + 66:"生成附加包文件至...", + 67:"函数(包)", + 68:"将音乐以方块存储生成地图", + 69:"将音乐以方块存储载入地图…", + 70:"将音乐以指令存储生成地图", + 71:"将音乐以指令存储载入地图…", + 72:"将音乐以音符盒存储生成地图", + 73:"将音乐以音符盒存储载入地图…", + 74:"世界", + 75:"生成符合当前音乐的函数播放器…", + 76:"将选中音轨以指令存储生成.bdx文件…", + 77:"由地图导出至.bdx文件…", + 78:"由地图导出至.RyStruct文件…", + 79:"将函数载入世界…", + 80:"将大函数分割并建立执行链…", + 81:"辅助功能", + 82:"展示生成结果", + 83:"建立位于localhost:8080上的websocket服务器播放选中音轨", + 84:"实验性功能", + 85:"清除日志文件", + 86:"清除早期版本的存储文件", + 87:"帮助", + 88:"关于", + 89:"发送错误日志反馈", + 90:"帮助与疑问", + 91:"音乐总设置(项目设置)", + # 92:"", + # 93:"", + # 94:"", + # 95:"", + 96:"重置项目设置", + 97:"当前音轨设置(段落设置)", + # 98:"", + # 99:"", + # 100:"", + # 101:"", + 102:"删除选中音轨", + # 103:"", + # 104:"", + 105:"找不到或无法读取文件😢:{}", + 106:"您当前的项目已修改但未存储,是否先保存当前项目?", + 107:"项目已经存储至:{}", + 108:"音·创工程文件", + 109:"任意类型", + 110:"函数音创工程文件", + 111:"MMFM0.0.6版本工程文件", + 112:"全部类型", + 113:"钢琴声音的音频文件", + 114:"Midi文件", + 115:"文本文件", + 116:"请输入坐标:", + 117:"您输入的格式有误,请重新输入!", + 118:"我的世界指令函数文件", + 119:"请输入执行链生成坐标:", + 120:"您输入的格式有误,请重新输入。", + 121:"您的函数文件不大于一万条指令,无需进行分割操作。", + 122:"请输入执行链生成相对坐标:", + 123:"FastBuilder结构文件", + 124:"转换结束!\n{}", + 125:"一秒,音乐走几拍?", + 126:"按下确认后,在游戏中使用connect指令连接localhost:8080,即可播放", + 127:"请输入区域选择的开始坐标:", + 128:"请输入区域选择的结束坐标:", + 129:"所选区块导出时是否需要保留空气方块?", + 130:"音·创结构文件", + 131:"文件已生成\n{}", + 132:"文件无法生成\n{}\n{}", + 133:"本功能尚未开发。", + 134:"您的称呼", + 135:"您的联系方式", + 136:"您对问题的描述", + 137:"在程序结束后将清除日志及临时文件信息。", + 138:"在程序结束后将不会清除日志及临时文件信息。", + 139:"修改包名", + 140:"修改音乐标题", + 141:"修改玩家选择器\n注意!要加上中括号“[]”", + 142:"修改本音轨的执行实体名", + 143:"修改本音轨所用的积分板", + 144:"修改本音轨所用乐器", + 145:"您输入的乐器并非游戏内置乐器,是否继续用您输入的字符作为乐器?", + 146:"修改本音轨生成的文件名", + +} \ No newline at end of file diff --git a/msctspt/__pycache__/bugReporter.cpython-38.pyc b/msctspt/__pycache__/bugReporter.cpython-38.pyc index 678c856..7b25111 100644 Binary files a/msctspt/__pycache__/bugReporter.cpython-38.pyc and b/msctspt/__pycache__/bugReporter.cpython-38.pyc differ diff --git a/msctspt/bugReporter.py b/msctspt/bugReporter.py index b2299b8..4d25b8f 100644 --- a/msctspt/bugReporter.py +++ b/msctspt/bugReporter.py @@ -21,7 +21,7 @@ def makeZip(sourceDir, outFilename,compression = 8,exceptFile = None): for parent, dirnames, filenames in os.walk(sourceDir): for filename in filenames: if filename == exceptFile: - continue; + continue print(filename) pathfile = os.path.join(parent, filename) arcname = pathfile[pre_len:].strip(os.path.sep) #相对路径 @@ -43,51 +43,51 @@ class report(): ''':param senderName 发送者名称 :param senderContact 发送者联系方式 :param describetion 问题描述''' - self.senderName = senderName; - self.senderContact = senderContact; - self.describetion = describetion; + self.senderName = senderName + self.senderContact = senderContact + self.describetion = describetion if not self.senderName : - self.senderName = 'Unknown'; + self.senderName = 'Unknown' if not self.senderContact : - self.senderContact = 'None'; + self.senderContact = 'None' def emailReport(self): '''使用E-mail方法发送当前的日志和临时文件等''' import smtplib - from email.mime.text import MIMEText; - from email.mime.multipart import MIMEMultipart; - from email.header import Header; + from email.mime.text import MIMEText + from email.mime.multipart import MIMEMultipart + from email.header import Header from nmcsup.log import log log("发送错误报告") - import os; + import os log("添加标题与正文") - msg = MIMEMultipart(); + msg = MIMEMultipart() #发送者与接收者显示名称 - msg["From"] = Header(self.senderName,'utf-8'); - msg["To"] = Header("W-YI (QQ2647547478)",'utf-8'); + msg["From"] = Header(self.senderName,'utf-8') + msg["To"] = Header("W-YI (QQ2647547478)",'utf-8') #标题 - msg["Subject"] = '音·创 - 来自 '+self.senderName+' 的错误报告'; + msg["Subject"] = '音·创 - 来自 '+self.senderName+' 的错误报告' #正文 - msg.attach(MIMEText("来自"+self.senderName+"( "+self.senderContact+" )的错误描述:\n"+self.describetion,'plain','utf-8')); + msg.attach(MIMEText("来自"+self.senderName+"( "+self.senderContact+" )的错误描述:\n"+self.describetion,'plain','utf-8')) log("添加完毕,正在生成压缩包...") - makeZip("./","Temps&Logs.zip",exceptFile="Temps&Logs.zip"); - attafile=MIMEText(open("Temps&Logs.zip",'rb').read(),"base64",'gb2312'); - attafile["Content-Type"] = 'application/octet-stream'; - attafile["Content-Disposition"] = 'attachment;filename="BugReport_from_'+self.senderName+'.zip"'; - msg.attach(attafile); + makeZip("./","Temps&Logs.zip",exceptFile="Temps&Logs.zip") + attafile=MIMEText(open("Temps&Logs.zip",'rb').read(),"base64",'gb2312') + attafile["Content-Type"] = 'application/octet-stream' + attafile["Content-Disposition"] = 'attachmentfilename="BugReport_from_'+self.senderName+'.zip"' + msg.attach(attafile) log("完毕,准备发送") try: smtp = smtplib.SMTP() - smtp.connect("smtp.163.com"); - #smtp.login("RyounDevTeam@163.com","RyounDaiYi99"); + smtp.connect("smtp.163.com") + #smtp.login("RyounDevTeam@163.com","RyounDaiYi99") #SIQQKQQYCZRVIDFJ是授权密码 - smtp.login("RyounDevTeam@163.com","SIQQKQQYCZRVIDFJ"); + smtp.login("RyounDevTeam@163.com","SIQQKQQYCZRVIDFJ") smtp.sendmail("RyounDevTeam@163.com",["RyounDevTeam@163.com",],msg.as_string()) log("错误汇报邮件已发送") except smtplib.SMTPException as e: - log("错误汇报邮件发送失败:\n"+str(e)); + log("错误汇报邮件发送失败:\n"+str(e)) log("清空内存和临时文件") del msg,attafile os.remove("./Temps&Logs.zip") @@ -102,7 +102,7 @@ class version: libraries = ('mido','amulet','amulet-core','amulet-nbt','piano_transcription_inference','pypinyin','pyinstaller','py7zr','websockets','torch') '''当前所需库,有一些是开发用的,用户不需要安装''' - version = ('0.0.0','Delta',) + version = ('0.0.1','Delta',) '''当前版本''' def __init__(self) -> None: @@ -122,12 +122,13 @@ class version: try: shutil.rmtree(os.getenv('APPDATA')+'\\Musicreater\\') except: - pass; + pass for i in self.libraries: print("安装库:"+i) os.system("python -m pip install "+i+" -i https://pypi.tuna.tsinghua.edu.cn/simple") elif platform == 'linux': os.system("sudo apt-get install python3-pip") + os.system("sudo apt-get install python3-tk") os.system("sudo apt-get install python3-tkinter") for i in self.libraries: print("安装库:"+i) diff --git a/msctspt/funcOpera.py b/msctspt/funcOpera.py index c106a3f..4d064fc 100644 --- a/msctspt/funcOpera.py +++ b/msctspt/funcOpera.py @@ -12,21 +12,21 @@ def delPart(Data,starter,ender,includeStart :bool= True,includend :bool= True): starter与ender若为None则默认从首或尾开始''' try: if starter == None: - includeStart = True; - starter = Data[0]; + includeStart = True + starter = Data[0] if ender == None: - includend = True; - ender = Data[len(Data)-1]; + includend = True + ender = Data[len(Data)-1] if includend: if includeStart: - return Data[Data.index(starter):len(Data)-Data[len(Data)::-1].index(ender)]; + return Data[Data.index(starter):len(Data)-Data[len(Data)::-1].index(ender)] else: - return Data[Data.index(starter)+1:len(Data)-Data[len(Data)::-1].index(ender)]; + return Data[Data.index(starter)+1:len(Data)-Data[len(Data)::-1].index(ender)] else: if includeStart: - return Data[Data.index(starter):len(Data)-Data[len(Data)::-1].index(ender)-1]; + return Data[Data.index(starter):len(Data)-Data[len(Data)::-1].index(ender)-1] else: - return Data[Data.index(starter)+1:len(Data)-Data[len(Data)::-1].index(ender)-1]; + return Data[Data.index(starter)+1:len(Data)-Data[len(Data)::-1].index(ender)-1] except: return 0 @@ -37,21 +37,21 @@ def keepart(Data,starter,ender,includeStart :bool= True,includend :bool= True): starter与ender若为None则默认从首或尾开始''' try: if starter == None: - includeStart = True; - starter = Data[0]; + includeStart = True + starter = Data[0] if ender == None: - includend = True; - ender = Data[len(Data)-1]; + includend = True + ender = Data[len(Data)-1] if includend: if includeStart: - return Data[Data.index(starter):Data.index(ender)+1]; + return Data[Data.index(starter):Data.index(ender)+1] else: - return Data[Data.index(starter)+1:Data.index(ender)+1]; + return Data[Data.index(starter)+1:Data.index(ender)+1] else: if includeStart: - return Data[Data.index(starter):Data.index(ender)]; + return Data[Data.index(starter):Data.index(ender)] else: - return Data[Data.index(starter)+1:Data.index(ender)]; + return Data[Data.index(starter)+1:Data.index(ender)] except: return 0 @@ -66,13 +66,13 @@ def keepart(Data,starter,ender,includeStart :bool= True,includend :bool= True): def lenFunction(fun) -> int: '''取得函数指令部分长度,即忽略#开头的注释''' try: - l = 0; + l = 0 for i in fun: if i.replace(" ",'')[0] == '#': - l += 1; - return len(fun)-l; + l += 1 + return len(fun)-l except: - return -1; + return -1 @@ -82,21 +82,21 @@ def funSplit(bigFile,maxCmdLen : int = 10000 ): 返回-1为大小低于maxCmdLen最长函数指令长度''' bigFile = bigFile.readlines() if lenFunction(bigFile) < maxCmdLen: - return -1; - part = []; - parts = []; - l = 0; + return -1 + part = [] + parts = [] + l = 0 for i in bigFile: if i.replace(" ",'')[0] == '#': - part.append(i+'\n'); + part.append(i+'\n') else: - part.append(i+'\n'); - l += 1; + part.append(i+'\n') + l += 1 if l >= 10000: parts.append(part) - part = []; - l = 0; - return parts; + part = [] + l = 0 + return parts diff --git a/msctspt/transfer.py b/msctspt/transfer.py index d8a6492..1c6b029 100644 --- a/msctspt/transfer.py +++ b/msctspt/transfer.py @@ -13,7 +13,7 @@ def hans2pinyin(hans,style=3): result = lazy_pinyin(hans=hans,style=style) final = '' for i in result: - final += i; + final += i return final @@ -83,7 +83,7 @@ def note2bdx(filePath:str,dire:list,Notes : list,ScoreboardName:str,Instrument:s i = 0 down = False blocks = [formCmdBlock(dire,cdl.pop(0),1,1)] - dire[1]+=1; + dire[1]+=1 for j in cdl: if dire[1]+i > height: dire[0]+=1 @@ -124,12 +124,12 @@ def note2webs(Notes : list,Instrument:str, speed:float = 5.0, PlayerSelect:str=' await fcwslib.tellraw(websocket, '已连接服务器——音·创'+VER[1]+VER[0]+' 作者:金羿(W-YI)') if isProsess: length = len(Notes) - j = 1; + j = 1 for i in range(len(Notes)): await fcwslib.send_command(websocket,'execute @a'+PlayerSelect+' ~ ~ ~ playsound '+Instrument+' @s ~ ~ ~ 1000 '+str(Notes[i][0])+' 1000') if isProsess: fcwslib.send_command(websocket,'execute @a'+PlayerSelect+' ~ ~ ~ title @s actionbar §e▶ 播放中: §a'+str(j)+'/'+str(length)+' || '+str(int(j/length*1000)/10)) - j+=1; + j+=1 time.sleep(Notes[i][1]/speed) fcwslib.run_server(run_server) @@ -170,19 +170,19 @@ def note2RSworld(world:str,startpos:list,notes:list,instrument:str,speed:float = :param note: 0~24 :return Block()''' if powered: - powered = 'true'; + powered = 'true' else: - powered = 'false'; + powered = 'false' return Block('universal_minecraft','noteblock',{"instrument":ts(instrument.replace("note.",'')),'note':ts(str(note)),'powered':ts(powered)}) def formRepeater(delay:int,facing:str,locked:bool=False,powered:bool=False): '''生成中继器方块 :param delay: 1~4 :return Block()''' - if powered:powered = 'true'; - else:powered = 'false'; - if locked:locked = 'true'; - else:locked = 'false'; + if powered:powered = 'true' + else:powered = 'false' + if locked:locked = 'true' + else:locked = 'false' return Block('universal_minecraft','repeater',{"delay":ts(str(delay)),'facing':ts(facing),'locked':ts(locked),'powered':ts(powered)}) diff --git a/nmcsup/trans.py b/nmcsup/trans.py index c39aba5..fc712b3 100644 --- a/nmcsup/trans.py +++ b/nmcsup/trans.py @@ -147,7 +147,7 @@ def Cmd2World(cmd:list,world:str,dire:list): chunk.block_entities[(dire[0], dire[1], dire[2])] = universal_block_entity chunk.changed = True #集体上移 - dire[1]+=1; + dire[1]+=1 #真正开始 down = False for j in cdl: diff --git a/查看代码数.py b/查看代码数.py index 1e5ce50..8a08738 100644 --- a/查看代码数.py +++ b/查看代码数.py @@ -16,12 +16,12 @@ for path,dir_list,file_list in os.walk(r"./") : try: code -= code[code.index('#'):] except: - pass; + pass if code: print("\t"+code) l+=1 else: - pass; + pass input("\n最终代码行数为:"+str(l))