PDF-Printer for debugging, Pictures centered on screen and in print, Startup of Photobooth-Thread delayed

This commit is contained in:
Balthasar Reuter
2018-04-19 22:53:36 +02:00
parent 5f8fa43d56
commit d9eb09475d
5 changed files with 66 additions and 35 deletions

View File

@@ -67,6 +67,7 @@ class Photobooth:
self._send = send self._send = send
self.setCameraIdle() self.setCameraIdle()
self._send.send(gui.IdleState())
while True: while True:
try: try:

View File

@@ -3,7 +3,7 @@
from PIL import ImageQt from PIL import ImageQt
from PyQt5.QtCore import Qt, QObject, QThread, pyqtSignal from PyQt5.QtCore import Qt, QObject, QPoint, QThread, pyqtSignal
from PyQt5.QtWidgets import (QApplication, QCheckBox, QComboBox, QFormLayout, QFrame, QGridLayout, QGroupBox, QHBoxLayout, QLabel, QLayout, QLineEdit, QMainWindow, QMessageBox, QPushButton, QVBoxLayout) from PyQt5.QtWidgets import (QApplication, QCheckBox, QComboBox, QFormLayout, QFrame, QGridLayout, QGroupBox, QHBoxLayout, QLabel, QLayout, QLineEdit, QMainWindow, QMessageBox, QPushButton, QVBoxLayout)
from PyQt5.QtGui import QImage, QPainter, QPixmap from PyQt5.QtGui import QImage, QPainter, QPixmap
@@ -24,7 +24,8 @@ class PyQt5Gui(Gui):
self._app = QApplication(argv) self._app = QApplication(argv)
self._p = PyQt5MainWindow() self._p = PyQt5MainWindow()
self._lastState = self.showStart self._lastState = self.showStart
self._printer = Printer((cfg.getInt('Printer', 'width'), cfg.getInt('Printer', 'height'))) self._printer = Printer((cfg.getInt('Printer', 'width'),
cfg.getInt('Printer', 'height')), True)
def run(self, send, recv): def run(self, send, recv):
@@ -34,7 +35,6 @@ class PyQt5Gui(Gui):
receiver.start() receiver.start()
self._transport = send self._transport = send
self._p.transport = send
self.showStart() self.showStart()
@@ -91,7 +91,7 @@ class PyQt5Gui(Gui):
img = ImageQt.ImageQt(state.picture) img = ImageQt.ImageQt(state.picture)
self._p.setCentralWidget(PyQt5PictureMessage('', img)) self._p.setCentralWidget(PyQt5PictureMessage('', img))
self._printer.print('test.pdf', state.picture) self._printer.print(state.picture)
elif isinstance(state, ErrorState): elif isinstance(state, ErrorState):
self.showError(state.title, state.message) self.showError(state.title, state.message)
else: else:
@@ -112,6 +112,13 @@ class PyQt5Gui(Gui):
self._p.setCentralWidget(PyQt5Settings(self)) self._p.setCentralWidget(PyQt5Settings(self))
def showStartPhotobooth(self):
self._lastState = self.showStartPhotobooth
self._transport.send('start')
self._p.setCentralWidget(PyQt5PictureMessage('Starting the photobooth...'))
def showIdle(self): def showIdle(self):
self._p.handleKeypressEvent = self.handleKeypressEvent self._p.handleKeypressEvent = self.handleKeypressEvent
@@ -170,20 +177,6 @@ class PyQt5MainWindow(QMainWindow):
self.initUI() self.initUI()
@property
def transport(self):
return self._transport
@transport.setter
def transport(self, new_transport):
if not hasattr(new_transport, 'send'):
raise ValueError('PyQt5MainWindow.transport must provide send()')
self._transport = new_transport
@property @property
def handleKeypressEvent(self): def handleKeypressEvent(self):
@@ -213,19 +206,13 @@ class PyQt5MainWindow(QMainWindow):
self.show() self.show()
def showMessage(self, message, picture=None):
content = PyQt5PictureMessage(message, picture)
self.setCentralWidget(content)
def closeEvent(self, e): def closeEvent(self, e):
reply = QMessageBox.question(self, 'Confirmation', "Quit Photobooth?", reply = QMessageBox.question(self, 'Confirmation', "Quit Photobooth?",
QMessageBox.Yes | QMessageBox.No, QMessageBox.No) QMessageBox.Yes | QMessageBox.No, QMessageBox.No)
if reply == QMessageBox.Yes: if reply == QMessageBox.Yes:
self.transport.close() # self.transport.close()
e.accept() e.accept()
else: else:
e.ignore() e.ignore()
@@ -255,7 +242,7 @@ class PyQt5Start(QFrame):
btnStart = QPushButton('Start Photobooth') btnStart = QPushButton('Start Photobooth')
btnStart.resize(btnStart.sizeHint()) btnStart.resize(btnStart.sizeHint())
btnStart.clicked.connect(gui.showIdle) btnStart.clicked.connect(gui.showStartPhotobooth)
grid.addWidget(btnStart, 0, 0) grid.addWidget(btnStart, 0, 0)
btnSettings = QPushButton('Settings') btnSettings = QPushButton('Settings')
@@ -390,6 +377,7 @@ class PyQt5Settings(QFrame):
widget.setLayout(layout) widget.setLayout(layout)
return widget return widget
def createCameraSettings(self): def createCameraSettings(self):
global cfg global cfg
@@ -571,7 +559,10 @@ class PyQt5PictureMessage(QFrame):
else: else:
pix = QPixmap(self._picture) pix = QPixmap(self._picture)
pix = pix.scaled(self.rect().size(), Qt.KeepAspectRatio, Qt.SmoothTransformation) pix = pix.scaled(self.rect().size(), Qt.KeepAspectRatio, Qt.SmoothTransformation)
painter.drawPixmap(pix.rect(), pix, pix.rect())
origin = ( (self.rect().width() - pix.width()) // 2,
(self.rect().height() - pix.height()) // 2 )
painter.drawPixmap(QPoint(*origin), pix)
painter.drawText(event.rect(), Qt.AlignCenter, self._message) painter.drawText(event.rect(), Qt.AlignCenter, self._message)
painter.end() painter.end()

View File

@@ -27,6 +27,11 @@ def lookup_and_import(module_list, name, package=None):
def main_photobooth(config, send, recv): def main_photobooth(config, send, recv):
event = recv.recv()
if str(event) != 'start':
print('Unknown event received: ' + str(event))
raise RuntimeError('Unknown event received', str(event))
while True: while True:
try: try:
Camera = lookup_and_import(camera.modules, config.get('Camera', 'module'), 'camera') Camera = lookup_and_import(camera.modules, config.get('Camera', 'module'), 'camera')

View File

@@ -11,20 +11,33 @@ from . import Printer
class PrinterPyQt5(Printer): class PrinterPyQt5(Printer):
def __init__(self, page_size): def __init__(self, page_size, print_pdf=False):
super().__init__() super().__init__(page_size)
self._printer = QPrinter(QPrinter.HighResolution) self._printer = QPrinter(QPrinter.HighResolution)
self._printer.setOutputFormat(QPrinter.PdfFormat)
self._printer.setPageSize(QPageSize(QSizeF(*page_size), QPageSize.Millimeter)) self._printer.setPageSize(QPageSize(QSizeF(*page_size), QPageSize.Millimeter))
self._print_pdf = print_pdf
if self._print_pdf:
self._counter = 0
self._printer.setOutputFormat(QPrinter.PdfFormat)
self._printer.setFullPage(True)
def print(self, filename, picture):
def print(self, picture):
if self._print_pdf:
self._printer.setOutputFileName('print_' + str(self._counter) + '.pdf')
self._counter += 1
img = ImageQt.ImageQt(picture) img = ImageQt.ImageQt(picture)
img = img.scaled(self._printer.pageRect().size(), Qt.KeepAspectRatio, Qt.SmoothTransformation) img = img.scaled(self._printer.pageRect().size(), Qt.KeepAspectRatio, Qt.SmoothTransformation)
self._printer.setOutputFileName(filename)
printable_size = self._printer.pageRect(QPrinter.DevicePixel)
offset = ( (printable_size.width() - img.width()) // 2,
(printable_size.height() - img.height()) // 2 )
painter = QPainter(self._printer) painter = QPainter(self._printer)
painter.drawImage(QPoint(0, 0), img) painter.drawImage(QPoint(*offset), img)
painter.end() painter.end()

View File

@@ -9,6 +9,27 @@ modules = (
class Printer: class Printer:
def __init__(self): def __init__(self, page_size):
pass self.pageSize = page_size
@property
def pageSize(self):
return self._page_size
@pageSize.setter
def pageSize(self, page_size):
if not isinstance(page_size, (list, tuple)) or len(page_size) != 2:
raise ValueError('page_size must be a list/tuple of length 2')
self._page_size = page_size
def print(self, picture):
raise NotImplementedError('print function not implemented!')