This is a simple example I wrote. Input images are produced from PDF's by [ImageMagick](/linux/graphics/imagemagick). ```py from PySide6.QtCore import * from PySide6.QtGui import * from PySide6.QtWidgets import * from glob import glob import os import sys app = QApplication([]) i = 0 pngs = [] while os.path.exists(fn:=f"{i}.png"): pngs.append(fn) i += 1 pixmaps = [ QPixmap(png) for png in pngs ] idx = 0 class Canvas(QWidget): def __init__(self,*xs,pixmaps=pixmaps,**kw): super().__init__(*xs,**kw) self.resize(800,600) self.offset = 0 self.skip_size = 100 self.update_pixmaps(pixmaps) def update_pixmaps(self,pixmaps): self.pixmaps = pixmaps if len(self.pixmaps) == 0: print(f"No pixmaps") return self.pwidth = pixmaps[0].width() self.pheight = pixmaps[0].height() self.total_height = self.pheight * len(pixmaps) def keyPressEvent(self,e): print(e.key()) if e.key() == Qt.Key_C: return self.setOffset(self.offset + self.skip_size) elif e.key() == Qt.Key_Q: app.quit() def setOffset(self,offset): self.offset = offset % self.total_height self.update() def paintEvent(self,e): # offset is based on screen pixels # assume pages have the same height rect = self.rect() width = rect.width() height = rect.height() square = min(width,height) x0 = (width-square)//2 offset = self.offset swidth = self.pwidth sheight = self.pheight sdratio = swidth/square soffset = int(offset * swidth / square) soffset_in_page = soffset % self.pheight page = (soffset // self.pheight) % len(self.pixmaps) page2 = (page + 1) % len(self.pixmaps) pixmap1 = self.pixmaps[page] pixmap2 = self.pixmaps[page2] if soffset_in_page + swidth > sheight: sheight2 = (soffset_in_page + swidth) - sheight sheight1 = swidth - sheight2 srect1 = QRect(0,soffset_in_page,swidth,sheight1) srect2 = QRect(0,0,swidth,sheight2) trect1 = QRect(x0,0,square,sheight1/sdratio) trect2 = QRect(x0,sheight1/sdratio,square,square-trect1.height()) else: srem = 0 srect1 = QRect(0,soffset_in_page,swidth,swidth) srect2 = None trect1 = QRect(x0,0,square,square) trect2 = None with QPainter(self) as qp: qp.fillRect(rect,Qt.red) if swidth == 0: print(f"Empty image 1235") return qp.drawPixmap(trect1,pixmap1,srect1) if srect2 is not None: qp.drawPixmap(trect2,pixmap2,srect2) canvas = Canvas() canvas.show() exit(app.exec()) ```