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.setCameraIdle()
self._send.send(gui.IdleState())
while True:
try:

View File

@@ -3,7 +3,7 @@
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.QtGui import QImage, QPainter, QPixmap
@@ -24,7 +24,8 @@ class PyQt5Gui(Gui):
self._app = QApplication(argv)
self._p = PyQt5MainWindow()
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):
@@ -34,7 +35,6 @@ class PyQt5Gui(Gui):
receiver.start()
self._transport = send
self._p.transport = send
self.showStart()
@@ -91,7 +91,7 @@ class PyQt5Gui(Gui):
img = ImageQt.ImageQt(state.picture)
self._p.setCentralWidget(PyQt5PictureMessage('', img))
self._printer.print('test.pdf', state.picture)
self._printer.print(state.picture)
elif isinstance(state, ErrorState):
self.showError(state.title, state.message)
else:
@@ -112,6 +112,13 @@ class PyQt5Gui(Gui):
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):
self._p.handleKeypressEvent = self.handleKeypressEvent
@@ -170,20 +177,6 @@ class PyQt5MainWindow(QMainWindow):
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
def handleKeypressEvent(self):
@@ -213,19 +206,13 @@ class PyQt5MainWindow(QMainWindow):
self.show()
def showMessage(self, message, picture=None):
content = PyQt5PictureMessage(message, picture)
self.setCentralWidget(content)
def closeEvent(self, e):
reply = QMessageBox.question(self, 'Confirmation', "Quit Photobooth?",
QMessageBox.Yes | QMessageBox.No, QMessageBox.No)
if reply == QMessageBox.Yes:
self.transport.close()
# self.transport.close()
e.accept()
else:
e.ignore()
@@ -255,7 +242,7 @@ class PyQt5Start(QFrame):
btnStart = QPushButton('Start Photobooth')
btnStart.resize(btnStart.sizeHint())
btnStart.clicked.connect(gui.showIdle)
btnStart.clicked.connect(gui.showStartPhotobooth)
grid.addWidget(btnStart, 0, 0)
btnSettings = QPushButton('Settings')
@@ -390,6 +377,7 @@ class PyQt5Settings(QFrame):
widget.setLayout(layout)
return widget
def createCameraSettings(self):
global cfg
@@ -571,7 +559,10 @@ class PyQt5PictureMessage(QFrame):
else:
pix = QPixmap(self._picture)
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.end()

View File

@@ -27,6 +27,11 @@ def lookup_and_import(module_list, name, package=None):
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:
try:
Camera = lookup_and_import(camera.modules, config.get('Camera', 'module'), 'camera')

View File

@@ -11,20 +11,33 @@ from . import 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.setOutputFormat(QPrinter.PdfFormat)
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 = 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.drawImage(QPoint(0, 0), img)
painter.drawImage(QPoint(*offset), img)
painter.end()

View File

@@ -9,6 +9,27 @@ modules = (
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!')