diff --git a/module/achievement_excel.py b/module/achievement_excel.py index 5d2bbfd..0a56133 100644 --- a/module/achievement_excel.py +++ b/module/achievement_excel.py @@ -215,10 +215,10 @@ class ExcelReader: except Exception as e: error_message = traceback.format_exc() - raise f""" + raise Exception(f""" 原始错误: {error_message} - """ + """) def set_file_path(self, file_path: str): self.file_path = file_path diff --git a/module/worker.py b/module/worker.py index ac7d4b1..c2c9570 100644 --- a/module/worker.py +++ b/module/worker.py @@ -71,6 +71,7 @@ class DTGWorker(QObject): class ARGWorker(QObject): finished = Signal() error = Signal(str, str) + info = Signal(str, str) def __init__(self, input_filepath: str, output_filepath: str, output_filename: str, disable_cc: bool = False): super().__init__() @@ -81,10 +82,10 @@ class ARGWorker(QObject): def run(self): try: - excel = ExcelReader(self.input_filepath, self.disable_compatibility_check) + excel = ExcelReader(self.input_filepath, self.disable_compatibility_check, self.info.emit) excel.run() - doc = DocxWriter(self.output_filepath, self.output_filename, excel) + doc = DocxWriter(self.output_filepath, self.output_filename, excel, self.info.emit) doc.write() except Exception as e: self.error.emit("😢 不好出错了", str(e)) diff --git a/ui/components/infobar.py b/ui/components/infobar.py index 3085f03..4110a4e 100644 --- a/ui/components/infobar.py +++ b/ui/components/infobar.py @@ -5,9 +5,10 @@ from qfluentwidgets import InfoBar, InfoBarPosition, InfoBarIcon, FluentIconBase class ProgressInfoBar(InfoBar): - def __init__(self, icon: InfoBarIcon | FluentIconBase | QIcon | str, title: str, content: str, orient=Qt.Horizontal, + def __init__(self, icon: InfoBarIcon | FluentIconBase | QIcon | str = InfoBarIcon.INFORMATION, title: str = "1", + content: str = "", orient=Qt.Horizontal, isClosable=True, duration=1000, - position=InfoBarPosition.TOP_RIGHT, parent=None): + position=InfoBarPosition.BOTTOM, parent=None): super().__init__(icon, title, content, orient, isClosable, duration, position, parent) self.pb = ProgressBar() @@ -30,8 +31,7 @@ class ProgressInfoBar(InfoBar): self.pb.setVisible(False) self.adjustSize() manager.add(self) - else: - return + else: if not self.pb.isVisible(): manager.remove(self) @@ -72,3 +72,18 @@ class ProgressInfoBar(InfoBar): duration=duration, parent=self.parent() ) + + def show_error(self, title: str = '错误!', content: str = "操作失败", isCloseable: bool = True, + duration: int = 5000): + self.setVisible(False) + InfoBarManager.make(self.position).remove(self) + + InfoBar.error( + title=title, + content=content, + orient=Qt.Horizontal, + isClosable=isCloseable, + position=InfoBarPosition.BOTTOM, + duration=duration, + parent=self.parent() + ) diff --git a/ui/pyui/achievement_ui.py b/ui/pyui/achievement_ui.py index 9753328..b86afb9 100644 --- a/ui/pyui/achievement_ui.py +++ b/ui/pyui/achievement_ui.py @@ -3,11 +3,13 @@ from functools import wraps from typing import Callable, Literal from PySide6.QtCore import Qt, Signal, QThread -from PySide6.QtWidgets import QVBoxLayout, QFileDialog, QHBoxLayout, QProgressBar +from PySide6.QtWidgets import QVBoxLayout, QFileDialog, QHBoxLayout from qfluentwidgets import GroupHeaderCardWidget, FluentIcon, PushButton, LineEdit, IconWidget, InfoBarIcon, BodyLabel, \ - PrimaryPushButton, SwitchButton, MessageBox, InfoBar, InfoBarPosition, IndeterminateProgressBar + PrimaryPushButton, SwitchButton +from module import LOGLEVEL from module.worker import ARGWorker +from ui.components.infobar import ProgressInfoBar from ui.components.widget import Widget @@ -120,12 +122,14 @@ class AchievementWidget(Widget): # ================================= - self.infoBar = None + self.pib = ProgressInfoBar(parent=self, isClosable=False, duration=-1) + self.pib.hide() # ================================= self.thread = None self.worker = None + self.successFlag = True # ================================== @@ -187,12 +191,13 @@ class AchievementWidget(Widget): self.outputGroup.startButton.setEnabled(False) - # 线程启动与信号连接 self.thread.started.connect(self.worker.run) - self.show_info_bar('') - self.worker.error.connect(self.show_error) + self.show_info_bar() + self.successFlag = True + self.worker.info.connect(self.show_info) + self.worker.error.connect(self.show_error) self.worker.finished.connect(self.thread.quit) self.worker.finished.connect(self.worker.deleteLater) self.thread.finished.connect(self.thread.deleteLater) @@ -207,37 +212,27 @@ class AchievementWidget(Widget): self.worker = None def after_generate(self): - self.outputGroup.startButton.setEnabled(True) - if self.outputGroup.autoOpenSwitch.isChecked(): + if self.outputGroup.autoOpenSwitch.isChecked() and self.successFlag: try: os.startfile(self.output_file_path + "/" + self.output_file_name + ".docx") except Exception as e: self.show_error("?? 不好出错了", str(e)) - if self.infoBar: - self.infoBar.close() - self.infoBar = InfoBar.success( - title='成功!', - content="正在打开文件" if self.outputGroup.autoOpenSwitch.isChecked() else "文件已保存", - orient=Qt.Horizontal, - isClosable=True, - position=InfoBarPosition.BOTTOM, - duration=5000, - parent=self - ) + if self.successFlag: + self.pib.show_success( + content="正在打开文件" if self.outputGroup.autoOpenSwitch.isChecked() else "文件已保存") + else: + self.pib.show_error() + self.outputGroup.startButton.setEnabled(True) def show_error(self, title: str, content: str): + self.successFlag = False self.error.emit(title, content) - def show_info_bar(self, info: str): - self.infoBar = InfoBar( - icon=InfoBarIcon.INFORMATION, - title='请稍后', - content=info, - orient=Qt.Horizontal, - isClosable=False, - position=InfoBarPosition.BOTTOM, - duration=-1, - parent=self - ) - self.infoBar.addWidget(IndeterminateProgressBar(start=True)) - self.infoBar.show() + def show_info_bar(self): + self.pib.set_title('请稍后') + self.pib.show() + self.pib.set_progress(101) + + def show_info(self, content: str, level: str): + if level == LOGLEVEL.INFO: + self.pib.set_title(content) diff --git a/ui/pyui/defense_ui.py b/ui/pyui/defense_ui.py index ea01a3e..71866f1 100644 --- a/ui/pyui/defense_ui.py +++ b/ui/pyui/defense_ui.py @@ -1,12 +1,13 @@ -from typing import Literal, Callable from functools import wraps +from typing import Literal, Callable from PySide6.QtCore import Qt, Signal, QThread from PySide6.QtWidgets import QHBoxLayout, QVBoxLayout, QFileDialog from qfluentwidgets import GroupHeaderCardWidget, PushButton, IconWidget, InfoBarIcon, \ - BodyLabel, PrimaryPushButton, FluentIcon, LineEdit, InfoBar, InfoBarPosition, ProgressBar, IndeterminateProgressBar + BodyLabel, PrimaryPushButton, FluentIcon, LineEdit from module.worker import DTGWorker +from ui.components.infobar import ProgressInfoBar from ui.components.widget import Widget @@ -121,8 +122,8 @@ class DefenseWidget(Widget): self.vbox.addWidget(self.exportCard) self.vbox.addStretch(1) - self.infoBar = None - self.pb = None + self.pib = ProgressInfoBar(parent=self, isClosable=False, duration=-1) + self.pib.hide() self.thread = None self.worker = None @@ -142,40 +143,16 @@ class DefenseWidget(Widget): self.exportCard.startSignal.connect(self.start_generate) def show_info_bar(self): - self.infoBar = InfoBar( - icon=InfoBarIcon.INFORMATION, - title='请稍后', - content="", - orient=Qt.Horizontal, - isClosable=False, - position=InfoBarPosition.BOTTOM, - duration=-1, - parent=self - ) - self.pb = ProgressBar(self.infoBar) - self.infoBar.addWidget(self.pb) - self.infoBar.show() + self.pib.show() + self.pib.set_title('请稍后') def set_pb_value(self, value: int) -> None: - if self.pb: - self.pb.setValue(value) - if value == 100: - self.infoBar.close() - self.infoBar = InfoBar( - icon=InfoBarIcon.INFORMATION, - title='正在转换文件', - content="", - orient=Qt.Horizontal, - isClosable=False, - position=InfoBarPosition.BOTTOM, - duration=-1, - parent=self - ) - self.infoBar.addWidget(IndeterminateProgressBar(start=True)) - self.infoBar.show() - self.pb = None - elif value == -1: - self.successFlag = False + self.pib.set_progress(value) + if value == 100: + self.pib.set_progress(101) + self.pib.set_title('正在转换文件') + elif value == -1: + self.successFlag = False def enable_start_check(func: Callable): @wraps(func) @@ -254,27 +231,10 @@ class DefenseWidget(Widget): def after_generate(self): self.exportCard.startButton.setEnabled(True) - self.infoBar.close() if self.successFlag: - self.infoBar = InfoBar.success( - title='成功!', - content="正在打开文件...", - orient=Qt.Horizontal, - isClosable=True, - position=InfoBarPosition.BOTTOM, - duration=5000, - parent=self - ) + self.pib.show_success(content="正在打开文件...") else: - self.infoBar = InfoBar.error( - title='失败!', - content="", - orient=Qt.Horizontal, - isClosable=True, - position=InfoBarPosition.BOTTOM, - duration=5000, - parent=self - ) + self.pib.show_error() def show_error(self, title: str, content: str): self.errorSignal.emit(title, content)