from PyQt5.QtCore import QDir, Qt, QTimer
from PyQt5.QtGui import QPixmap
from PyQt5.QtWidgets import (QApplication, QCheckBox, QFileDialog, QGridLayout,
QGroupBox, QHBoxLayout, QLabel, QPushButton, QSizePolicy, QSpinBox,
QVBoxLayout, QWidget)
class Screenshot(QWidget):
def __init__(self):
super(Screenshot, self).__init__()
self.screenshotLabel = QLabel()
self.screenshotLabel.setSizePolicy(QSizePolicy.Expanding, # политики
QSizePolicy.Expanding)
self.screenshotLabel.setAlignment(Qt.AlignCenter) # выравниваем
self.screenshotLabel.setMinimumSize(240, 160) # устанавливаем минимальный размер окна
self.createOptionsGroupBox() # собственная функция создания контейнера опций
self.createButtonsLayout() # собственная функция создания контейнера кнопок
mainLayout = QVBoxLayout() # контейнер
mainLayout.addWidget(self.screenshotLabel) # добавление элементов
mainLayout.addWidget(self.optionsGroupBox)
mainLayout.addLayout(self.buttonsLayout)
self.setLayout(mainLayout) # устанавливаем контейнер как основной для формы
self.shootScreen() # функция создания скриншота
self.delaySpinBox.setValue(5) # задаем значение по умолчанию
self.setWindowTitle("Screenshot")
self.resize(300, 200)
def resizeEvent(self, event):
scaledSize = self.originalPixmap.size()
scaledSize.scale(self.screenshotLabel.size(), Qt.KeepAspectRatio)
if not self.screenshotLabel.pixmap() or scaledSize != self.screenshotLabel.pixmap().size():
self.updateScreenshotLabel()
def newScreenshot(self):
if self.hideThisWindowCheckBox.isChecked():
self.hide()
self.newScreenshotButton.setDisabled(True)
QTimer.singleShot(self.delaySpinBox.value() * 1000,
self.shootScreen)
def saveScreenshot(self):
format = 'png'
initialPath = QDir.currentPath() + "/untitled." + format # 'C:/Users/mcold/Dropbox/Python projects/PyQt_examples/desktop/untitled.png'
fileName, _ = QFileDialog.getSaveFileName(self, "Save As", initialPath,
"%s Files (*.%s);;All Files (*)" % (format.upper(), format))
if fileName:
self.originalPixmap.save(fileName, format)
def shootScreen(self):
if self.delaySpinBox.value() != 0:
QApplication.instance().beep() # звуковой сигнал
screen = QApplication.primaryScreen() # тип данных QScreen
if screen is not None:
self.originalPixmap = screen.grabWindow(0) # return QPixmap
else:
self.originalPixmap = QPixmap()
self.updateScreenshotLabel() # устанавливаем Pixmap в label
self.newScreenshotButton.setDisabled(False)
if self.hideThisWindowCheckBox.isChecked():
self.show()
def updateCheckBox(self):
if self.delaySpinBox.value() == 0:
self.hideThisWindowCheckBox.setDisabled(True) # блокировка чекбокса
else:
self.hideThisWindowCheckBox.setDisabled(False)
def createOptionsGroupBox(self):
self.optionsGroupBox = QGroupBox("Options") # создаем группировку
self.delaySpinBox = QSpinBox() # строка редактирования
self.delaySpinBox.setSuffix(" s") # суффикс секунды
self.delaySpinBox.setMaximum(60) # максимальное значение
self.delaySpinBox.valueChanged.connect(self.updateCheckBox) # сигнал - слот
self.delaySpinBoxLabel = QLabel("Screenshot Delay:")
self.hideThisWindowCheckBox = QCheckBox("Hide This Window")
optionsGroupBoxLayout = QGridLayout() # расставляем элементы в гриде
optionsGroupBoxLayout.addWidget(self.delaySpinBoxLabel, 0, 0)
optionsGroupBoxLayout.addWidget(self.delaySpinBox, 0, 1)
optionsGroupBoxLayout.addWidget(self.hideThisWindowCheckBox, 1, 0, 1, 2)
self.optionsGroupBox.setLayout(optionsGroupBoxLayout) # ставим грид в групбокс
def createButtonsLayout(self):
self.newScreenshotButton = self.createButton("New Screenshot",
self.newScreenshot)
self.saveScreenshotButton = self.createButton("Save Screenshot",
self.saveScreenshot)
self.quitScreenshotButton = self.createButton("Quit", self.close)
self.buttonsLayout = QHBoxLayout()
self.buttonsLayout.addStretch()
self.buttonsLayout.addWidget(self.newScreenshotButton)
self.buttonsLayout.addWidget(self.saveScreenshotButton)
self.buttonsLayout.addWidget(self.quitScreenshotButton)
def createButton(self, text, member): # функция создания кнопки
button = QPushButton(text)
button.clicked.connect(member)
return button
def updateScreenshotLabel(self):
self.screenshotLabel.setPixmap(self.originalPixmap.scaled(
self.screenshotLabel.size(), Qt.KeepAspectRatio,
Qt.SmoothTransformation))
if __name__ == '__main__':
import sys
app = QApplication(sys.argv)
screenshot = Screenshot()
screenshot.show()
sys.exit(app.exec_())