diff --git a/EVT_GUI/EnvConfigurator.py b/EVT_GUI/EnvConfigurator.py index b9a194d..f866d2d 100644 --- a/EVT_GUI/EnvConfigurator.py +++ b/EVT_GUI/EnvConfigurator.py @@ -498,19 +498,32 @@ def Check_Pytorch(self, Package: str): except OSError: return False - def Install_Pytorch(self, Package: str): - pynvml.nvmlInit() - CudaList = [117, 118, 121] - CudaVersion = min(CudaList, key = lambda Cuda: abs(Cuda - pynvml.nvmlSystemGetCudaDriverVersion()//100)) - MirrorList = [f'https://download.pytorch.org/whl/cu{CudaVersion}', ''] - for Mirror in MirrorList: - Result = RunCMD([f'pip3 install {Package} -y --index-url {Mirror}' if Package in ['torch', 'torchvision', 'torchaudio'] else f'pip3 install {Package} -y']) - if Result.returncode == 0: - break + def Install_Pytorch(self, Package: str, Reinstall: bool): + DisplayCommand = 'cmd /c start cmd /k ' if platform.system() == 'Windows' else 'x-terminal-emulator -e ' + if Package in ('torch', 'torchvision', 'torchaudio'): + pynvml.nvmlInit() + CudaList = [117, 118, 121] + CudaVersion = min(CudaList, key = lambda Cuda: abs(Cuda - pynvml.nvmlSystemGetCudaDriverVersion()//100)) + MirrorList = [f'https://download.pytorch.org/whl/cu{CudaVersion}', ''] + for Mirror in MirrorList: + Result = RunCMD([ + DisplayCommand if Reinstall else '' + f'pip3 install {Package} -y --index-url {Mirror}' + '--force-reinstall' if Reinstall else '' + ]) + if Result.returncode == 0: + break + else: + RunCMD( + [DisplayCommand if Reinstall else '' + f'pip3 uninstall {Package} -y'] if Reinstall else [] + + [DisplayCommand if Reinstall else '' + f'pip3 install {Package} -y'] + ) - def Execute_Pytorch_Installation(self): + def Execute_Pytorch_Installation(self, Version: Optional[str] = None, Reinstall: bool = False): PackageList = ['torch', 'torchvision', 'torchaudio', 'pytorch-lightning'] - for Index, Package in enumerate(PackageList): + VersionDict = { + '2.0.1': {'torch': '2.0.1', 'torchvision': '0.15.2', 'torchaudio': '2.0.2', 'pytorch-lightning': '2.1'}, + '2.2.2': {'torch': '2.2.2', 'torchvision': '0.17.2', 'torchaudio': '2.2.2', 'pytorch-lightning': '2.2'} + }.get(Version) + for Index, Package in enumerate(PackageList if VersionDict is None else [f'{Package}=={VersionDict[Package]}' for Package in PackageList]): Result = self.Check_Pytorch(Package) if Result == False: if self.EmitFlag == True: @@ -518,13 +531,14 @@ def Execute_Pytorch_Installation(self): self.EmitFlag = False EnvConfiguratorSignals.Signal_PytorchStatus.emit(f"Installing {Package}. Please wait...") try: - self.Install_Pytorch(Package) + self.Install_Pytorch(Package, Reinstall = False) EnvConfiguratorSignals.Signal_PytorchInstalled.emit() if Index + 1 == len(PackageList) else None EnvConfiguratorSignals.Signal_PytorchStatus.emit("Successfully installed!") if Index + 1 == len(PackageList) else None except Exception as e: EnvConfiguratorSignals.Signal_PytorchInstallFailed.emit(e) EnvConfiguratorSignals.Signal_PytorchStatus.emit("Installation failed:(") else: + self.Install_Pytorch(Package, Reinstall) if Reinstall else None EnvConfiguratorSignals.Signal_PytorchDetected.emit() if Index + 1 == len(PackageList) else None EnvConfiguratorSignals.Signal_PytorchStatus.emit(f"{Package} detected. Version: {Result}") diff --git a/EVT_GUI/Functions.py b/EVT_GUI/Functions.py index efd6d57..6423104 100644 --- a/EVT_GUI/Functions.py +++ b/EVT_GUI/Functions.py @@ -96,39 +96,6 @@ def Function_AddToTreeWidget( ) -def Function_SetTreeWidget( - TreeWidget: QTreeWidget, - ItemTexts: dict = {'RootItemText': ('ChildItemText', )}, - AddVertically: bool = False, - ExpandItems: bool = True -): - ''' - ''' - TreeWidget.clear() - - RootItems = [] - - for Index, RootItemText in enumerate(ItemTexts.keys()): - RootItem = QTreeWidgetItem(TreeWidget) - RootItem.setText(0 if AddVertically else Index, RootItemText) - RootItemTextFont = QFont() - RootItemTextFont.setPixelSize(15) - RootItem.setFont(0 if AddVertically else Index, RootItemTextFont) - for ChildItemText in ToIterable(list(ItemTexts.values())[Index]): - ChildItem = QTreeWidgetItem(RootItem) - ChildItem.setText(0 if AddVertically else Index, ChildItemText) - ChildItemTextFont = QFont() - ChildItemTextFont.setPixelSize(12) - ChildItem.setFont(0 if AddVertically else Index, ChildItemTextFont) - - RootItems.append(RootItem) - - TreeWidget.setColumnCount(1) if AddVertically else None - TreeWidget.addTopLevelItems(RootItems) - - TreeWidget.expandAll() if ExpandItems else None - - def Function_SetChildWidgetsVisibility( Container: QWidget, ChildWidgets: list[Optional[QWidget]], @@ -268,7 +235,7 @@ def Function_ParamsHandler( Function to get/set the param of UI ''' if Mode == "Get": - if isinstance(UI, (QLineEdit, LineEditBase, QPlainTextEdit)): + if isinstance(UI, (QLineEdit, LineEditBase, TextEditBase, QPlainTextEdit)): return Function_GetText(UI) if isinstance(UI, QComboBox): return UI.currentText() @@ -281,7 +248,7 @@ def Function_ParamsHandler( return UI.GetValue() if Mode == "Set": - if isinstance(UI, (QLineEdit, LineEditBase)): + if isinstance(UI, (QLineEdit, LineEditBase, TextEditBase)): UI.setText(Param) if isinstance(UI, QPlainTextEdit): UI.setPlainText(Param) @@ -464,7 +431,7 @@ def Function_SetWidgetValue( SetPlaceholderText: bool = False, PlaceholderText: Optional[str] = None ): - if isinstance(Widget, (QLineEdit, LineEditBase, QPlainTextEdit)): + if isinstance(Widget, (QLineEdit, LineEditBase, TextEditBase)): Function_SetText(Widget, Value, SetPlaceholderText = SetPlaceholderText, PlaceholderText = PlaceholderText) def EditConfig(Value): Config.EditConfig(Section, Option, str(Value)) @@ -555,13 +522,13 @@ def ResetSettings(self): def ImportSettings(self, ReadPath: str): ConfigParser = ManageConfig(ReadPath).Parser() - with open(self.ConfigPath, 'w') as Config: + with open(self.ConfigPath, 'w', encoding = 'utf-8') as Config: ConfigParser.write(Config) for Widget, value in list(self.RegistratedWidgets.items()): self.SetParam(Widget, *value) def ExportSettings(self, SavePath: str): - with open(SavePath, 'w') as Config: + with open(SavePath, 'w', encoding = 'utf-8') as Config: self.Config.Parser().write(Config) ############################################################################################################################## diff --git a/EVT_GUI/UI_MainWindow.py b/EVT_GUI/UI_MainWindow.py index e5461a9..f08b2c5 100644 --- a/EVT_GUI/UI_MainWindow.py +++ b/EVT_GUI/UI_MainWindow.py @@ -1,7 +1,7 @@ from PySide6.QtCore import (QCoreApplication, QMetaObject, QRect, QSize, Qt) from PySide6.QtWidgets import * -from .Components import WidgetBase, MenuButton, LabelBase, LineEditBase, ComboBoxBase, SpinBoxBase, DoubleSpinBoxBase, ToolBoxBase, ScrollAreaBase, TreeWidgetBase, Table_ViewModels, Table_EditAudioSpeaker +from .Components import WidgetBase, MenuButton, LabelBase, LineEditBase, TextEditBase, ComboBoxBase, SpinBoxBase, DoubleSpinBoxBase, ToolBoxBase, ScrollAreaBase, TreeWidgetBase, Table_ViewModels, Table_EditAudioSpeaker from . import Sources @@ -1435,6 +1435,44 @@ def setupUi(self, MainWindow): self.horizontalLayout_3.addWidget(self.ToolButton_Env_Install_Title) + self.ToolButton_Env_Manage_Title = QToolButton(self.Frame_Env_Install_Top) + self.ToolButton_Env_Manage_Title.setObjectName(u"ToolButton_Env_Manage_Title") + sizePolicy1.setHeightForWidth(self.ToolButton_Env_Manage_Title.sizePolicy().hasHeightForWidth()) + self.ToolButton_Env_Manage_Title.setSizePolicy(sizePolicy1) + self.ToolButton_Env_Manage_Title.setStyleSheet(u"QToolButton {\n" +" font-size: 24px;\n" +" /*text-align: center;*/\n" +" padding-left: 12px;\n" +" padding-right: 12px;\n" +" background-color: transparent;\n" +" border-top-width: 0px;\n" +" border-right-width: 0px;\n" +" border-bottom-width: 3px;\n" +" border-left-width: 0px;\n" +" border-style: solid;\n" +" border-bottom-color: rgba(123, 123, 123, 123);\n" +"}\n" +"QToolButton:hover {\n" +" background-color: transparent;\n" +" border-top-width: 0px;\n" +" border-right-width: 0px;\n" +" border-bottom-width: 3px;\n" +" border-left-width: 0px;\n" +" border-style: solid;\n" +" border-bottom-color: rgba(120, 180, 240, 123);\n" +"}\n" +"QToolButton:checked {\n" +" background-color: transparent;\n" +" border-top-width: 0px;\n" +" border-right-width: 0px;\n" +" border-bottom-width: 3px;\n" +" border-left-width: 0px;\n" +" border-style: solid;\n" +" border-bottom-color: rgba(120, 180, 240, 210);\n" +"}") + + self.horizontalLayout_3.addWidget(self.ToolButton_Env_Manage_Title) + self.Frame_Env_Install_Title_Spacer = QLabel(self.Frame_Env_Install_Top) self.Frame_Env_Install_Title_Spacer.setObjectName(u"Frame_Env_Install_Title_Spacer") sizePolicy4 = QSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Preferred) @@ -11109,7 +11147,7 @@ def setupUi(self, MainWindow): self.verticalLayout_133.addWidget(self.Label_TTS_GPTSoVITS_Text) - self.PlainTextEdit_TTS_GPTSoVITS_Text = QPlainTextEdit(self.Frame_TTS_GPTSoVITS_Text) + self.PlainTextEdit_TTS_GPTSoVITS_Text = TextEditBase(self.Frame_TTS_GPTSoVITS_Text) self.PlainTextEdit_TTS_GPTSoVITS_Text.setObjectName(u"PlainTextEdit_TTS_GPTSoVITS_Text") sizePolicy3.setHeightForWidth(self.PlainTextEdit_TTS_GPTSoVITS_Text.sizePolicy().hasHeightForWidth()) self.PlainTextEdit_TTS_GPTSoVITS_Text.setSizePolicy(sizePolicy3) @@ -12200,7 +12238,7 @@ def setupUi(self, MainWindow): self.verticalLayout_98.addWidget(self.Label_TTS_VITS_Text) - self.PlainTextEdit_TTS_VITS_Text = QPlainTextEdit(self.Frame_TTS_VITS_Text) + self.PlainTextEdit_TTS_VITS_Text = TextEditBase(self.Frame_TTS_VITS_Text) self.PlainTextEdit_TTS_VITS_Text.setObjectName(u"PlainTextEdit_TTS_VITS_Text") sizePolicy3.setHeightForWidth(self.PlainTextEdit_TTS_VITS_Text.sizePolicy().hasHeightForWidth()) self.PlainTextEdit_TTS_VITS_Text.setSizePolicy(sizePolicy3) @@ -14633,6 +14671,7 @@ def retranslateUi(self, MainWindow): self.Label_Repo_Text.setText(QCoreApplication.translate("MainWindow", u"TextLabel", None)) self.Label_Donate_Text.setText(QCoreApplication.translate("MainWindow", u"TextLabel", None)) self.ToolButton_Env_Install_Title.setText(QCoreApplication.translate("MainWindow", u"Label", None)) + self.ToolButton_Env_Manage_Title.setText(QCoreApplication.translate("MainWindow", u"Label", None)) self.Label_Env_Install_Aria2_Status.setText(QCoreApplication.translate("MainWindow", u"--", None)) self.Label_Env_Install_Aria2.setText(QCoreApplication.translate("MainWindow", u"TextLabel", None)) self.Label_Env_Install_FFmpeg_Status.setText(QCoreApplication.translate("MainWindow", u"--", None)) diff --git a/EVT_GUI/Window.py b/EVT_GUI/Window.py index cc0287e..3f406fd 100644 --- a/EVT_GUI/Window.py +++ b/EVT_GUI/Window.py @@ -81,7 +81,7 @@ def __init__(self, parent = None): self.setTitleBar(self.ui.TitleBar) -class Window_ChildWindow_TTS(ChildWindowBase): +class Window_ChildWindow_TTS_VITS(ChildWindowBase): ui = Ui_ChildWindow_TTS() def __init__(self, parent = None): diff --git a/Run.py b/Run.py index 09a2a2b..37d146e 100644 --- a/Run.py +++ b/Run.py @@ -20,7 +20,7 @@ ############################################################################################################################## # Set current version -CurrentVersion = "v1.1.1" +CurrentVersion = "v1.1.2" ############################################################################################################################## @@ -1119,6 +1119,15 @@ def Main(self): # EnvInstallation self.ui.ToolButton_Env_Install_Title.setText(QCA.translate("Label", "自动配置")) + self.ui.ToolButton_Env_Install_Title.setCheckable(True) + self.ui.ToolButton_Env_Install_Title.setChecked(True) + self.ui.ToolButton_Env_Install_Title.setAutoExclusive(True) + self.ui.ToolButton_Env_Install_Title.clicked.connect( + lambda: Function_AnimateStackedWidget( + StackedWidget = self.ui.StackedWidget_Pages_Env, + TargetIndex = 0 + ) + ) self.ui.Label_Env_Install_Aria2.setText(QCA.translate("Label", "Aria2")) Function_SetMethodExecutor(self, @@ -1340,6 +1349,34 @@ def Main(self): lambda Status: self.ui.Label_Env_Install_Pytorch_Status.setText(Status) ) + # EnvManagement + self.ui.ToolButton_Env_Manage_Title.setText(QCA.translate("ToolButton", "安装管理")) + self.ui.ToolButton_Env_Manage_Title.setCheckable(True) + self.ui.ToolButton_Env_Manage_Title.setChecked(False) + self.ui.ToolButton_Env_Manage_Title.setAutoExclusive(True) + self.ui.ToolButton_Env_Manage_Title.clicked.connect( + lambda: Function_AnimateStackedWidget( + StackedWidget = self.ui.StackedWidget_Pages_Env, + TargetIndex = 1 + ) + ) + + self.ui.ToolBox_Env_Manage_Pytorch.widget(0).setText(QCA.translate("ToolBox", "Pytorch")) + self.ui.ToolBox_Env_Manage_Pytorch.widget(0).collapse() + + self.ui.Label_Env_Manage_Pytorch_Version.setText(QCA.translate("Label", "选择Pytorch版本")) + self.ui.ComboBox_Env_Manage_Pytorch_Version.addItems([ '2.0.1', '2.2.2']) + + self.ui.Button_Env_Manage_Pytorch_Install.setText(QCA.translate("Button", "重装")) + Function_SetMethodExecutor(self, + ExecuteButton = self.ui.Button_Env_Manage_Pytorch_Install, + Method = Pytorch_Installer.Execute, + ParamsFrom = [ + self.ui.ComboBox_Env_Manage_Pytorch_Version, + True + ] + ) + ############################################################# ####################### Content: Models ##################### ############################################################# @@ -6516,61 +6553,61 @@ def SetText_LineEdit_Train_VITS_OutputDir(): ) # ChildWindow - ChildWindow_TTS = Window_ChildWindow_TTS(self) + ChildWindow_TTS_VITS = Window_ChildWindow_TTS_VITS(self) - ChildWindow_TTS.ui.Button_Close.clicked.connect( + ChildWindow_TTS_VITS.ui.Button_Close.clicked.connect( lambda: Function_ShowMessageBox(self, QMessageBox.Question, "Ask", "确认退出试听?", QMessageBox.Yes|QMessageBox.No, { QMessageBox.Yes: lambda: ( - ChildWindow_TTS.ui.Widget.ReleaseMediaPlayer(), - ChildWindow_TTS.close() + ChildWindow_TTS_VITS.ui.Widget.ReleaseMediaPlayer(), + ChildWindow_TTS_VITS.close() ) } ) ) - ChildWindow_TTS.ui.Button_Maximize.clicked.connect(lambda: ChildWindow_TTS.showNormal() if ChildWindow_TTS.isMaximized() else ChildWindow_TTS.showMaximized()) + ChildWindow_TTS_VITS.ui.Button_Maximize.clicked.connect(lambda: ChildWindow_TTS_VITS.showNormal() if ChildWindow_TTS_VITS.isMaximized() else ChildWindow_TTS_VITS.showMaximized()) Function_SetText( - Widget = ChildWindow_TTS.ui.Label_Title, + Widget = ChildWindow_TTS_VITS.ui.Label_Title, Text = SetRichText( Title = QCA.translate("Label", "语音合成结果") ) ) Function_SetText( - Widget = ChildWindow_TTS.ui.Label_Text, + Widget = ChildWindow_TTS_VITS.ui.Label_Text, Text = SetRichText( Body = QCA.translate("Label", "点击播放按钮以试听合成语音") ) ) - ChildWindow_TTS.ui.Button_Cancel.setText(QCA.translate("Button", "丢弃")) - ChildWindow_TTS.ui.Button_Cancel.clicked.connect( + ChildWindow_TTS_VITS.ui.Button_Cancel.setText(QCA.translate("Button", "丢弃")) + ChildWindow_TTS_VITS.ui.Button_Cancel.clicked.connect( lambda: Function_ShowMessageBox(self, QMessageBox.Question, "Ask", "确认丢弃音频?", QMessageBox.Yes|QMessageBox.No, { QMessageBox.Yes: lambda: ( - ChildWindow_TTS.ui.Widget.ReleaseMediaPlayer(), + ChildWindow_TTS_VITS.ui.Widget.ReleaseMediaPlayer(), os.remove(self.ui.LineEdit_TTS_VITS_AudioPathSave.text()), - ChildWindow_TTS.close() + ChildWindow_TTS_VITS.close() ) } ) ) - ChildWindow_TTS.ui.Button_Confirm.setText(QCA.translate("Button", "保留")) - ChildWindow_TTS.ui.Button_Confirm.clicked.connect( + ChildWindow_TTS_VITS.ui.Button_Confirm.setText(QCA.translate("Button", "保留")) + ChildWindow_TTS_VITS.ui.Button_Confirm.clicked.connect( lambda: Function_ShowMessageBox(self, QMessageBox.Question, "Ask", "确认保留音频?", QMessageBox.Yes|QMessageBox.No, { QMessageBox.Yes: lambda: ( - ChildWindow_TTS.ui.Widget.ReleaseMediaPlayer(), - ChildWindow_TTS.close() + ChildWindow_TTS_VITS.ui.Widget.ReleaseMediaPlayer(), + ChildWindow_TTS_VITS.close() ) } ) @@ -6644,10 +6681,10 @@ def SetText_LineEdit_Train_VITS_OutputDir(): ], FinishEvents = [ lambda: self.ShowMask(True, "正在加载播放器"), - lambda: ChildWindow_TTS.ui.Widget.SetMediaPlayer( + lambda: ChildWindow_TTS_VITS.ui.Widget.SetMediaPlayer( self.ui.LineEdit_TTS_VITS_AudioPathSave.text() ), - ChildWindow_TTS.exec, + ChildWindow_TTS_VITS.exec, lambda: Function_ShowMessageBox(self, QMessageBox.Information, "Tip", "当前任务已执行结束。"