class SystemTrayIcon(QSystemTrayIcon): def __init__(self, parent): super(SystemTrayIcon, self).__init__() self.parent = parent self.new_folder_window = NewFolderWindow(parent) self.preferences_window = PreferencesWindow() self.setIcon(QIcon(":gridsync.png")) self.right_menu = RightClickMenu(self) self.setContextMenu(self.right_menu) self.activated.connect(self.on_click) self.animation = QMovie() self.animation.setFileName(":sync.gif") self.animation.updated.connect(self.update_animation_frame) self.animation.setCacheMode(True) def update_animation_frame(self): self.setIcon(QIcon(self.animation.currentPixmap())) def set_icon(self, resource): self.setIcon(QIcon(resource)) def on_click(self, value): #self.right_menu.populate() if value == QSystemTrayIcon.Trigger: open_gridsync_folder() def on_quit(self): reactor.stop()
class SystemTrayIcon(QSystemTrayIcon): def __init__(self, parent): super(SystemTrayIcon, self).__init__() self.parent = parent self.icon = QIcon(resource(settings['application']['tray_icon'])) self.setIcon(self.icon) self.menu = Menu(self) self.setContextMenu(self.menu) self.activated.connect(self.on_click) self.animation = QMovie() self.animation.setFileName( resource(settings['application']['tray_icon_sync'])) self.animation.updated.connect(self.update) self.animation.setCacheMode(True) def update(self): if self.parent.core.operations: self.animation.setPaused(False) self.setIcon(QIcon(self.animation.currentPixmap())) else: self.animation.setPaused(True) self.setIcon(self.icon) def on_click(self, value): if value == QSystemTrayIcon.Trigger and sys.platform != 'darwin': self.parent.show_main_window()
class MoviePlayer(QWidget): def __init__(self): super(MoviePlayer, self).__init__() self.setAttribute(Qt.WA_TranslucentBackground) self.setWindowFlags(Qt.FramelessWindowHint) self.movie = QMovie(self) self.movieLabel = QLabel("No movie loaded") self.movieLabel.setAlignment(Qt.AlignAbsolute) self.movieLabel.setSizePolicy(QSizePolicy.Ignored, QSizePolicy.Ignored) self.mainLayout = QVBoxLayout() self.mainLayout.addWidget(self.movieLabel) self.setLayout(self.mainLayout) #self.resize(400, 500) self.movieLabel.setMovie(self.movie) self.movie.setFileName('icon/gears.gif') pos = kp.pos() x = pos.x() - ((self.width() / 2) - (kp.width() / 2)) + 220 y = pos.y() - ((self.height() / 2) - (kp.height() / 2)) + 160 self.setGeometry(x, y, 400, 500) self.movie.start()
class MoviePlayer(QWidget): def __init__(self): super(MoviePlayer, self).__init__() self.setAttribute(Qt.WA_TranslucentBackground) self.setWindowFlags(Qt.FramelessWindowHint) self.movie = QMovie(self) self.movieLabel = QLabel("No movie loaded") self.movieLabel.setAlignment(Qt.AlignAbsolute) self.movieLabel.setSizePolicy(QSizePolicy.Ignored, QSizePolicy.Ignored) self.mainLayout = QVBoxLayout() self.mainLayout.addWidget(self.movieLabel) self.setLayout(self.mainLayout) #self.resize(400, 500) self.movieLabel.setMovie(self.movie) self.movie.setFileName('icon/gears.gif') pos = kp.pos() x = pos.x() - ((self.width()/2) - (kp.width()/2)) +220 y = pos.y() - ((self.height()/2) - (kp.height()/2)) +160 self.setGeometry(x,y, 400, 500) self.movie.start()
class EmailProgress(QWidget): #Shows a .gif while email is being sent. def __init__(self): super(EmailProgress, self).__init__() #Sets the background to invisible. self.setAttribute(Qt.WA_TranslucentBackground) #Gets rid of frame around window. self.setWindowFlags(Qt.FramelessWindowHint) #Create a movie object. self.movie = QMovie(self) #In case the gif is missing, display something, maybe. self.movieLabel = QLabel("No movie loaded") #I think there are some alignment issues here with this .gif, needs looked at, could #be a better way to do this. self.movieLabel.setAlignment(Qt.AlignAbsolute) self.movieLabel.setSizePolicy(QSizePolicy.Ignored, QSizePolicy.Ignored) #Could be a better way to do this with Qt Designer self.mainLayout = QVBoxLayout() self.mainLayout.addWidget(self.movieLabel) self.setLayout(self.mainLayout) self.resize(300, 300) self.movieLabel.setMovie(self.movie) self.movie.setFileName('image/email_progress.gif') #Start aligning the .gif on the screen, always needs fudged, there is #probably a better way to do this. pos = fw.pos() x = (pos.x() - ((self.width() / 2) - (fw.width() / 2))) + 100 y = (pos.y() - ((self.height() / 2) - (fw.height() / 2))) + 100 self.setGeometry(x, y, 300, 300) #End aligning the .fig on the screen. #Start the .gif. self.movie.start()
class SystemTrayIcon(QSystemTrayIcon): def __init__(self, gui): super(SystemTrayIcon, self).__init__() self.gui = gui tray_icon_path = resource(settings['application']['tray_icon']) self.app_pixmap = QPixmap(tray_icon_path) self.app_icon = QIcon(tray_icon_path) self.setIcon(self.app_icon) self.menu = Menu(self.gui) self.setContextMenu(self.menu) self.activated.connect(self.on_click) self.messageClicked.connect(self.gui.show_main_window) self.animation = QMovie() self.animation.setFileName( resource(settings['application']['tray_icon_sync'])) self.animation.updated.connect(self.update) self.animation.setCacheMode(True) def update(self): if self.gui.core.operations: self.animation.setPaused(False) pixmap = self.animation.currentPixmap() if self.gui.unread_messages: pixmap = BadgedPixmap( pixmap, len(self.gui.unread_messages), 0.6 ) self.setIcon(QIcon(pixmap)) else: self.animation.setPaused(True) if self.gui.unread_messages: self.setIcon(QIcon(BadgedPixmap( self.app_pixmap, len(self.gui.unread_messages), 0.6 ))) else: self.setIcon(self.app_icon) def on_click(self, value): if value == QSystemTrayIcon.Trigger and sys.platform != 'darwin': self.gui.show_main_window()
def setupWidget1(self): #setup the tree movie = QMovie() movie.setFileName("res/tree.gif") self.ui.lb_tree.setMovie(movie) self.ui.lb_tree_big.setMovie(movie) movie.start() #setup the statistics self.ui.gridLayout.setHorizontalSpacing(60) self.ui.gridLayout.setVerticalSpacing(10) self.ui.gridLayout.setGeometry(QRect(0, 51, 291, 224)) self.ui.gridLayout.setAlignment(QtCore.Qt.AlignCenter) self.statLabels = [] for i in range(7): self.statLabels.append([]) for j in range(4): self.statLabels[i].append(QLabel()) self.statLabels[i][j].setScaledContents(True) self.statLabels[i][j].setAutoFillBackground(False) self.statLabels[i][j].setAlignment(QtCore.Qt.AlignCenter) self.ui.gridLayout.addWidget(self.statLabels[i][j], i, j, 1, 1)
class MoviePlayer(QWidget): def __init__(self, parent=None): super(MoviePlayer, self).__init__(parent) self.movie = QMovie(self) self.movie.setCacheMode(QMovie.CacheAll) self.movieLabel = QLabel("No movie loaded") self.movieLabel.setAlignment(Qt.AlignCenter) self.movieLabel.setSizePolicy(QSizePolicy.Ignored, QSizePolicy.Ignored) self.movieLabel.setBackgroundRole(QPalette.Dark) self.movieLabel.setAutoFillBackground(True) self.currentMovieDirectory = '' self.createControls() self.createButtons() self.movie.frameChanged.connect(self.updateFrameSlider) self.movie.stateChanged.connect(self.updateButtons) self.fitCheckBox.clicked.connect(self.fitToWindow) self.frameSlider.valueChanged.connect(self.goToFrame) self.speedSpinBox.valueChanged.connect(self.movie.setSpeed) mainLayout = QVBoxLayout() mainLayout.addWidget(self.movieLabel) mainLayout.addLayout(self.controlsLayout) mainLayout.addLayout(self.buttonsLayout) self.setLayout(mainLayout) self.updateFrameSlider() self.updateButtons() self.setWindowTitle("Movie Player") self.resize(400, 400) def open(self): fileName, _ = QFileDialog.getOpenFileName(self, "Open a Movie", self.currentMovieDirectory) if fileName: self.openFile(fileName) def openFile(self, fileName): self.currentMovieDirectory = QFileInfo(fileName).path() self.movie.stop() self.movieLabel.setMovie(self.movie) self.movie.setFileName(fileName) self.movie.start() self.updateFrameSlider() self.updateButtons() def goToFrame(self, frame): self.movie.jumpToFrame(frame) def fitToWindow(self): self.movieLabel.setScaledContents(self.fitCheckBox.isChecked()) def updateFrameSlider(self): hasFrames = (self.movie.currentFrameNumber() >= 0) if hasFrames: if self.movie.frameCount() > 0: self.frameSlider.setMaximum(self.movie.frameCount() - 1) elif self.movie.currentFrameNumber() > self.frameSlider.maximum(): self.frameSlider.setMaximum(self.movie.currentFrameNumber()) self.frameSlider.setValue(self.movie.currentFrameNumber()) else: self.frameSlider.setMaximum(0) self.frameLabel.setEnabled(hasFrames) self.frameSlider.setEnabled(hasFrames) def updateButtons(self): state = self.movie.state() self.playButton.setEnabled(self.movie.isValid() and self.movie.frameCount() != 1 and state == QMovie.NotRunning) self.pauseButton.setEnabled(state != QMovie.NotRunning) self.pauseButton.setChecked(state == QMovie.Paused) self.stopButton.setEnabled(state != QMovie.NotRunning) def createControls(self): self.fitCheckBox = QCheckBox("Fit to Window") self.frameLabel = QLabel("Current frame:") self.frameSlider = QSlider(Qt.Horizontal) self.frameSlider.setTickPosition(QSlider.TicksBelow) self.frameSlider.setTickInterval(10) speedLabel = QLabel("Speed:") self.speedSpinBox = QSpinBox() self.speedSpinBox.setRange(1, 9999) self.speedSpinBox.setValue(100) self.speedSpinBox.setSuffix("%") self.controlsLayout = QGridLayout() self.controlsLayout.addWidget(self.fitCheckBox, 0, 0, 1, 2) self.controlsLayout.addWidget(self.frameLabel, 1, 0) self.controlsLayout.addWidget(self.frameSlider, 1, 1, 1, 2) self.controlsLayout.addWidget(speedLabel, 2, 0) self.controlsLayout.addWidget(self.speedSpinBox, 2, 1) def createButtons(self): iconSize = QSize(36, 36) openButton = QToolButton() openButton.setIcon(self.style().standardIcon( QStyle.SP_DialogOpenButton)) openButton.setIconSize(iconSize) openButton.setToolTip("Open File") openButton.clicked.connect(self.open) self.playButton = QToolButton() self.playButton.setIcon(self.style().standardIcon(QStyle.SP_MediaPlay)) self.playButton.setIconSize(iconSize) self.playButton.setToolTip("Play") self.playButton.clicked.connect(self.movie.start) self.pauseButton = QToolButton() self.pauseButton.setCheckable(True) self.pauseButton.setIcon(self.style().standardIcon( QStyle.SP_MediaPause)) self.pauseButton.setIconSize(iconSize) self.pauseButton.setToolTip("Pause") self.pauseButton.clicked.connect(self.movie.setPaused) self.stopButton = QToolButton() self.stopButton.setIcon(self.style().standardIcon(QStyle.SP_MediaStop)) self.stopButton.setIconSize(iconSize) self.stopButton.setToolTip("Stop") self.stopButton.clicked.connect(self.movie.stop) quitButton = QToolButton() quitButton.setIcon(self.style().standardIcon( QStyle.SP_DialogCloseButton)) quitButton.setIconSize(iconSize) quitButton.setToolTip("Quit") quitButton.clicked.connect(self.close) self.buttonsLayout = QHBoxLayout() self.buttonsLayout.addStretch() self.buttonsLayout.addWidget(openButton) self.buttonsLayout.addWidget(self.playButton) self.buttonsLayout.addWidget(self.pauseButton) self.buttonsLayout.addWidget(self.stopButton) self.buttonsLayout.addWidget(quitButton) self.buttonsLayout.addStretch()
class App(QMainWindow): def __init__(self, model_config=json.load(open('./model_util/config.json', "r"))): super().__init__() self.title = "Voice Conversion App" self.left = 0 self.top = 0 self.width = 800 self.height = 800 self.setWindowTitle(self.title) self.setGeometry(self.left, self.top, self.width, self.height) #========================= some default setting ========================= self.image_mapping = defaultdict(lambda: model_config["default_image"], model_config["speakers_image"]) self.model_config = model_config self.central_widget = QWidget() self.layout = QHBoxLayout(self.central_widget) self.speaker_widget = display.SignalDisplayWidget(self, "Speaker") self.convert_widget = display.SignalDisplayWidget(self, "Convert") self.control_panel = QGroupBox("Control Panel") self.build_control_widget() # will create self.control_widget #========================= start connect something ====================== self.left_group = QGroupBox("Speaker") self.left_group_layout = QHBoxLayout(self.left_group) self.left_group_layout.addWidget(self.speaker_widget) self.left_group_layout.addWidget(self.control_widget) self.layout.addWidget(self.left_group) self.layout.addWidget(self.convert_widget) self.layout.addWidget(self.Movie_Label) self.control_items["Load"].clicked.connect(lambda: self.load_audio()) self.control_items["Record"].clicked.connect( lambda: self.record_callback()) self.setCentralWidget(self.central_widget) self.show() def build_control_widget(self): self.control_widget = QWidget() self.control_layout = QVBoxLayout() self.control_items = dict() CI = self.control_items # Label CI["Label_Sound"] = QLabel("==Sound==") # Push Buttons sound_button_names = ["Load", "Record"] for _name in sound_button_names: CI[_name] = QPushButton(_name, self) CI["Label_Model"] = QLabel("==Model==") CI["model_widget"] = self.construct_model_widget() for _, item in CI.items(): self.control_layout.addWidget(item) self.control_layout.addStretch(1) self.control_widget.setLayout(self.control_layout) def record_callback(self): signal, sr = record.ui.record_dialog() self.set_audio(signal, sr) def load_audio(self): signal, sr = self.speaker_widget.load_audio() self.set_audio(signal, sr) def set_audio(self, signal, sr): self.speaker_widget.set_audio(signal, sr) self.model_widget.set_signal(signal, sr) def construct_model_widget(self): self.model_widget = model_helper.ModelDisplayWidget( self, self.model_config) but = self.model_widget.convert_button but.clicked.disconnect() but.clicked.connect(self.go_convert) combo_box = self.model_widget.trg_combo_box combo_box.currentIndexChanged.connect(self.change_target) self.movie = QMovie(self) self.Movie_Label = QLabel(self) self.Movie_Label.setMovie(self.movie) self.change_target() # change target image return self.model_widget def go_convert(self): signal, sr = self.model_widget.go_convert() print(signal, sr) self.convert_widget.set_audio(signal, sr) def change_target(self): self.movie.setPaused(True) trg_name = self.model_widget.trg_combo_box.currentText() image_path = self.image_mapping[trg_name] self.movie.setFileName(image_path) self.movie.start()
class BubbleImage(QLabel): """绘制背景气泡的控件""" border = 5 trigon = 20 lineLen = 40 # 每行的文字数量 minH = 2 * trigon + 2 * border minW = 2 * trigon + 2 * border def __init__(self, listItem, listView, img=DEFAULT_IMG, lr=True, maxWidth=50): # 图片显示的最长宽度 self.listItem = listItem self.listView = listView self.img = img super(BubbleImage, self).__init__() self.setMinimumWidth(self.minW) # self.setStyleSheet("QLabel:hover{background-color:rgba(210,240,250,255);}")#鼠标滑过的颜色设置,这样自定义的paintEvent绘图区域就被看穿了 self.setState(False) # 设置鼠标不进入状态,方便绘图区域的颜色更新 self.lr = lr # 标志绘制左还是右 if self.lr: self.setContentsMargins(int(self.trigon * sqrt(3) / 2 + 3), self.border + 3, self.border + 3, self.border + 3) else: self.setContentsMargins(self.border + 3, self.border + 3, int(self.trigon * sqrt(3) / 2 + 3), self.border + 3) self.setScaledContents(True) if not os.path.exists(img): img = DEFAULT_IMG pic = QPixmap(img) self.wid = pic.size().width( ) if pic.size().width() < maxWidth else maxWidth nPic = pic.scaledToWidth(self.wid) # 高度自动计算,以便保持比例 self.setPixmap(nPic) if img.endswith('gif'): self.movie = QMovie(self) self.movie.setFileName(img) self.movie.setCacheMode(QMovie.CacheNone) self.movie.frameChanged.connect(self.animate) self.movie.start() @pyqtSlot(int) def animate(self, index): pic = self.movie.currentPixmap() nPic = pic.scaledToWidth(self.wid) self.setPixmap(nPic) def paintEvent(self, e): size = self.size() qp = QPainter() qp.begin(self) if self.lr: self.leftBubble(qp, size.width(), size.height()) else: self.rightBubble(qp, size.width(), size.height()) qp.end() super(BubbleImage, self).paintEvent(e) def leftBubble(self, qp, w, h): qp.setPen(self.colorLeftE) # 设置画笔颜色,绘制的矩形边缘颜色 qp.setBrush(self.colorLeftM) # 设置红色的笔刷 middle = h / 2 shifty = self.trigon / 2 shiftx = self.trigon * sqrt(3) / 2 pL = QPolygonF() pL.append(QPointF(0, middle)) # 起始点 pL.append(QPointF(shiftx, middle + shifty)) # 第二点 pL.append(QPointF(shiftx, h - self.border)) # 第三点 pL.append(QPointF(w - self.border, h - self.border)) # 第四点 pL.append(QPointF(w - self.border, self.border)) # 第五点 pL.append(QPointF(shiftx, self.border)) # 第六点 pL.append(QPointF(shiftx, middle - shifty)) # 第七点 qp.drawPolygon(pL) def rightBubble(self, qp, w, h): qp.setPen(self.colorRightE) # 设置画笔颜色,绘制的矩形边缘颜色 qp.setBrush(self.colorRightM) # 设置红色的笔刷 middle = h / 2 shifty = self.trigon / 2 shiftx = self.trigon * sqrt(3) / 2 pL = QPolygonF() pL.append(QPointF(w, middle)) # 起始点 pL.append(QPointF(w - shiftx, middle + shifty)) # 第二点 pL.append(QPointF(w - shiftx, h - self.border)) # 第三点 pL.append(QPointF(self.border, h - self.border)) # 第四点 pL.append(QPointF(self.border, self.border)) # 第五点 pL.append(QPointF(w - shiftx, self.border)) # 第六点 pL.append(QPointF(w - shiftx, middle - shifty)) # 第七点 qp.drawPolygon(pL) def setState(self, mouse): '''鼠标进入和鼠标出时需要显示不一样的效果,主要就是更新颜色变量,然后调用update更新重绘''' if mouse: # 鼠标进入 self.colorLeftM = QColor("#eaeaea") self.colorLeftE = QColor("#D6D6D6") self.colorRightM = QColor("#8FD648") self.colorRightE = QColor("#85AF65") else: self.colorLeftM = QColor("#fafafa") self.colorLeftE = QColor("#D6D6D6") self.colorRightM = QColor("#9FE658") self.colorRightE = QColor("#85AF65") self.update() # 更新界面,不用执行也可以更新,但是不实时 def enterEvent(self, e): # print 'mouse entered' self.setState(True) def leaveEvent(self, e): # print 'mouse leaved' self.setState(False) def contextMenuEvent(self, e): ''' 右键菜单实现文本的复制和控件的删除''' editUser = QAction(QIcon('icons/copy.png'), u'复制', self) # 第一个参数也可以给一个QIcon图标 editUser.triggered.connect(self.copyImage) delUser = QAction(QIcon('icons/delete.png'), u'删除', self) delUser.triggered.connect(self.delTextItem) # 选中就会触发 menu = QMenu() menu.addAction(editUser) menu.addAction(delUser) menu.exec_(QCursor.pos()) # 全局位置比较好,使用e.pos()还得转换 e.accept() # 禁止弹出菜单事件传递到父控件中 def copyImage(self, b): # print 'msg copyed' cb = QApplication.clipboard() cb.setImage(QImage(self.img)) def delTextItem(self, b): # print 'msg deleted' self.listView.takeItem( self.listView.indexFromItem(self.listItem).row())
class ImageView(QScrollArea): imageLoaded = pyqtSignal(IPFSPath, MIMEType) qrCodesPresent = pyqtSignal(list) def __init__(self, parent=None): super(ImageView, self).__init__(parent) self.app = QApplication.instance() self.image = QImage() self.clip = QMovie(self) self.clipFirstPixmap = None self.clipCurrentPixmap = None self.currentImgPath = None self.setObjectName('ImageView') self.qrDecoder = IPFSQrDecoder() self.labelImage = QLabel() self.setAlignment(Qt.AlignCenter) self.labelImage.setAlignment(Qt.AlignCenter) self.setBackgroundRole(QPalette.Dark) self.labelImage.setSizePolicy(QSizePolicy.Ignored, QSizePolicy.Ignored) self.labelImage.setScaledContents(True) self.scaleFactor = 1.0 self.setWidget(self.labelImage) def wheelEvent(self, event): """ Zoom in/out on the image on mouse wheel events """ degrees = event.angleDelta() if degrees.y() == 0: return yDeg = max(min(60, abs(degrees.y())), 240) if degrees.y() > 0: factor = 1 + ((yDeg / 30) * 0.05) self.zoomIn(factor=factor) elif degrees.y() < 0: factor = 1 - ((yDeg / 30) * 0.05) self.zoomOut(factor=factor) event.accept() def pinImage(self): if self.currentImgPath and self.currentImgPath.valid: ensure(self.pinImageFromPath(self.currentImgPath)) @ipfsOp async def pinImageFromPath(self, ipfsop, imgPath): await ipfsop.ctx.pin(str(imgPath)) def fitWindow(self, fit): self.setWidgetResizable(fit) if not fit: self.scaleFactor = 1.0 self.resizePixmap() def zoomOut(self, factor=0.75): self.scaleFactor *= factor self.resizePixmap() def zoomIn(self, factor=1.25): self.scaleFactor *= factor self.resizePixmap() def zoomInClicked(self): self.zoomIn() def zoomOutClicked(self): self.zoomOut() def resizePixmap(self): if self.labelImage.movie() and self.clipFirstPixmap: self.labelImage.resize(self.scaleFactor * self.clipFirstPixmap.size()) return pixmap = self.labelImage.pixmap() if pixmap == 0 or pixmap is None: return self.labelImage.resize(self.scaleFactor * pixmap.size()) @ipfsOp async def showImage(self, ipfsop, imgPath, fromBlock=False, timeout=10): try: if fromBlock is True: imgData = await ipfsop.waitFor( ipfsop.client.block.get(imgPath), timeout) else: imgData = await ipfsop.waitFor(ipfsop.catObject(imgPath), timeout) if not imgData: raise Exception('Failed to load image') mimeType, statInfo = await self.app.rscAnalyzer(IPFSPath(imgPath)) if mimeType is None: raise Exception('Failed to load image') stat = StatInfo(statInfo) if mimeType.isAnimation: fp = self.app.tempDir.filePath(stat.cid) tmpFile = QFile(fp) if not tmpFile.exists() and tmpFile.open(QFile.ReadWrite): tmpFile.write(imgData) tmpFile.close() self.clip.stop() self.clip.setFileName(fp) self.labelImage.setMovie(self.clip) self.clip.frameChanged.connect(self.onMovieFrameChanged) self.clip.start() self.labelImage.adjustSize() else: img = QImage() img.loadFromData(imgData) self.image = img self.labelImage.setPixmap(QPixmap.fromImage(self.image)) self.labelImage.adjustSize() self.resizePixmap() if self.qrDecoder: # See if we have any QR codes in the image urls = self.qrDecoder.decode(imgData) if urls: self.qrCodesPresent.emit(urls) self.labelImage.adjustSize() self.currentImgPath = IPFSPath(imgPath) self.imageLoaded.emit(self.currentImgPath, mimeType) except Exception: logUser.debug('Failed to load image: {path}'.format(path=imgPath)) messageBox(iImageCannotLoad(imgPath)) def onMovieFrameChanged(self, num): self.clipCurrentPixmap = self.clip.currentPixmap() if self.clipFirstPixmap is None: self.clipFirstPixmap = self.clipCurrentPixmap def onMovieError(self, err): logUser.info(f'{self.clip.fileName()}: {self.clip.lastErrorString()}')
class MoviePlayer(QWidget): def __init__(self, parent=None): super(MoviePlayer, self).__init__(parent) self.movie = QMovie(self) self.movie.setCacheMode(QMovie.CacheAll) self.movieLabel = QLabel("No movie loaded") self.movieLabel.setAlignment(Qt.AlignCenter) self.movieLabel.setSizePolicy(QSizePolicy.Ignored, QSizePolicy.Ignored) self.movieLabel.setBackgroundRole(QPalette.Dark) self.movieLabel.setAutoFillBackground(True) self.currentMovieDirectory = '' self.createControls() self.createButtons() self.movie.frameChanged.connect(self.updateFrameSlider) self.movie.stateChanged.connect(self.updateButtons) self.fitCheckBox.clicked.connect(self.fitToWindow) self.frameSlider.valueChanged.connect(self.goToFrame) self.speedSpinBox.valueChanged.connect(self.movie.setSpeed) mainLayout = QVBoxLayout() mainLayout.addWidget(self.movieLabel) mainLayout.addLayout(self.controlsLayout) mainLayout.addLayout(self.buttonsLayout) self.setLayout(mainLayout) self.updateFrameSlider() self.updateButtons() self.setWindowTitle("Movie Player") self.resize(400, 400) def open(self): fileName, _ = QFileDialog.getOpenFileName(self, "Open a Movie", self.currentMovieDirectory) if fileName: self.openFile(fileName) def openFile(self, fileName): self.currentMovieDirectory = QFileInfo(fileName).path() self.movie.stop() self.movieLabel.setMovie(self.movie) self.movie.setFileName(fileName) self.movie.start() self.updateFrameSlider(); self.updateButtons(); def goToFrame(self, frame): self.movie.jumpToFrame(frame) def fitToWindow(self): self.movieLabel.setScaledContents(self.fitCheckBox.isChecked()) def updateFrameSlider(self): hasFrames = (self.movie.currentFrameNumber() >= 0) if hasFrames: if self.movie.frameCount() > 0: self.frameSlider.setMaximum(self.movie.frameCount() - 1) elif self.movie.currentFrameNumber() > self.frameSlider.maximum(): self.frameSlider.setMaximum(self.movie.currentFrameNumber()) self.frameSlider.setValue(self.movie.currentFrameNumber()) else: self.frameSlider.setMaximum(0) self.frameLabel.setEnabled(hasFrames) self.frameSlider.setEnabled(hasFrames) def updateButtons(self): state = self.movie.state() self.playButton.setEnabled(self.movie.isValid() and self.movie.frameCount() != 1 and state == QMovie.NotRunning) self.pauseButton.setEnabled(state != QMovie.NotRunning) self.pauseButton.setChecked(state == QMovie.Paused) self.stopButton.setEnabled(state != QMovie.NotRunning) def createControls(self): self.fitCheckBox = QCheckBox("Fit to Window") self.frameLabel = QLabel("Current frame:") self.frameSlider = QSlider(Qt.Horizontal) self.frameSlider.setTickPosition(QSlider.TicksBelow) self.frameSlider.setTickInterval(10) speedLabel = QLabel("Speed:") self.speedSpinBox = QSpinBox() self.speedSpinBox.setRange(1, 9999) self.speedSpinBox.setValue(100) self.speedSpinBox.setSuffix("%") self.controlsLayout = QGridLayout() self.controlsLayout.addWidget(self.fitCheckBox, 0, 0, 1, 2) self.controlsLayout.addWidget(self.frameLabel, 1, 0) self.controlsLayout.addWidget(self.frameSlider, 1, 1, 1, 2) self.controlsLayout.addWidget(speedLabel, 2, 0) self.controlsLayout.addWidget(self.speedSpinBox, 2, 1) def createButtons(self): iconSize = QSize(36, 36) openButton = QToolButton() openButton.setIcon(self.style().standardIcon(QStyle.SP_DialogOpenButton)) openButton.setIconSize(iconSize) openButton.setToolTip("Open File") openButton.clicked.connect(self.open) self.playButton = QToolButton() self.playButton.setIcon(self.style().standardIcon(QStyle.SP_MediaPlay)) self.playButton.setIconSize(iconSize) self.playButton.setToolTip("Play") self.playButton.clicked.connect(self.movie.start) self.pauseButton = QToolButton() self.pauseButton.setCheckable(True) self.pauseButton.setIcon(self.style().standardIcon(QStyle.SP_MediaPause)) self.pauseButton.setIconSize(iconSize) self.pauseButton.setToolTip("Pause") self.pauseButton.clicked.connect(self.movie.setPaused) self.stopButton = QToolButton() self.stopButton.setIcon(self.style().standardIcon(QStyle.SP_MediaStop)) self.stopButton.setIconSize(iconSize) self.stopButton.setToolTip("Stop") self.stopButton.clicked.connect(self.movie.stop) quitButton = QToolButton() quitButton.setIcon(self.style().standardIcon(QStyle.SP_DialogCloseButton)) quitButton.setIconSize(iconSize) quitButton.setToolTip("Quit") quitButton.clicked.connect(self.close) self.buttonsLayout = QHBoxLayout() self.buttonsLayout.addStretch() self.buttonsLayout.addWidget(openButton) self.buttonsLayout.addWidget(self.playButton) self.buttonsLayout.addWidget(self.pauseButton) self.buttonsLayout.addWidget(self.stopButton) self.buttonsLayout.addWidget(quitButton) self.buttonsLayout.addStretch()
class Demo3(QDialog): def __init__(self, parent=None): QDialog.__init__(self, parent) self.setWindowTitle('show_gif') self.setWindowIcon(QIcon('image/Capture_64px.png')) self.setWindowFlags(self.windowFlags() | Qt.WindowMinMaxButtonsHint) # self.resize(400,400) self.setFixedSize(800, 600) mainl = QVBoxLayout(self) self.labelShow = QLabel() self.labelShow.setContentsMargins(0, 0, 0, 0) pat = self.labelShow.palette() pat.setBrush(QPalette.Background, Qt.darkGray) self.labelShow.setAutoFillBackground(True) self.labelShow.setPalette(pat) self.labelShow.setAlignment(Qt.AlignCenter) # self.labelShow.setScaledContents(True) mainl.addWidget(self.labelShow, 1) line = QFrame() line.setFrameShape(QFrame.HLine) line.setFrameShadow(QFrame.Sunken) mainl.addWidget(line) btnLay = QHBoxLayout() frmLay = QFormLayout() self._spinBox = QSpinBox() frmLay.addRow('跳转:', self._spinBox) btnGo = QPushButton('Go', self) btnPrev = QPushButton('上一张', self) self.btnNext = QPushButton('下一张', self) btnPrev.clicked.connect(self.on_prev) self.btnNext.clicked.connect(self.on_next) btnGo.clicked.connect(lambda: self.flashMovie(self._spinBox.value())) self._spinBox.valueChanged.connect(lambda n: self.flashMovie(n)) btnLay.addStretch() btnLay.addLayout(frmLay) btnLay.addWidget(btnGo) btnLay.addWidget(btnPrev) btnLay.addWidget(self.btnNext) btnLay.addStretch() mainl.addLayout(btnLay) labLay = QHBoxLayout() labLay.setSpacing(10) self._label = QLabel() frm1 = QFormLayout() frm1.addRow('共:', self._label) frm1.setRowWrapPolicy(QFormLayout.WrapLongRows) labLay.addStretch() labLay.addLayout(frm1) frm1 = QFormLayout() self._labInfo = QLabel() # self._labInfo.setWordWrap(True) frm1.addRow('当前:', self._labInfo) # frm1.setFieldGrowthPolicy(QFormLayout.ExpandingFieldsGrow) frm1.setRowWrapPolicy(QFormLayout.WrapLongRows) labLay.addLayout(frm1) frm1 = QFormLayout() self._labPlay = QLabel() frm1.addRow('播放帧号:', self._labPlay) labLay.addLayout(frm1) frm1.setRowWrapPolicy(QFormLayout.WrapLongRows) labLay.addStretch() labLay.setSpacing(10) line = QFrame() line.setFrameShape(QFrame.HLine) line.setFrameShadow(QFrame.Sunken) mainl.addWidget(line) mainl.addLayout(labLay) self._gifs = [] self._movie = QMovie() self.labelShow.setMovie(self._movie) QTimer.singleShot(0, self.on_firstShow) self._picIndex = 0 self._movie.frameChanged.connect(self.on_frameChange) # self._movie.finished.connect(lambda:self.btnNext.clicked.emit()) def on_frameChange(self, n): self._labPlay.setText(' {} 帧'.format(n)) if n + 1 == self._movie.frameCount(): self.btnNext.clicked.emit() def on_firstShow(self): dir = r'E:\jiandanspider\pic' for i in os.listdir(dir): # print(os.path.isfile(i),i.lower(),i.lower().endswith('gif')) fullPath = os.path.join(dir, i) if os.path.isfile(fullPath) and i.lower().endswith('gif'): self._gifs.append(fullPath) self._spinBox.setMaximum(len(self._gifs)) self._label.setText('%03d条记录' % len(self._gifs)) if len(self._gifs) > 0: self._movie.setFileName(self._gifs[0]) self._movie.start() self._labInfo.setText('{},{}帧\n{}'.format( os.path.split(self._movie.fileName())[1], self._movie.frameCount(), self._movie.frameRect())) def flashMovie(self, index): if index >= len(self._gifs): return self._movie.stop() self._movie.setFileName(self._gifs[index]) self._movie.start() self._spinBox.valueChanged.disconnect() self._spinBox.setValue(index) self._labInfo.setText('{},{}帧\n{}'.format( os.path.split(self._movie.fileName())[1], self._movie.frameCount(), self._movie.frameRect())) self._spinBox.valueChanged.connect(lambda n: self.flashMovie(n)) self._picIndex = index def on_next(self): self._picIndex += 1 if self._picIndex >= len(self._gifs): self._picIndex = len(self._gifs) - 1 self.flashMovie(self._picIndex) def on_prev(self): self._picIndex -= 1 if self._picIndex < 0: self._picIndex = 0 self.flashMovie(self._picIndex)