class YPictureBubble(QLabel): def __init__(self, widget): super().__init__(widget) self.parent_widget = widget self.setScaledContents(True) def setPicture(self, image_name): self.filename = image_name max_width = 300 is_gif = False if image_name[-3:].lower() == 'gif': self.gif = QMovie(image_name) if self.gif.isValid(): is_gif = True self.setMovie(self.gif) self.gif.start() g = self.gif.currentImage() w, h = (g.width(), g.height()) if not is_gif: im = Image.open(image_name) w, h = im.size self.setPixmap(im.toqpixmap()) if w >= h and w > max_width: ratio = max_width / w elif h > w and h > max_width: ratio = max_width / h else: ratio = 1 w, h = int(w * ratio), int(h * ratio) self.resize(w, h)
def load(self, source): """Load anything that QImageReader or QMovie constructors accept""" # Use QImageReader to identify animated GIFs for separate handling # (Thanks to https://stackoverflow.com/a/20674469/435253 for this) image_reader = QImageReader(source) from PyQt5.QtGui import QImageIOHandler if image_reader.supportsAnimation() and image_reader.imageCount() > 1: movie = QMovie(source) # Calculate the aspect ratio and adjust the widget size movie.jumpToFrame(0) movie_size = movie.currentImage().size() self.movie_aspect = movie_size.width() / movie_size.height() self.resizeEvent() self.label.setMovie(movie) movie.start() # Free memory if the previous image was non-animated self.orig_pixmap = None else: self.orig_pixmap = QPixmap(image_reader.read()) self.label.setPixmap(self.orig_pixmap) # Fail quickly if our violated invariants result in stale # aspect-ratio information getting reused self.movie_aspect = None # Keep the image from preventing downscaling self.setMinimumSize(1, 1)
def __init__(self, parent): super().__init__(parent) if os.path.exists(ImageConfig.ABOUT_DIALOG_BACKGROUND_FILE): self.setWindowTitle("关于 - 仅供学习研究使用") label = QLabel(self) label.setMaximumSize(self.MAX_LENGTH, self.MAX_LENGTH) movie = QMovie(ImageConfig.ABOUT_DIALOG_BACKGROUND_FILE) label.setMovie(movie) movie.start() self.resize(movie.currentImage().size()) else: self.ui = loadUi(os.path.join(RESOURCE_PATH, "about_dialog.ui"), self)
def set_loading(self): loader = QMovie(appctxt.get_resource("animations/loader.gif")) self.preview_box.setMovie(loader) loader.jumpToFrame(0) self.preview_box.resize(loader.currentImage().size()) loader.start()