Source code for PyMca5.PyMcaGui.plotting.Q4PyMcaPrintPreview

#/*##########################################################################
# Copyright (C) 2004-2014 V.A. Sole, European Synchrotron Radiation Facility
#
# This file is part of the PyMca X-ray Fluorescence Toolkit developed at
# the ESRF by the Software group.
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
# THE SOFTWARE.
#
#############################################################################*/
__author__ = "V.A. Sole - ESRF Data Analysis"
__contact__ = "sole@esrf.fr"
__license__ = "MIT"
__copyright__ = "European Synchrotron Radiation Facility, Grenoble, France"
import sys
import os
from PyMca5.PyMcaGui import PyMcaQt as qt
DEBUG = 0
__revision__="$Revision: 1.7 $"

# TODO:
# - automatic picture centering
# - print quality

QTVERSION = qt.qVersion()


################################################################################
##################             PyMcaPrintPreview               ###################
################################################################################
[docs]class PyMcaPrintPreview(qt.QDialog): def __init__(self, parent = None, printer = None, name = "PyMcaPrintPreview", \ modal = 0, fl = 0): qt.QDialog.__init__(self, parent) self.setWindowTitle(name) self.setModal(modal) self.resize(400, 500) self.printDialog = None self._toBeCleared = False self._svgItems = [] self.printer = printer """ if printer is None: printer = qt.QPrinter(qt.QPrinter.HighResolution) printer.setPageSize(qt.QPrinter.A4) printerName = "%s" % printer.printerName() if printerName in ['id24b2u']: #id24 printer very slow in color mode printer.setColorMode(qt.QPrinter.GrayScale) printer.setFullPage(True) if (printer.width() <= 0) or (printer.height() <= 0): if QTVERSION < '4.2.0': #this is impossible (no QGraphicsView) filename = "PyMCA_print.pdf" else: filename = "PyMCA_print.ps" if sys.platform == 'win32': home = os.getenv('USERPROFILE') try: l = len(home) directory = os.path.join(home,"My Documents") except: home = '\\' directory = '\\' if os.path.isdir('%s' % directory): directory = os.path.join(directory,"PyMca") else: directory = os.path.join(home,"PyMca") if not os.path.exists('%s' % directory): os.mkdir('%s' % directory) finalfile = os.path.join(directory, filename) else: home = os.getenv('HOME') directory = os.path.join(home,"PyMca") if not os.path.exists('%s' % directory): os.mkdir('%s' % directory) finalfile = os.path.join(directory, filename) printer.setOutputFileName(finalfile) printer.setColorMode(qt.QPrinter.Color) """ self.mainLayout = qt.QVBoxLayout(self) self.mainLayout.setContentsMargins(0, 0, 0, 0) self.mainLayout.setSpacing(0) self._buildToolbar() self.scene = None self.page = None self.view = None
[docs] def exec_(self): if self._toBeCleared: self.__clearAll() return qt.QDialog.exec_(self)
[docs] def raise_(self): if self._toBeCleared: self.__clearAll() return qt.QDialog.raise_(self)
[docs] def show(self): if self._toBeCleared: self.__clearAll() return qt.QDialog.show(self)
[docs] def setOutputFileName(self, name): if self.printer is not None: self.printer.setOutputFileName(name) else: raise IOError("setOutputFileName : a printer must be defined before")
def _buildToolbar(self): # --- command buttons buttonSize = 65 toolBar = qt.QWidget(self) # a layout for the toolbar toolsLayout = qt.QHBoxLayout(toolBar) toolsLayout.setContentsMargins(0, 0, 0, 0) toolsLayout.setSpacing(0) # Margin """ marginLabel = qt.QLabel("Margins:", toolBar) if QTVERSION < '4.0.0': self.marginSpin = qt.QSpinBox(0, 50, 10, toolBar) else: self.marginSpin = qt.QSpinBox(toolBar) self.marginSpin.setRange(0, 50) self.marginSpin.setSingleStep(10) self.marginSpin.valueChanged[int].connect( \ self.__marginChanged) """ # Scale / Zoom scaleLabel = qt.QLabel("Zoom:", toolBar) scaleCombo = qt.QComboBox(toolBar) self.scaleValues = [20, 40, 60, 80, 100, 150, 200] for scale in self.scaleValues: scaleCombo.addItem("%3d %%"%scale) self.scaleCombo = scaleCombo self.scaleCombo.activated[int].connect(self.__scaleChanged) hideBut = qt.QPushButton("Hide", toolBar) #hideBut.setFixedWidth(buttonSize-10) hideBut.clicked.connect(self.hide) cancelBut = qt.QPushButton("Clear All", toolBar) #cancelBut.setFixedWidth(buttonSize+10) cancelBut.clicked.connect(self.__clearAll) removeBut = qt.QPushButton("Remove", toolBar) #removeBut.setFixedWidth(buttonSize) removeBut.clicked.connect(self.__remove) setupBut = qt.QPushButton("Setup", toolBar) #setupBut.setFixedWidth(buttonSize-5) setupBut.clicked.connect(self.setup) printBut = qt.QPushButton("Print", toolBar) #printBut.setFixedWidth(buttonSize-5) printBut.clicked.connect(self.__print) zoomPlusBut = qt.QPushButton("Zoom +", toolBar) #zoomPlusBut.setFixedWidth(buttonSize-5) zoomPlusBut.clicked.connect(self.__zoomPlus) zoomMinusBut = qt.QPushButton("Zoom -", toolBar) #zoomMinusBut.setFixedWidth(buttonSize-5) zoomMinusBut.clicked.connect(self.__zoomMinus) # now we put widgets in the toolLayout toolsLayout.addWidget(hideBut) toolsLayout.addWidget(printBut) toolsLayout.addWidget(cancelBut) toolsLayout.addWidget(removeBut) toolsLayout.addWidget(setupBut) #toolsLayout.addStretch() #toolsLayout.addWidget(marginLabel) #toolsLayout.addWidget(self.marginSpin) toolsLayout.addStretch() #toolsLayout.addWidget(scaleLabel) #toolsLayout.addWidget(scaleCombo) toolsLayout.addWidget(zoomPlusBut) toolsLayout.addWidget(zoomMinusBut) #toolsLayout.addStretch() self.toolBar = toolBar self.mainLayout.addWidget(self.toolBar) def _buildStatusBar(self): # status bar statusBar = qt.QStatusBar(self) self.targetLabel = qt.QLabel(statusBar) self.__updateTargetLabel() statusBar.addWidget(self.targetLabel) self.mainLayout.addWidget(statusBar) def __updateTargetLabel(self): if self.printer is None: self.targetLabel.setText("???") return if hasattr(qt, "QString"): if len(self.printer.outputFileName()): self.targetLabel.setText(qt.QString("File:").append( self.printer.outputFileName())) else: self.targetLabel.setText(qt.QString("Printer:").append( self.printer.printerName())) else: if len(self.printer.outputFileName()): self.targetLabel.setText("File:"+\ self.printer.outputFileName()) else: self.targetLabel.setText("Printer:"+\ self.printer.printerName()) def __print(self): printer = self.printer painter = qt.QPainter() try: if not(painter.begin(printer)): print("CANOT INITIALIZE PRINTER") return 0 self.scene.render(painter, qt.QRectF(0, 0, printer.width(), printer.height()), qt.QRectF(self.page.rect().x(), self.page.rect().y(), self.page.rect().width(),self.page.rect().height()), qt.Qt.KeepAspectRatio) painter.end() self.hide() self.accept() self._toBeCleared = True except: painter.end() qt.QMessageBox.critical(self, "ERROR", 'Printing problem:\n %s' % sys.exc_info()[1]) return def __scaleChanged(self, value): if DEBUG: print("current scale = ", self._viewScale) if value > 2: self.view.scale(1.20, 1.20) else: self.view.scale(0.80, 0.80) def __zoomPlus(self): if DEBUG: print("current scale = ", self._viewScale) self._viewScale *= 1.20 self.view.scale(1.20, 1.20) def __zoomMinus(self): if DEBUG: print("current scale = ", self._viewScale) self._viewScale *= 0.80 self.view.scale(0.80, 0.80)
[docs] def addImage(self, image, title = None, comment = None, commentPosition=None): """ add an image item to the print preview scene """ self.addPixmap(qt.QPixmap.fromImage(image), title = title, comment = comment, commentPosition=commentPosition)
[docs] def addPixmap(self, pixmap, title = None, comment = None, commentPosition=None): """ add a pixmap to the print preview scene """ if self._toBeCleared: self.__clearAll() if self.printer is None: self.setup() if title is None: title = ' ' title += ' ' if comment is None: comment = ' ' comment += ' ' if commentPosition is None: commentPosition = "CENTER" if self.badNews: return rectItem = qt.QGraphicsRectItem(self.page, self.scene) scale = 1.0 # float(0.5 * self.scene.width()/pixmap.width()) rectItem.setRect(qt.QRectF(1, 1, pixmap.width(), pixmap.height())) pen = rectItem.pen() color = qt.QColor(qt.Qt.red) color.setAlpha(1) pen.setColor(color) rectItem.setPen(pen) rectItem.setZValue(1) rectItem.setFlag(qt.QGraphicsItem.ItemIsSelectable, True) rectItem.setFlag(qt.QGraphicsItem.ItemIsMovable, True) rectItem.setFlag(qt.QGraphicsItem.ItemIsFocusable, False) #I add the resize tool rectItemResizeRect = GraphicsResizeRectItem(rectItem, self.scene) rectItemResizeRect.setZValue(2) #I add a pixmap item pixmapItem = qt.QGraphicsPixmapItem(rectItem, self.scene) pixmapItem.setPixmap(pixmap) #pixmapItem.moveBy(0, 0) pixmapItem.setZValue(0) #I add the title textItem = qt.QGraphicsTextItem(title, rectItem, self.scene) textItem.setTextInteractionFlags(qt.Qt.TextEditorInteraction) offset = 0.5 * textItem.boundingRect().width() textItem.moveBy(0.5 * pixmap.width() - offset, -20) textItem.setZValue(2) #I add the comment commentItem = qt.QGraphicsTextItem(comment, rectItem, self.scene) commentItem.setTextInteractionFlags(qt.Qt.TextEditorInteraction) offset = 0.5 * commentItem.boundingRect().width() if commentPosition.upper() == "LEFT": x = 1 else: x = 0.5 * pixmap.width() - offset commentItem.moveBy(x, pixmap.height()+20) commentItem.setZValue(2) #I should adjust text size here #textItem.scale(2,2) #commentItem.scale(2,2) rectItem.scale(scale, scale) rectItem.moveBy(20 , 40)
[docs] def isReady(self): if self.badNews: return False else: return True
[docs] def addSvgItem(self, item, title = None, comment = None, commentPosition=None): if self._toBeCleared: self.__clearAll() if self.printer is None: self.setup() if self.badNews: # printer not properly initialized return if not isinstance(item, qt.QSvgRenderer): raise TypeError("addSvgItem: QSvgRenderer expected") if title is None: title = 50 * ' ' if comment is None: comment = 80 * ' ' if commentPosition is None: commentPosition = "CENTER" if 0 and hasattr(item, "_viewBox"): svgItem = GraphicsSvgItem(self.page) svgItem.setSharedRenderer(item) svgItem.setBoundingRect(item._viewBox) elif 1: svgItem = GraphicsSvgRectItem(item._viewBox, self.page) svgItem.setSvgRenderer(item) else: svgItem = qt.QGraphicsSvgItem(self.page) svgItem.setSharedRenderer(item) if hasattr(item, "_viewBox"): svgScaleX = item._viewBox.width()/svgItem.boundingRect().width() svgScaleY = item._viewBox.height()/svgItem.boundingRect().height() svgItem.scale(svgScaleX, svgScaleY) svgItem.setCacheMode(qt.QGraphicsItem.NoCache) svgItem.setZValue(0) svgItem.setFlag(qt.QGraphicsItem.ItemIsSelectable, True) svgItem.setFlag(qt.QGraphicsItem.ItemIsMovable, True) svgItem.setFlag(qt.QGraphicsItem.ItemIsFocusable, False) #I add the resize tool rectItemResizeRect = GraphicsResizeRectItem(svgItem, self.scene) rectItemResizeRect.setZValue(2) #make sure the life time of the item is enough to print it! self._svgItems.append(item) #I add the title textItem = qt.QGraphicsTextItem(title, svgItem, self.scene) textItem.setTextInteractionFlags(qt.Qt.TextEditorInteraction) offset = 0.5 * textItem.boundingRect().width() textItem.setZValue(1) textItem.setFlag(qt.QGraphicsItem.ItemIsMovable, True) #I add the comment dummyComment = 80 * "1" commentItem = qt.QGraphicsTextItem(dummyComment, svgItem, self.scene) commentItem.setTextInteractionFlags(qt.Qt.TextEditorInteraction) scaleCalculationRect = qt.QRectF(commentItem.boundingRect()) commentItem.setPlainText(comment) commentItem.moveBy(svgItem.boundingRect().x(), svgItem.boundingRect().y() + svgItem.boundingRect().height()) commentItem.setZValue(1) scale = svgItem.boundingRect().width() / scaleCalculationRect.width() commentItem.setFlag(qt.QGraphicsItem.ItemIsMovable, True) commentItem.scale(scale, scale) textItem.moveBy(svgItem.boundingRect().x()+\ 0.5 * svgItem.boundingRect().width() - offset * scale, svgItem.boundingRect().y()) textItem.scale(scale, scale)
[docs] def setup(self): """ """ if self.printer is None: self.printer = qt.QPrinter() if (self.printDialog is None) or (not self.isReady()): self.printDialog = qt.QPrintDialog(self.printer, self) if self.printDialog.exec_(): if (self.printer.width() <= 0) or (self.printer.height() <= 0): self.message = qt.QMessageBox(self) self.message.setIcon(qt.QMessageBox.Critical) self.message.setText("Unknown library error \non printer initialization") self.message.setWindowTitle("Library Error") self.message.setModal(0) self.badNews = True self.printer = None return self.badNews = False self.printer.setFullPage(True) self.updatePrinter() else: if self.page is None: # not initialized self.badNews = True self.printer = None else: self.badNews = False
[docs] def updatePrinter(self): if DEBUG: print("UPDATE PRINTER") printer = self.printer if self.scene is None: self.scene = qt.QGraphicsScene() self.scene.setBackgroundBrush(qt.QColor(qt.Qt.lightGray)) self.scene.setSceneRect(qt.QRectF(0,0, printer.width(), printer.height())) if self.page is None: self.page = qt.QGraphicsRectItem(0,0, printer.width(), printer.height()) self.page.setBrush(qt.QColor(qt.Qt.white)) self.scene.addItem(self.page) self.scene.setSceneRect(qt.QRectF(0,0, self.printer.width(), self.printer.height())) self.page.setPos(qt.QPointF(0.0, 0.0)) self.page.setRect(qt.QRectF(0,0, self.printer.width(), self.printer.height())) if self.view is None: self.view = qt.QGraphicsView(self.scene) self.mainLayout.addWidget(self.view) self._buildStatusBar() self.view.fitInView(self.page.rect(), qt.Qt.KeepAspectRatio) self._viewScale = 1.00 #self.view.scale(1./self._viewScale, 1./self._viewScale) #self.view.fitInView(self.page.rect(), qt.Qt.KeepAspectRatio) #self._viewScale = 1.00 self.__updateTargetLabel()
def __cancel(self): """ """ self.reject() def __clearAll(self): """ Clear the print preview window, remove all items but and keep the page. """ itemlist = self.scene.items() keep = self.page while (len(itemlist) != 1): if itemlist.index(keep) == 0: self.scene.removeItem(itemlist[1]) else: self.scene.removeItem(itemlist[0]) itemlist = self.scene.items() self._svgItems = [] self._toBeCleared = False def __remove(self): """ """ itemlist = self.scene.items() i = None #this loop is not efficient if there are many items ... for item in itemlist: if item.isSelected(): i = itemlist.index(item) break if i is not None: self.scene.removeItem(item) #this line is not really needed because the list #should be deleted at the end of the method del itemlist[i]
if hasattr(qt, 'QGraphicsSvgItem'):
[docs] class GraphicsSvgItem(qt.QGraphicsSvgItem):
[docs] def setBoundingRect(self, rect): self._rect = rect
[docs] def boundingRect(self): return self._rect
[docs] def paint(self, painter, *var, **kw): if not self.renderer().isValid(): print("Invalid renderer") return if self.elementId().isEmpty(): self.renderer().render(painter, self._rect) else: self.renderer().render(painter, self.elementId(), self._rect)
[docs] class GraphicsSvgRectItem(qt.QGraphicsRectItem):
[docs] def setSvgRenderer(self, renderer): self._renderer = renderer
[docs] def paint(self, painter, *var, **kw):
#self._renderer.render(painter, self._renderer._viewBox) self._renderer.render(painter, self.boundingRect())
[docs]class GraphicsResizeRectItem(qt.QGraphicsRectItem): def __init__(self, parent = None, scene = None, keepratio = True): qt.QGraphicsRectItem.__init__(self, parent, scene) #rect = parent.sceneBoundingRect() rect = parent.boundingRect() x = rect.x() y = rect.y() w = rect.width() h = rect.height() self._newRect = None self.keepRatio = keepratio self.setRect(qt.QRectF(x + w - 40, y + h - 40, 40, 40)) self.setAcceptHoverEvents(True) if DEBUG: self.setBrush(qt.QBrush(qt.Qt.white, qt.Qt.SolidPattern)) else: pen = qt.QPen() color = qt.QColor(qt.Qt.white) color.setAlpha(0) pen.setColor(color) pen.setStyle(qt.Qt.NoPen) self.setPen(pen) self.setBrush(color) self.setFlag(self.ItemIsMovable, True) self.show()
[docs] def hoverEnterEvent(self, event): if self.parentItem().isSelected(): self.parentItem().setSelected(False) if self.keepRatio: self.setCursor(qt.QCursor(qt.Qt.SizeFDiagCursor)) else: self.setCursor(qt.QCursor(qt.Qt.SizeAllCursor)) self.setBrush(qt.QBrush(qt.Qt.yellow, qt.Qt.SolidPattern)) return qt.QGraphicsRectItem.hoverEnterEvent(self, event)
[docs] def hoverLeaveEvent(self, event): self.setCursor(qt.QCursor(qt.Qt.ArrowCursor)) pen = qt.QPen() color = qt.QColor(qt.Qt.white) color.setAlpha(0) pen.setColor(color) pen.setStyle(qt.Qt.NoPen) self.setPen(pen) self.setBrush(color) return qt.QGraphicsRectItem.hoverLeaveEvent(self, event)
[docs] def mouseDoubleClickEvent(self, event): if DEBUG: print("ResizeRect mouseDoubleClick")
[docs] def mousePressEvent(self, event): if DEBUG: print("ResizeRect mousePress") if self._newRect is not None: self._newRect = None self.__point0 = self.pos() parent = self.parentItem() scene = self.scene() rect = parent.rect() self._x = rect.x() self._y = rect.y() self._w = rect.width() self._h = rect.height() self._ratio = self._w /self._h self._newRect = qt.QGraphicsRectItem(parent, scene) self._newRect.setRect(qt.QRectF(self._x, self._y, self._w, self._h)) qt.QGraphicsRectItem.mousePressEvent(self, event)
[docs] def mouseMoveEvent(self, event): if DEBUG: print("ResizeRect mouseMove") point1 = self.pos() deltax = point1.x() - self.__point0.x() deltay = point1.y() - self.__point0.y() if self.keepRatio: r1 = (self._w + deltax) / self._w r2 = (self._h + deltay) / self._h if r1 < r2: self._newRect.setRect(qt.QRectF(self._x, self._y, self._w + deltax, (self._w + deltax)/self._ratio)) else: self._newRect.setRect(qt.QRectF(self._x, self._y, (self._h + deltay)* self._ratio, self._h + deltay)) else: self._newRect.setRect(qt.QRectF(self._x, self._y, self._w + deltax, self._h + deltay)) qt.QGraphicsRectItem.mouseMoveEvent(self, event)
[docs] def mouseReleaseEvent(self, event): if DEBUG: print("ResizeRect mouseRelease") point1 = self.pos() deltax = point1.x() - self.__point0.x() deltay = point1.y() - self.__point0.y() self.moveBy(-deltax, -deltay) parent = self.parentItem() if 0: #this works if no zoom at the viewport rect = parent.sceneBoundingRect() w = rect.width() h = rect.height() scalex = (w + deltax) / w scaley = (h + deltay) / h if self.keepRatio: scalex = min(scalex, scalex) parent.scale(scalex, scalex) else: parent.scale(scalex, scaley) else: #deduce it from the rect because it always work if self.keepRatio: scalex = self._newRect.rect().width()/ self._w scaley = scalex else: scalex = self._newRect.rect().width()/ self._w scaley = self._newRect.rect().height()/self._h parent.scale(scalex, scaley) self.scene().removeItem(self._newRect) self._newRect = None qt.QGraphicsRectItem.mouseReleaseEvent(self, event)
################################################################################ ##################### TEST -- PyMcaPrintPreview -- TEST ################## ################################################################################
[docs]def testPreview(): """ """ import sys import os if len(sys.argv) < 2: print("give an image file as parameter please.") sys.exit(1) if len(sys.argv) > 2: print("only one parameter please.") sys.exit(1) filename = sys.argv[1] a = qt.QApplication(sys.argv) if filename[-3:] == "svg": if 0: item = qt.QSvgWidget() item.load(filename) item.show() else: w = PyMcaPrintPreview( parent = None, printer = None, name = 'Print Prev', modal = 0, fl = 0) w.resize(400,500) item = qt.QGraphicsSvgItem(filename, w.page) item.setFlag(qt.QGraphicsItem.ItemIsMovable, True) item.setCacheMode(qt.QGraphicsItem.NoCache) sys.exit(w.exec_()) p = qt.QPrinter() p.setOutputFileName(os.path.splitext(filename)[0]+".ps") p.setColorMode(qt.QPrinter.Color) w = PyMcaPrintPreview( parent = None, printer = p, name = 'Print Prev', modal = 0, fl = 0) w.resize(400,500) comment = "" for i in range(20): comment += "Line number %d: En un lugar de La Mancha de cuyo nombre ...\n" w.addPixmap(qt.QPixmap.fromImage(qt.QImage(filename)), title=filename, comment=comment, commentPosition="CENTER") w.addImage(qt.QImage(filename), comment=comment, commentPosition="LEFT") #w.addImage(qt.QImage(filename)) w.exec_()
[docs]def testSimple(): import sys import os filename = sys.argv[1] a = qt.QApplication(sys.argv) w = qt.QWidget() l = qt.QVBoxLayout(w) button = qt.QPushButton(w) button.setText("Print") scene = qt.QGraphicsScene() pixmapItem = qt.QGraphicsPixmapItem(qt.QPixmap.fromImage(qt.QImage(filename))) pixmapItem.setFlag(pixmapItem.ItemIsMovable, True) printer = qt.QPrinter(qt.QPrinter.HighResolution) printer.setFullPage(True) printer.setOutputFileName(os.path.splitext(filename)[0]+".ps") page = qt.QGraphicsRectItem(0,0, printer.width(), printer.height()) scene.setSceneRect(qt.QRectF(0,0, printer.width(), printer.height())) scene.addItem(page) scene.addItem(pixmapItem) view = qt.QGraphicsView(scene) view.fitInView(page.rect(), qt.Qt.KeepAspectRatio) #view.setSceneRect( view.scale(2, 2) #page.scale(0.05, 0.05) def printFile(): painter = qt.QPainter(printer) scene.render(painter, qt.QRectF(0, 0, printer.width(), printer.height()), qt.QRectF(page.rect().x(), page.rect().y(), page.rect().width(),page.rect().height()), qt.Qt.KeepAspectRatio) painter.end() l.addWidget(button) l.addWidget(view) w.resize(300, 600) w.show() button.clicked[()].connect(printFile) a.exec_()
## MAIN if __name__ == '__main__': testPreview() #testSimple()