pyvideotrans / videotrans /component /progressbar.py
jameson512
Upload files via LFS
1f235c3
Raw
History Blame Contribute Delete
4.01 kB
import re
from pathlib import Path
from PySide6.QtCore import QUrl, Qt
from PySide6.QtGui import QDesktopServices
from PySide6.QtWidgets import QLabel, QProgressBar, QHBoxLayout
from videotrans.configure.config import tr
from videotrans.util import tools
class ClickableProgressBar(QLabel):
def __init__(self, parent=None):
super().__init__()
self.target_dir = None
self.msg = tr('running')#保存最后一条日志信息,当只有进度没有消息时显示
self.parent = parent
self.basename = ""
self.name = ""
self.precent = 0
self.duration=0#已消耗的时间秒
self.paused = False
self.ended = False
self.error = ''
self.progress_bar = QProgressBar(self)
self.progress_bar.setFixedHeight(35)
self.progress_bar.setRange(0, 100) # 设置进度范围
self.progress_bar.setTextVisible(True)
self.progress_bar.setStyleSheet("""
QProgressBar {
background-color: transparent;
border:1px solid #32414B;
color:#fff;
height:35px;
text-align:left;
border-radius:3px;
}
QProgressBar::chunk {
width: 8px;
border-radius:0;
}
""")
layout = QHBoxLayout(self)
layout.addWidget(self.progress_bar) # 将进度条添加到布局
def setTarget(self, target_dir=None, name=None):
self.target_dir = target_dir
self.name = name
self.basename = Path(name).name
# 正常成功结束时,如果已有出错,则不处理
def setEnd(self):
if self.error:
return
self.ended = True
self.precent = 100
self.progress_bar.setValue(100)
self.setCursor(Qt.PointingHandCursor)
self.progress_bar.setFormat(f' {self.basename} {tr("endandopen")}')
self.error = ''
# 暂停,仅针对未完成的
def setPause(self):
if not self.ended:
self.paused = True
self.progress_bar.setFormat(f' {tr("haspaused")} [{self.precent}%] {self.basename}')
# 进度,如果进度已大于100则结束,如果小于,则取消暂停
def setPrecent(self, p):
self.paused = False
if p >= 100:
self.precent = 100
self.error = ''
self.setEnd()
else:
self.precent = p if p > self.precent else self.precent
self.progress_bar.setValue(self.precent)
self.progress_bar.setFormat(f' [{self.precent}% {self.duration}] {self.msg} {self.basename}')
# 出错时,设置状态,停止 完成
def setError(self, text=""):
self.error = text
self.ended = True
self.progress_bar.setToolTip(
tr("Click to view the detailed error report"))
self.progress_bar.setFormat(f' [{self.precent}%] {text[:90].strip()} {self.basename}')
# 设置按钮显示文字,如果已结束,则不设置,直接返回
# 进度 set_precent 后将仅传进来时间,此时使用上次保留的msg消息
def setText(self, text=''):
if self.progress_bar:
if self.ended or self.paused:
return
if re.match(r'^\d+?$',text):
# 更新时间
self.duration=text
if self.precent < 60 and int(text)%5==0:
self.precent+=0.001
elif text.strip():
self.msg=text[:150].replace("\n",'')
self.progress_bar.setFormat(f' [{self.precent:.2f}% {self.duration}s] {self.msg} {self.basename}') # set text format
def mousePressEvent(self, event):
if self.target_dir and event.button() == Qt.LeftButton:
if self.error:
tools.show_error(self.error)
QDesktopServices.openUrl(QUrl.fromLocalFile(self.target_dir))