From a2c2afaede084816ec0333cda4828bf321ec3ae0 Mon Sep 17 00:00:00 2001 From: EillesWan Date: Sun, 29 Oct 2023 00:52:56 +0800 Subject: [PATCH] =?UTF-8?q?GUI=E7=89=88=E6=9C=AC=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- llc_clgui.py | 302 ------------------------ llc_win_tk.py | 110 --------- llc_win_wxPython.py | 365 ++++++++---------------------- wxFB_Project/LingLunConverter.fbp | 113 +++++++-- 4 files changed, 193 insertions(+), 697 deletions(-) delete mode 100644 llc_clgui.py delete mode 100644 llc_win_tk.py diff --git a/llc_clgui.py b/llc_clgui.py deleted file mode 100644 index c52bb87..0000000 --- a/llc_clgui.py +++ /dev/null @@ -1,302 +0,0 @@ -# -*- coding: utf-8 -*- - -# 伶伦 开发交流群 861684859 - - -""" -伶伦转换器 -Linglun Converter - -版权所有 © 2023 金羿 & 睿穆开发组 -Copyright © 2023 EillesWan & TriM Org. - -开源相关声明请见 ./License.md -Terms & Conditions: ./Lisense.md -""" - -__version__ = "0.0.1" - -import datetime -import os -import random -import sys - -import Musicreater -from Musicreater.constants import DEFAULT_PROGRESSBAR_STYLE -from Musicreater.plugin import ConvertConfig -from Musicreater.plugin.addonpack import ( - to_addon_pack_in_delay, - to_addon_pack_in_repeater, - to_addon_pack_in_score, -) -from Musicreater.plugin.bdxfile import to_BDX_file_in_delay, to_BDX_file_in_score -from utils.io import * - -# from Musicreater.plugin.mcstructure import commands_to_structure, commands_to_redstone_delay_structure - - -MainConsole.print( - "[#121110 on #F0F2F4] ", - style="#121110 on #F0F2F4", - justify="center", -) - -osc.project_name = "伶伦转换器" -osc.version = __version__ - - -if len(sys.argv) > 0: - - def go_for_args(debugMode: str = "False", logfile: str = "True"): - global logger - osc.isRelease = False if debugMode.lower() in ("true", "1") else True - logger.printing = not osc.isRelease - logger.writing = True if logfile.lower() in ("true", "1") else False - - go_for_args(*sys.argv) - - -# 显示大标题 -MainConsole.rule(title="[bold #AB70FF]欢迎使用伶伦独立转换器", characters="=", style="#26E2FF") -# MainConsole.rule(title="[bold #AB70FF]Welcome to Linglun Converter", characters="-") -MainConsole.rule( - title="[#AB70FF]版本{} | 音·创内核版本{}".format(__version__, Musicreater.__version__), - characters="-", - style="#26E2FF", -) - -nowYang = datetime.datetime.now() - -if nowYang.month == 8 and nowYang.day == 6: - # 诸葛八卦生日 - MainConsole.print( - "[#7DB5F0 on #121110]今天可不是催更的日子!\n诸葛亮与八卦阵{}岁生日快乐!".format(nowYang.year - 2008), - style="#7DB5F0 on #121110", - justify="center", - ) -elif nowYang.month == 4 and nowYang.day == 3: - # 金羿生日快乐 - MainConsole.print( - "[#0089F2 on #F0F2F4]今天就不要催更啦!\n金羿{}岁生日快乐!".format(nowYang.year - 2006), - style="#0089F2 on #F0F2F4", - justify="center", - ) -else: - # 显示箴言部分 - MainConsole.print( - "[#121110 on #F0F2F4]{}".format(random.choice(myWords)), - style="#121110 on #F0F2F4", - justify="center", - ) - -# prt(f"{_('LangChd')}{_(':')}{_(currentLang)}") - - -def format_ipt( - notice: str, - fun, - err_note: str = "输入内容有误,请重新输入。", - *extraArg, -): - """循环输入,以某种格式 - notice: 输入时的提示 - fun: 格式函数 - err_note: 输入不符格式时的提示 - *extraArg: 对于函数的其他参数""" - while True: - result = ipt(notice) - try: - fun_result = fun(result, *extraArg) - break - except ValueError: - prt(err_note) - continue - return result, fun_result - - -# 获取midi列表 -while True: - midi_path = ipt(f"MIDI地址或所在目录地址:") - try: - if os.path.exists(midi_path): - if os.path.isfile(midi_path): - midis = (midi_path,) - elif os.path.isdir(midi_path): - midis = ( - os.path.join(midi_path, i) - for i in os.listdir(midi_path) - if i.lower().endswith(".mid") or i.lower().endswith(".midi") - ) - else: - prt("输入内容有误,请重新输入。") - continue - else: - prt("该地址不存在,或无法访问该地址,请重新输入。") - continue - except PermissionError: - prt("无法访问该地址,请检查是否给予程序相关文件的访问权限。") - continue - break - -# 获取输出地址 -while True: - out_path = ipt(f"文件生成输出地址:") - try: - if not os.path.exists(out_path): - prt("该地址不存在,或无法访问该地址,请重新输入。") - continue - except PermissionError: - prt("无法访问该地址,请检查是否给予程序相关文件的访问权限。") - continue - break - - -# 选择输出格式 - - -def is_in_bdx_mcpack(sth: str): - return isin(sth, {1: ("bdx", "1", "币帝查", "币帝·艾克斯"), 0: ("mcpack", "0", "唉姆西·派克")}) - - -def is_in_player(sth: str): - return isin( - sth, - { - 0: ("delay", "0", "延迟", "帝蕾"), - 1: ("score", "1", "计分板", "积分", "积分板", "计分", "斯阔尔"), - 2: ("repeater", "2", "中继器", "瑞皮特"), - }, - ) - - -output_file_format = format_ipt( - "输出文件类型 (mcpack/0|bdx/1)", - is_in_bdx_mcpack, - "输入内容有误,请重新输入。", -)[1] - -if output_file_format == 0: - player_format = format_ipt( - "播放器类型 (延迟/0|计分板/1|中继器/2)", - is_in_player, - "输入内容有误,请重新输入。", - )[1] -else: - player_format = format_ipt( - "播放器类型 (延迟/0|计分板/1)", - is_in_player, - "输入内容有误,请重新输入。", - )[1] - -old_exe_enabled = not format_ipt( - "启用新版代执行指令 (否/0|是/1):", bool_str, "输入内容格式错误,应为 是/1/真/t/y 或 否/0/假/f/n" -)[1] - - -if os.path.exists("./demo_config.json"): - import json - - prompts = json.load(open("./demo_config.json", "r", encoding="utf-8")) - - prompts = prompts[:-1] -else: - prompts = [] - # 提示语 检测函数 错误提示语 - for args in [ - ( - "音量大小 (0,1]:", - float_str, - ), - ( - "速度倍率 (0,+∞):", - float_str, - ), - ( - "自动生成进度条 (否/0|是/1):", - bool_str, - ), - ( - "计分板名称:", - str, - ) - if player_format == 1 - else ( - "受播放玩家的选择器:", - str, - ), - ( - "自动重置计分板 (否/0|是/1):", - bool_str, - ) - if player_format == 1 - else (), - ( - "BDX作者署名:", - str, - ) - if output_file_format == 1 - else (), - ( - "结构生成最大高度 (0,+∞):", - int, - ) - if player_format == 0 - else (), - ]: - if args: - prompts.append( - format_ipt(*args, err_note="输入内容格式错误,应符合 {}".format(args[1]))[1] - ) - -if prompts[2]: - costom_pgb_enabled = format_ipt( - "自定义进度条样式 (否/0|是/1):", bool_str, "输入内容格式错误,应为 是/1/真/t/y 或 否/0/假/f/n" - )[1] - if costom_pgb_enabled: - style = ipt("基本样式组 (回车默认):") - if not style: - style = DEFAULT_PROGRESSBAR_STYLE[0] - yet_part = ipt("未播放样式 (回车默认):") - if not yet_part: - yet_part = DEFAULT_PROGRESSBAR_STYLE[1][1] - done_part = ipt("已播放样式 (回车默认):") - if not done_part: - done_part = DEFAULT_PROGRESSBAR_STYLE[1][0] - -if player_format == 1: - cvt_method = to_addon_pack_in_score -elif player_format == 0: - cvt_method = to_addon_pack_in_delay -elif player_format == 2: - cvt_method = to_addon_pack_in_repeater - - -for singleMidi in midis: - prt("\n" f"正在处理 {singleMidi}") - cvt_mid = Musicreater.MidiConvert.from_midi_file( - singleMidi, old_exe_format=old_exe_enabled - ) - cvt_cfg = ConvertConfig(out_path, *prompts[:2], progressbar=((style, (done_part, yet_part)) if costom_pgb_enabled else True) if prompts[2] else False) # type: ignore - - conversion_result = ( - (cvt_method(cvt_mid, cvt_cfg, *prompts[3:])) # type: ignore - if output_file_format == 0 - else ( - to_BDX_file_in_score(cvt_mid, cvt_cfg, *prompts[3:]) - if player_format == 1 - else to_BDX_file_in_delay(cvt_mid, cvt_cfg, *prompts[3:]) - ) - ) - - prt( - f" 指令总长:{conversion_result[0]},播放刻数:{conversion_result[1]}{f''',结构大小:{conversion_result[2]},末点坐标:{conversion_result[3]}''' if output_file_format == 1 else ''}" # type: ignore - ) - -exitSth = ipt("结束。换行以退出程序。") -if exitSth == "record": - import json - - with open("./demo_config.json", "w", encoding="utf-8") as f: - json.dump(prompts, f) -elif exitSth == "delrec": - os.remove("./demo_config.json") diff --git a/llc_win_tk.py b/llc_win_tk.py deleted file mode 100644 index 69694d7..0000000 --- a/llc_win_tk.py +++ /dev/null @@ -1,110 +0,0 @@ -# -*- coding: utf-8 -*- - -# 伶伦 开发交流群 861684859 - - -""" -伶伦转换器 -Linglun Converter - -版权所有 © 2023 金羿 & 睿穆开发组 -Copyright © 2023 EillesWan & TriM Org. - -开源相关声明请见 ./License.md -Terms & Conditions: ./Lisense.md -""" - -__version__ = "0.0.1" - -import datetime -import os -import random -import sys - - -import Musicreater -from Musicreater.plugin import ConvertConfig -from Musicreater.plugin.bdxfile import to_BDX_file_in_delay, to_BDX_file_in_score -from Musicreater.plugin.addonpack import ( - to_addon_pack_in_delay, - to_addon_pack_in_repeater, - to_addon_pack_in_score, -) -from Musicreater.constants import DEFAULT_PROGRESSBAR_STYLE - - -from utils.io import * - -osc.project_name = "伶伦转换器" -osc.version = __version__ - - -def __main__(): - MainConsole.print( - "[#121110 on #F0F2F4] ", - style="#121110 on #F0F2F4", - justify="center", - ) - - if len(sys.argv) > 0: - - def go_for_args(debugMode: str = "False", logfile: str = "True"): - global logger - osc.isRelease = False if debugMode.lower() in ("true", "1") else True - logger.printing = not osc.isRelease - logger.writing = True if logfile.lower() in ("true", "1") else False - - go_for_args(*sys.argv) - - # 显示大标题 - MainConsole.rule(title="[bold #AB70FF]欢迎使用伶伦独立转换器", characters="=", style="#26E2FF") - MainConsole.rule(title="[bold #AB70FF]Welcome to Linglun Converter", characters="-") - - nowYang = datetime.datetime.now() - - if nowYang.month == 8 and nowYang.day == 6: - # 诸葛八卦生日 - MainConsole.print( - "[#7DB5F0 on #121110]今天可不是催更的日子!\n诸葛亮与八卦阵{}岁生日快乐!".format( - nowYang.year - 2008 - ), - style="#7DB5F0 on #121110", - justify="center", - ) - elif nowYang.month == 4 and nowYang.day == 3: - # 金羿生日快乐 - MainConsole.print( - "[#0089F2 on #F0F2F4]今天就不要催更啦!\n金羿{}岁生日快乐!".format(nowYang.year - 2006), - style="#0089F2 on #F0F2F4", - justify="center", - ) - else: - # 显示箴言部分 - MainConsole.print( - "[#121110 on #F0F2F4]{}".format(random.choice(myWords)), - style="#121110 on #F0F2F4", - justify="center", - ) - - prt("伶伦转换器简易版 正在启动……") - - prt("更新执行位置...") - if sys.platform == "win32": - try: - os.chdir( - __file__[: len(__file__) - __file__[len(__file__) :: -1].index("\\")] - ) - logger.info("Win32 更新执行位置,当前文件位置 {}".format(__file__)) - except FileNotFoundError: - pass - else: - try: - os.chdir( - __file__[: len(__file__) - __file__[len(__file__) :: -1].index("/")] - ) - except FileNotFoundError: - pass - log("其他平台:{} 更新执行位置,当前文件位置 {}".format(sys.platform, __file__)) - prt("完成!") - - prt("载入功能……") diff --git a/llc_win_wxPython.py b/llc_win_wxPython.py index 2969f18..5687516 100644 --- a/llc_win_wxPython.py +++ b/llc_win_wxPython.py @@ -19,20 +19,21 @@ from Musicreater.plugin.addonpack import ( ) from Musicreater.plugin.bdxfile import to_BDX_file_in_delay, to_BDX_file_in_score -import TrimLog +# import TrimLog import wx -from TrimLog import Console, object_constants -from utils.io import prt +# from TrimLog import Console, object_constants -is_logging: bool = True +# from utils.io import prt -osc = object_constants.ObjectStateConstant() -logger = TrimLog.Logger( - is_logging=is_logging, - printing=not osc.isRelease, - in_suffix=".llc", -) +# is_logging: bool = True + +# osc = object_constants.ObjectStateConstant() +# logger = TrimLog.Logger( +# is_logging=is_logging, +# printing=not osc.isRelease, +# in_suffix=".llc", +# ) WHITE = (242, 244, 246) # F2F4F6 BLACK = (18, 17, 16) # 121110 @@ -48,15 +49,18 @@ try: .split("\n") ) except (ConnectionError, urllib.error.HTTPError) as E: - logger.warning(f"读取言·论信息发生 互联网连接 错误:\n{E}") + # logger.warning(f"读取言·论信息发生 互联网连接 错误:\n{E}") myWords = ["以梦想为驱使 创造属于自己的未来"] # noinspection PyBroadException except BaseException as E: - logger.warning(f"读取言·论信息发生 未知 错误:\n{E}") + # logger.warning(f"读取言·论信息发生 未知 错误:\n{E}") myWords = ["灵光焕发 深艺献心"] __appname__ = "伶伦转换器" -__version__ = "WXGUI 0.0.1" +__version__ = "WXGUI 0.0.2" + + +yanlun_length = len(myWords) # 创建应用程序类 @@ -80,7 +84,7 @@ class LingLunMainFrame(wx.Frame): id=wx.ID_ANY, title="{} {}".format(__appname__, __version__), pos=wx.DefaultPosition, - size=wx.Size(651, 759), + size=wx.Size(660, 780), style=wx.DEFAULT_FRAME_STYLE | wx.TAB_TRAVERSAL, ) @@ -116,10 +120,11 @@ class LingLunMainFrame(wx.Frame): wx.StaticBox(self, wx.ID_ANY, "言·论"), wx.VERTICAL ) + self.yanlun_now = random.randrange(0, yanlun_length) self.m_LinglunWords_staticText1 = wx.StaticText( s_yanLunbarSizer.GetStaticBox(), wx.ID_ANY, - random.choice(myWords) + "\r", + myWords[self.yanlun_now] + "\r", wx.DefaultPosition, wx.DefaultSize, wx.ALIGN_CENTER_HORIZONTAL | wx.ST_ELLIPSIZE_MIDDLE | wx.ST_NO_AUTORESIZE, @@ -155,33 +160,36 @@ class LingLunMainFrame(wx.Frame): s_midiChooseSizer = wx.BoxSizer(wx.HORIZONTAL) self.m_ChooseMidiTips_staticText3 = wx.StaticText( - self, wx.ID_ANY, "选择MIDI文件", wx.DefaultPosition, wx.DefaultSize, 0 + self, wx.ID_ANY, "选择MIDI文件\n(双击移除)", wx.DefaultPosition, wx.DefaultSize, 0 ) self.m_ChooseMidiTips_staticText3.Wrap(-1) - s_midiChooseSizer.Add(self.m_ChooseMidiTips_staticText3, 0, wx.ALL, 5) + s_midiChooseSizer.Add( + self.m_ChooseMidiTips_staticText3, 0, wx.ALL | wx.ALIGN_CENTER_VERTICAL, 5 + ) ss_MidiChooserSizer_bSizer9 = wx.BoxSizer(wx.VERTICAL) - self.m_ChooseMIDI_filePicker1 = wx.FilePickerCtrl( + self.midiFilesList = set() + self.m_midiFilesList_listBox2 = wx.ListBox( self, wx.ID_ANY, - "./", - "选择MIDI文件", - "MIDI 序列 (*.mid;*.midi)|*.mid;*.midi", wx.DefaultPosition, wx.DefaultSize, - wx.FLP_DEFAULT_STYLE - | wx.FLP_FILE_MUST_EXIST - | wx.FLP_OPEN - | wx.FLP_USE_TEXTCTRL, - ) - ss_MidiChooserSizer_bSizer9.Add( - self.m_ChooseMIDI_filePicker1, 0, wx.ALL | wx.EXPAND, 5 + [], + wx.LB_HSCROLL | wx.LB_SORT, ) + ss_MidiChooserSizer_bSizer9.Add(self.m_midiFilesList_listBox2, 0, wx.EXPAND, 0) s_midiChooseSizer.Add(ss_MidiChooserSizer_bSizer9, 1, wx.EXPAND, 5) + self.m_midiBroseButton_button21 = wx.Button( + self, wx.ID_ANY, "打开…", wx.DefaultPosition, wx.DefaultSize, 0 + ) + s_midiChooseSizer.Add( + self.m_midiBroseButton_button21, 0, wx.ALL | wx.ALIGN_CENTER_VERTICAL, 5 + ) + m_mainBoxSizer.Add(s_midiChooseSizer, 1, wx.EXPAND, 5) s_formatChooseSizer = wx.BoxSizer(wx.HORIZONTAL) @@ -347,10 +355,10 @@ class LingLunMainFrame(wx.Frame): self.m_BasicProgressBarStyleEntering_textCtrl4 = wx.TextCtrl( ssss_basicProgressStylePattle_sbSizer9.GetStaticBox(), wx.ID_ANY, - r"▶ %%N [ %%s/%^s %%% __________ %%t|%^t ]", + DEFAULT_PROGRESSBAR_STYLE[0], wx.DefaultPosition, wx.DefaultSize, - wx.TE_LEFT | wx.TE_NO_VSCROLL | wx.TE_RICH, + wx.TE_LEFT | wx.TE_NO_VSCROLL, ) ssss_basicProgressStylePattle_sbSizer9.Add( self.m_BasicProgressBarStyleEntering_textCtrl4, 0, wx.ALL | wx.EXPAND, 5 @@ -370,7 +378,7 @@ class LingLunMainFrame(wx.Frame): self.m_unplayedProgressbarStyleEntering_textCtrl5 = wx.TextCtrl( ssss_UnplayedPartProgressbarPattle_sbSizer10.GetStaticBox(), wx.ID_ANY, - "§7=§r", + DEFAULT_PROGRESSBAR_STYLE[1][1], wx.DefaultPosition, wx.DefaultSize, wx.TE_LEFT | wx.TE_NO_VSCROLL, @@ -393,7 +401,7 @@ class LingLunMainFrame(wx.Frame): self.m_playedProgressbarStyleEntering_textCtrl5 = wx.TextCtrl( ssss_PlayedPartProgressbarPattle_sbSizer11.GetStaticBox(), wx.ID_ANY, - "§e=§r", + DEFAULT_PROGRESSBAR_STYLE[1][0], wx.DefaultPosition, wx.DefaultSize, wx.TE_LEFT | wx.TE_NO_VSCROLL, @@ -610,7 +618,7 @@ class LingLunMainFrame(wx.Frame): self.m_button2 = wx.Button( s_StartSizer_sbSizer18.GetStaticBox(), wx.ID_ANY, - "转换,启动!", + "开始转换", wx.DefaultPosition, wx.DefaultSize, 0, @@ -636,7 +644,13 @@ class LingLunMainFrame(wx.Frame): self.m_LinglunWords_staticText1.Bind(wx.EVT_LEFT_DCLICK, self.onYanlunDClicked) self.m_LinglunWords_staticText1.Bind(wx.EVT_MOUSEWHEEL, self.onYanlunWheeled) self.m_ChooseMidiTips_staticText3.Bind(wx.EVT_LEFT_DCLICK, self.MidiEasterEgg) - self.m_ChooseMIDI_filePicker1.Bind(wx.EVT_FILEPICKER_CHANGED, self.onFileChosen) + + self.m_midiFilesList_listBox2.Bind(wx.EVT_LISTBOX, self.onFileListUpdated) + self.m_midiFilesList_listBox2.Bind( + wx.EVT_LISTBOX_DCLICK, self.onFileDoubleClicked + ) + self.m_midiBroseButton_button21.Bind(wx.EVT_BUTTON, self.openFile) + self.m_outformatChoice_choice1.Bind(wx.EVT_CHOICE, self.onOutputFormatChosen) self.m_playerChoice_choice2.Bind(wx.EVT_CHOICE, self.onPlayerChosen) self.m_volumn_slider.Bind(wx.EVT_SCROLL, self.onVolumeScrolling) @@ -698,20 +712,52 @@ class LingLunMainFrame(wx.Frame): self.Destroy() def onYanlunDClicked(self, event): - self.m_LinglunWords_staticText1.SetLabelText(random.choice(myWords) + "\r") + self.yanlun_now = random.randrange(0, yanlun_length) + self.m_LinglunWords_staticText1.SetLabelText(myWords[self.yanlun_now] + "\r") def onYanlunWheeled(self, event): - self.m_LinglunWords_staticText1.SetLabelText(random.choice(myWords) + "\r") + if event.GetWheelRotation() < 0: + self.yanlun_now -= 1 + else: + self.yanlun_now += 1 + self.yanlun_now += ( + -yanlun_length + if self.yanlun_now >= yanlun_length + else (yanlun_length if self.yanlun_now < 0 else 0) + ) + self.m_LinglunWords_staticText1.SetLabelText(myWords[self.yanlun_now] + "\r") def MidiEasterEgg(self, event): - self.m_ChooseMIDI_filePicker1.GetTextCtrl().SetValue("诸葛亮与八卦阵-山水千年.mid") - self.Update() + if "诸葛亮与八卦阵-山水千年" not in self.midiFilesList: + self.midiFilesList.add("诸葛亮与八卦阵-山水千年") + self.m_midiFilesList_listBox2.Append("诸葛亮与八卦阵-山水千年") - def onFileChosen(self, event): + def onFileListUpdated(self, event): # prt(self.m_ChooseMIDI_filePicker1.GetTextCtrl().Value) # self.midi_cvt = Musicreater.MidiConvert.from_midi_file(self.m_ChooseMIDI_filePicker1.GetLabel(),self.m_oldExeFormatChecker_checkBox3.GetValue()) event.Skip() + def onFileDoubleClicked(self, event): + # print(self.m_midiFilesList_listBox2.Selection) + self.midiFilesList.remove(self.m_midiFilesList_listBox2.GetStringSelection()) + # print(self.midiFilesList) + self.m_midiFilesList_listBox2.Delete(self.m_midiFilesList_listBox2.Selection) + + def openFile(self, event): + fileDialog = wx.FileDialog( + None, + message="选择MIDI文件", + defaultDir="./", + wildcard="MIDI 序列 (*.mid;*.midi)|*.mid;*.midi", + style=wx.FD_OPEN | wx.FD_MULTIPLE | wx.FD_FILE_MUST_EXIST, + ) + dialogResult = fileDialog.ShowModal() + if dialogResult == wx.ID_OK: + self.midiFilesList.update(fileDialog.GetPaths()) + self.m_midiFilesList_listBox2.Set(list(self.midiFilesList)) + + fileDialog.Destroy() + def onOutputFormatChosen(self, event): # 0: 附加包 # 1: BDX @@ -815,14 +861,19 @@ class LingLunMainFrame(wx.Frame): event.Skip() def onStartButtonPressed(self, event): - if self.m_ChooseMIDI_filePicker1.GetTextCtrl().Value != "诸葛亮与八卦阵-山水千年.mid": - mid_cvt = Musicreater.MidiConvert.from_midi_file( - self.m_ChooseMIDI_filePicker1.GetTextCtrl().Value, - self.m_oldExeFormatChecker_checkBox3.GetValue(), - ) + for file_name in self.m_midiFilesList_listBox2.GetStrings(): + if file_name == "诸葛亮与八卦阵-山水千年": + mid_cvt = Musicreater.MidiConvert( + None, "山水千年", self.m_oldExeFormatChecker_checkBox3.GetValue() + ) + else: + mid_cvt = Musicreater.MidiConvert.from_midi_file( + file_name, + self.m_oldExeFormatChecker_checkBox3.GetValue(), + ) cvt_cfg = ConvertConfig( - os.path.split(self.m_ChooseMIDI_filePicker1.GetTextCtrl().Value)[0], + os.path.split(file_name)[0], self.m_volumn_spinCtrlDouble1.GetValue() / 100, self.m_speed_spinCtrlDouble.GetValue(), progressbar=( @@ -896,233 +947,17 @@ class LingLunMainFrame(wx.Frame): return wx.MessageDialog( None, - "完成!\n指令数量:{}\n延迟总长:{}\n结构大小:{}\n终点坐标:{}".format( - cmd_num, total_delay, size, final_pos + "{}\n\n完成!\n指令数量:{}\n延迟总长:{}\n结构大小:{}\n终点坐标:{}".format( + file_name, cmd_num, total_delay, size, final_pos ), "转换成功", wx.YES_DEFAULT | wx.ICON_INFORMATION, ).ShowModal() -# # 创建主窗口类 -# class LinglunConverterFrame(wx.Frame): -# def __init__(self, *args, **kwargs): -# super(LinglunConverterFrame, self).__init__(*args, **kwargs) - -# # 设置窗口属性 -# self.SetSize((750, 300)) -# self.Center() - -# self.panel = wx.Panel(self) -# self.main_sizer = wx.BoxSizer(wx.VERTICAL) - -# self.yanlun_sizer = wx.BoxSizer(wx.HORIZONTAL) - -# now_word = random.choice(myWords).split("\t——") -# self.yanlun_label_a = wx.StaticText( -# self.panel, label=now_word[0], style=wx.ALIGN_LEFT -# ) -# self.yanlun_label_a.SetForegroundColour(WHITE) -# self.yanlun_label_a.SetBackgroundColour(BLACK) -# self.yanlun_sizer.Add(self.yanlun_label_a, flag=wx.ALIGN_TOP) - -# if len(now_word) > 1: -# self.yanlun_label_b = wx.StaticText( -# self.panel, label=now_word[1], style=wx.ALIGN_RIGHT -# ) -# self.yanlun_label_b.SetForegroundColour(WHITE) -# self.yanlun_label_b.SetBackgroundColour(BLACK) -# self.yanlun_sizer.Add(self.yanlun_label_b, flag=wx.ALIGN_TOP) - -# self.main_sizer.Add(self.yanlun_sizer, flag=wx.EXPAND) - -# self.file_picker_frame = wx.StaticBoxSizer() - -# # 文件选择控件 -# self.file_picker = wx.FilePickerCtrl( -# self.panel, -# message="选择MIDI文件", -# wildcard="MIDI files (*.mid;*.midi)|*.mid;*.midi", -# style=wx.FLP_USE_TEXTCTRL, -# ) -# self.main_sizer.Add(self.file_picker, flag=wx.EXPAND) - -# # 输出结果类型下拉选择控件 -# self.output_type_dropdown = wx.Choice( -# self.panel, choices=["MCPACK", "BDX", "MCSTRUCTURE"] -# ) -# self.main_sizer.Add(wx.StaticText(self.panel, label="输出结果类型:")) -# self.main_sizer.Add(self.output_type_dropdown, flag=wx.EXPAND) - -# # 播放器类型下拉选择控件 -# self.player_type_dropdown = wx.Choice(self.panel, choices=["计分板", "延迟"]) -# self.main_sizer.Add(wx.StaticText(self.panel, label="播放器类型:")) -# self.main_sizer.Add(self.player_type_dropdown, flag=wx.EXPAND) - -# # 音量大小滑动条与数字输入框 -# self.volume_slider = wx.Slider( -# self.panel, value=100, minValue=1, maxValue=100, style=wx.SL_HORIZONTAL -# ) -# self.volume_text = wx.TextCtrl(self.panel, value="1.0") -# self.main_sizer.Add(wx.StaticText(self.panel, label="音量大小:")) -# self.main_sizer.Add(self.volume_slider, flag=wx.EXPAND) -# self.main_sizer.Add(self.volume_text, flag=wx.EXPAND) - -# # 速度倍率滑动条与数字输入框 -# self.speed_slider = wx.Slider( -# self.panel, value=100, minValue=1, maxValue=100, style=wx.SL_HORIZONTAL -# ) -# self.speed_text = wx.TextCtrl(self.panel, value="1.0") -# self.main_sizer.Add(wx.StaticText(self.panel, label="速度倍率:")) -# self.main_sizer.Add(self.speed_slider, flag=wx.EXPAND) -# self.main_sizer.Add(self.speed_text, flag=wx.EXPAND) - -# # 自动生成进度条勾选框 -# self.progressbar_checkbox = wx.CheckBox(self.panel, label="是否自动生成进度条") -# self.main_sizer.Add(self.progressbar_checkbox, flag=wx.EXPAND) - -# # 进度条相关控件 -# self.whole_style_text = wx.TextCtrl( -# self.panel, value=" %%N [ %%s/%^s %%% __________ %%t|%^t]" -# ) -# self.non_played_text = wx.TextCtrl(self.panel, value="§7=§r") -# self.has_played_text = wx.TextCtrl(self.panel, value="§e=§r") -# self.main_sizer.Add(wx.StaticText(self.panel, label="整体样式:")) -# self.main_sizer.Add(self.whole_style_text, flag=wx.EXPAND) -# self.main_sizer.Add(wx.StaticText(self.panel, label="动条(未播放):")) -# self.main_sizer.Add(self.non_played_text, flag=wx.EXPAND) -# self.main_sizer.Add(wx.StaticText(self.panel, label="动条(已播放):")) -# self.main_sizer.Add(self.has_played_text, flag=wx.EXPAND) - -# # 计分板相关控件 -# self.scoreboard_name_text = wx.TextCtrl(self.panel, value="mscply") -# self.auto_reset_checkbox = wx.CheckBox(self.panel, label="是否结束后重置计分板") - -# # 延迟相关控件 -# self.selecter_text = wx.TextCtrl(self.panel, value="@a") -# self.max_struct_height_slider = wx.Slider( -# self.panel, value=63, minValue=4, maxValue=256, style=wx.SL_HORIZONTAL -# ) -# self.max_struct_height_text = wx.TextCtrl(self.panel, value="63") - -# # BDX相关控件 -# self.author_name_text = wx.TextCtrl(self.panel, value="Unfamous") - -# # 导出结果按钮 -# self.export_button = wx.Button(self.panel, label="导出结果") - -# # 添加控件到主sizer中 -# self.main_sizer.Add(self.scoreboard_name_text, flag=wx.EXPAND) -# self.main_sizer.Add(self.auto_reset_checkbox, flag=wx.EXPAND) -# self.main_sizer.Add(self.selecter_text, flag=wx.EXPAND) -# self.main_sizer.Add(self.max_struct_height_slider, flag=wx.EXPAND) -# self.main_sizer.Add(self.max_struct_height_text, flag=wx.EXPAND) -# self.main_sizer.Add(self.author_name_text, flag=wx.EXPAND) -# self.main_sizer.Add(self.export_button, flag=wx.EXPAND) - -# self.panel.SetSizer(self.main_sizer) -# self.panel.Layout() - -# # 绑定事件处理程序 -# self.file_picker.Bind(wx.EVT_FILEPICKER_CHANGED, self.on_file_selected) -# self.output_type_dropdown.Bind(wx.EVT_CHOICE, self.on_output_type_selected) -# self.player_type_dropdown.Bind(wx.EVT_CHOICE, self.on_player_type_selected) -# self.volume_slider.Bind(wx.EVT_SCROLL_CHANGED, self.on_volume_slider_changed) -# self.speed_slider.Bind(wx.EVT_SCROLL_CHANGED, self.on_speed_slider_changed) -# self.progressbar_checkbox.Bind( -# wx.EVT_CHECKBOX, self.on_progressbar_checkbox_changed -# ) -# self.max_struct_height_slider.Bind( -# wx.EVT_SCROLL_CHANGED, self.on_max_struct_height_slider_changed -# ) -# self.export_button.Bind(wx.EVT_BUTTON, self.on_export_button_clicked) - -# self.HideUnnecessaryControls() -# self.Layout() - -# def HideUnnecessaryControls(self): -# # 隐藏所有不需要显示的控件 -# self.scoreboard_name_text.Hide() -# self.auto_reset_checkbox.Hide() -# self.selecter_text.Hide() -# self.max_struct_height_slider.Hide() -# self.max_struct_height_text.Hide() -# self.author_name_text.Hide() -# self.whole_style_text.Hide() -# self.non_played_text.Hide() -# self.has_played_text.Hide() -# self.Layout() - -# def on_file_selected(self, event): -# file_to_convert = self.file_picker.GetPath() -# # 处理选择的文件 - -# def on_output_type_selected(self, event): -# output_type = self.output_type_dropdown.GetStringSelection() -# # 处理选择的输出结果类型 - -# def on_player_type_selected(self, event): -# player_type = self.player_type_dropdown.GetStringSelection() -# if player_type == "计分板": -# # 显示计分板相关控件 -# self.scoreboard_name_text.Show() -# self.auto_reset_checkbox.Show() -# # 隐藏延迟相关控件 -# self.selecter_text.Hide() -# self.max_struct_height_slider.Hide() -# self.max_struct_height_text.Hide() -# elif player_type == "延迟": -# # 显示延迟相关控件 -# self.selecter_text.Show() -# self.max_struct_height_slider.Show() -# self.max_struct_height_text.Show() -# # 隐藏计分板相关控件 -# self.scoreboard_name_text.Hide() -# self.auto_reset_checkbox.Hide() -# self.Layout() - -# def on_volume_slider_changed(self, event): -# volume = self.volume_slider.GetValue() -# self.volume_text.SetValue(str(volume / 100)) # 更新音量大小输入框的值 - -# def on_speed_slider_changed(self, event): -# speed = self.speed_slider.GetValue() -# self.speed_text.SetValue(str(speed / 100)) # 更新速度倍率输入框的值 - -# def on_progressbar_checkbox_changed(self, event): -# is_progressbar_selected = self.progressbar_checkbox.GetValue() -# if is_progressbar_selected: -# # 显示进度条相关控件 -# self.whole_style_text.Show() -# self.non_played_text.Show() -# self.has_played_text.Show() -# else: -# # 隐藏进度条相关控件 -# self.whole_style_text.Hide() -# self.non_played_text.Hide() -# self.has_played_text.Hide() -# self.Layout() - -# def on_max_struct_height_slider_changed(self, event): -# max_struct_height = self.max_struct_height_slider.GetValue() -# self.max_struct_height_text.SetValue(str(max_struct_height)) # 更新结构最大高度输入框的值 - -# def on_export_button_clicked(self, event): -# output_path = wx.DirSelector(message="选择一个文件夹") # 选择文件夹并保存至output_path变量 -# # 导出结果的操作 - -# class TextCtrlRedirector: -# def __init__(self, text_ctrl): -# self.text_ctrl = text_ctrl - -# def write(self, text): -# wx.CallAfter(self.text_ctrl.WriteText, text) - -# def flush(self): -# pass - - # 启动应用程序 if __name__ == "__main__": app = LinglunConverterApp() app.MainLoop() + + input("按下回车退出……") diff --git a/wxFB_Project/LingLunConverter.fbp b/wxFB_Project/LingLunConverter.fbp index 79328b8..303bea7 100644 --- a/wxFB_Project/LingLunConverter.fbp +++ b/wxFB_Project/LingLunConverter.fbp @@ -47,7 +47,7 @@ LingLunMainFrame - 659,778 + 660,780 wxDEFAULT_FRAME_STYLE ; ; forward_declare @@ -126,11 +126,11 @@ m_mainBoxSizer wxVERTICAL none - + 2 wxALL|wxEXPAND|wxRESERVE_SPACE_EVEN_IF_HIDDEN|wxTOP 1 - + wxID_ANY 言·论 -1,-1 @@ -214,7 +214,7 @@ none 5 - wxALL + wxALL|wxALIGN_CENTER_VERTICAL 0 1 @@ -244,7 +244,7 @@ 0 0 wxID_ANY - 选择MIDI文件 + 选择MIDI文件 (双击移除) 0 0 @@ -283,11 +283,11 @@ ss_MidiChooserSizer_bSizer9 wxVERTICAL none - - 5 - wxALL|wxEXPAND + + 0 + wxEXPAND 0 - + 1 1 1 @@ -301,6 +301,7 @@ 1 0 + 1 1 @@ -318,22 +319,21 @@ 0 - 选择MIDI文件 0 - -1,-1 + 1 - m_ChooseMIDI_filePicker1 + m_midiFilesList_listBox2 1 protected 1 - Fixed + Resizable 1 - wxFLP_DEFAULT_STYLE|wxFLP_FILE_MUST_EXIST|wxFLP_OPEN|wxFLP_USE_TEXTCTRL + wxLB_HSCROLL|wxLB_SORT ; ; forward_declare 0 @@ -341,16 +341,89 @@ wxFILTER_NONE wxDefaultValidator - ./ - MIDI 序列 (*.mid;*.midi)|*.mid;*.midi - onFileChosen + onFileListUpdated + onFileDoubleClicked + + 5 + wxALL|wxALIGN_CENTER_VERTICAL + 0 + + 1 + 1 + 1 + 1 + + + + + 0 + + + + + 1 + 0 + 1 + + 1 + + 0 + 0 + + Dock + 0 + Left + 1 + + 1 + + + 0 + 0 + wxID_ANY + 打开… + + 0 + + 0 + + + 0 + + 1 + m_midiBroseButton_button21 + 1 + + + protected + 1 + + + + Resizable + 1 + + + ; ; forward_declare + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + openFile + + @@ -1048,7 +1121,7 @@ Fixed 1 - wxTE_LEFT|wxTE_NO_VSCROLL|wxTE_RICH + wxTE_LEFT|wxTE_NO_VSCROLL ; ; forward_declare 0 @@ -2083,7 +2156,7 @@ 0 0 wxID_ANY - 转换,启动! + 开始转换 0 @@ -2093,7 +2166,7 @@ 0 1 - m_button2 + m_start_button2 1