#!/usr/bin/python3 from PyQt5.QtWidgets import QAction, QMenu, QMainWindow, QApplication, QMessageBox, QFileDialog, QInputDialog from PyQt5.QtGui import QImage, QImageWriter from PyQt5.QtCore import QDir from ubuscribble.scribble import Scribble class MainWindow(QMainWindow): def __init__(self): super(MainWindow, self).__init__() self.saveAsActs = [] self.scribble= Scribble() self.setCentralWidget(self.scribble) self.createActions() self.createMenus() self.setWindowTitle("Scribble") self.resize(500, 500) def closeEvent(self, event): if self.maybeSave(): event.accept() else: event.ignore() def open(self): if self.maybeSave(): fileName, _ = QFileDialog.getOpenFileName(self, "Open File", QDir.currentPath()) if fileName: self.scribble.openImage(fileName) def save(self): action = self.sender() fileFormat = action.data() self.saveFile(fileFormat) def penColor(self): newColor = QColorDialog.getColor(self.scribble.penColor()) if newColor.isValid(): self.scribble.setPenColor(newColor) def penWidth(self): newWidth, ok = QInputDialog.getInt(self, "Scribble", "Select pen width:", self.scribble.penWidth(), 1, 50, 1) if ok: self.scribble.setPenWidth(newWidth) def about(self): QMessageBox.about(self, "About Scribble", "<p>The <b>Scribble</b> example shows how to use " "QMainWindow as the base widget for an application, and how " "to reimplement some of QWidget's event handlers to receive " "the events generated for the application's widgets:</p>" "<p> We reimplement the mouse event handlers to facilitate " "drawing, the paint event handler to update the application " "and the resize event handler to optimize the application's " "appearance. In addition we reimplement the close event " "handler to intercept the close events before terminating " "the application.</p>" "<p> The example also demonstrates how to use QPainter to " "draw an image in real time, as well as to repaint " "widgets.</p>") def createActions(self): self.openAct = QAction("&Open...", self, shortcut="Ctrl+O", triggered=self.open) for format in QImageWriter.supportedImageFormats(): format = str(format) text = format.upper() + "..." action = QAction(text, self, triggered=self.save) action.setData(format) self.saveAsActs.append(action) self.printAct = QAction("&Print...", self, triggered=self.scribble.print_) self.exitAct = QAction("E&xit", self, shortcut="Ctrl+Q", triggered=self.close) self.penColorAct = QAction("&Pen Color...", self, triggered=self.penColor) self.penWidthAct = QAction("Pen &Width...", self, triggered=self.penWidth) self.clearScreenAct = QAction("&Clear Screen", self, shortcut="Ctrl+L", triggered=self.scribble.clearImage) self.aboutAct = QAction("&About", self, triggered=self.about) self.aboutQtAct = QAction("About &Qt", self, triggered=QApplication.instance().aboutQt) def createMenus(self): self.saveAsMenu = QMenu("&Save As", self) for action in self.saveAsActs: self.saveAsMenu.addAction(action) fileMenu = QMenu("&File", self) fileMenu.addAction(self.openAct) fileMenu.addMenu(self.saveAsMenu) fileMenu.addAction(self.printAct) fileMenu.addSeparator() fileMenu.addAction(self.exitAct) optionMenu = QMenu("&Options", self) optionMenu.addAction(self.penColorAct) optionMenu.addAction(self.penWidthAct) optionMenu.addSeparator() optionMenu.addAction(self.clearScreenAct) helpMenu = QMenu("&Help", self) helpMenu.addAction(self.aboutAct) helpMenu.addAction(self.aboutQtAct) self.menuBar().addMenu(fileMenu) self.menuBar().addMenu(optionMenu) self.menuBar().addMenu(helpMenu) def maybeSave(self): if self.scribble.isModified(): ret = QMessageBox.warning(self, "Scribble", "The image has been modified.\n" "Do you want to save your changes?", QMessageBox.Save | QMessageBox.Discard | QMessageBox.Cancel) if ret == QMessageBox.Save: return self.saveFile('png') elif ret == QMessageBox.Cancel: return False return True def saveFile(self, fileFormat): initialPath = QDir.currentPath() + '/untitled.' + fileFormat fileName, _ = QFileDialog.getSaveFileName(self, "Save As", initialPath, "%s Files (*.%s);;All Files (*)" % (fileFormat.upper(), fileFormat)) if fileName: return self.scribble.saveImage(fileName, fileFormat) return False if __name__ == '__main__': import sys app = QApplication(sys.argv) window = MainWindow() window.show() sys.exit(app.exec_())