首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QPixmapCache in PyQt6

QPixmapCache in PyQt6
EN

Stack Overflow用户
提问于 2022-08-29 04:41:24
回答 1查看 53关注 0票数 0

你好,我正在尝试创建一个PyQt6小部件,它可以在一组图像上动画,但是以精确的帧速率(随实时参数的不同而变化)。我将QPixmap插入到for循环中的缓存中,并且能够通过相同的for循环通过QPixmap.find()找到QPixmap对象,但在循环.find()之外,.find()返回None

下面是剧本。如果需要的话,我可以包括图像系列。感谢你的帮助。

代码语言:javascript
复制
import sys
from PyQt6.QtWidgets import (
    QApplication,
    QMainWindow,
    QLabel
)
from PyQt6.QtCore import Qt
from PyQt6.QtGui import QPixmap, QPixmapCache
from pathlib import Path

class MainWindow(QMainWindow):

    def __init__(self):
        super().__init__()
        self.animating_label = QLabel('animation here')
        self.animating_label.setAlignment(Qt.AlignmentFlag.AlignHCenter | Qt.AlignmentFlag.AlignVCenter)
        self.animating_label.pixmap().size().setWidth(200)
        self.animating_label.pixmap().size().setHeight(200)
        self.setCentralWidget(self.animating_label)

        parent_path = Path(__file__).parent
        self.images_path = parent_path / 'images/animation_set/'
        self.animating_label.setPixmap(QPixmap(self.images_path.__str__() + "/clock01.png"))

        self.pixmapcache_keys: [str] = []

        self.load_images()
        test = QPixmapCache.find("clock02")
        try:
            self.animating_label.setPixmap(test)
        except:
            if test == None:
                print("Failure: QPixMapCache.find() returned", test)

    def load_images(self):
        image_suffixes = ['.jpg', '.png', '.gif', '.bmp']
        imgs_found_count = 0
        for filepath in self.images_path.iterdir():
            if filepath.suffix in image_suffixes:
                imgs_found_count += 1
                cache_key = filepath.stem
                self.pixmapcache_keys.append(cache_key)

                if not QPixmapCache.find(cache_key):
                    pixmap = QPixmap(filepath.__str__())
                    QPixmapCache.insert(cache_key, pixmap)

                print("pixmap %s" % cache_key, QPixmapCache.find(cache_key))


        print(imgs_found_count, "image(s) found in animation_set directory.", len(self.pixmapcache_keys),
              "keys loaded into QPixmapCache")

app = QApplication(sys.argv)

window = MainWindow()
window.show()

# start Qt event loop
app.exec()

print("Script complete.")
sys.exit(1)

这是输出:

代码语言:javascript
复制
pixmap clock04 <PyQt6.QtGui.QPixmap object at 0x101c84b30>
pixmap clock10 <PyQt6.QtGui.QPixmap object at 0x101c84970>
pixmap clock11 <PyQt6.QtGui.QPixmap object at 0x101c84b30>
pixmap clock05 <PyQt6.QtGui.QPixmap object at 0x101c84970>
...

24 image(s) found in animation_set directory. 24 keys loaded into QPixmapCache
Failure: QPixMapCache.find() returned None
Script complete.
EN

回答 1

Stack Overflow用户

发布于 2022-08-30 19:45:01

我能够使用QPixmaps列表而不是QPixmapCache来让动画工作,但我不确定这是否是最佳方法。

从文件生成Q像素映射列表:

代码语言:javascript
复制
        for filepath in sorted(self.images_path.iterdir()):
            if filepath.suffix in image_suffixes:
                qpixmap = QPixmap(filepath.__str__())
                self.pixmaps.append(qpixmap)

用计时器叫到其他地方

代码语言:javascript
复制
    def advance(self):
        if self.pixmap_current_index >= len(self.pixmaps) - 1:
            self.pixmap_current_index = 0
        else:
            self.pixmap_current_index += 1
        self.animating_label.setPixmap(self.pixmaps[self.pixmap_current_index])
        self.timer.start(self.refresh_interval)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73524193

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档