Создание видеоконвертера на PyQt




Для создания видеоконвертера был использован язык python и библиотека PyQt. В комплекте поставляется удобный дизайнер графических интерфейсов qt designer. Воспользуемся им для создания интерфейса приложения:

Также в qt designer создадим правильный objectName для всех элементов, которые будут использоваться в дальнейшем. Это необходимо для того, чтобы через python обращаться к ним не как к pushButton_12, а по нормальным идентификаторам, например, convertButton.

Qt designer при сохранении создает файл.ui. Для того чтобы его было удобно использовать через python, сгенерируем из него исходный файл для python: pyuic4 converter.ui -o converter.py.

Далее в отдельном файле main.py определим логику, обрабатывающую события, происходящие с элементами. Реализуем следующее поведение:

· При нажатии на пункт меню File -> Exit должен произойти выход из приложения

· При нажатии на пункт меню File -> Open File… и на кнопку Open file, должен показываться диалог выбора файла.

· При выборе файла должны появляться остальные элементы приложения

· При изменении качества и разрешения должен пересчитываться примерный размер файла

· При нажатии на кнопку Convert должен появляться прогресс-бар, отображающий процесс конвертации.

· После завершения конвертации должно всплывать сообщение о том, что конвертация завершена.

 

Итоговые скриншоты созданного приложения:

1. Основной экран до выбора файла

2. Файл выбран

3. Нажата кнопка Convert


 

 

4. Конвертация завершена


 

Исходные коды проекта

Converter.py

Файл сгенерирован из converter.ui.

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'converter.ui'
#
# Created by: PyQt4 UI code generator 4.11.4
#
# WARNING! All changes made in this file will be lost!

from PyQt4 import QtCore, QtGui

try:
_fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
def _fromUtf8(s):
return s

try:
_encoding = QtGui.QApplication.UnicodeUTF8
def _translate(context, text, disambig):
return QtGui.QApplication.translate(context, text, disambig, _encoding)
except AttributeError:
def _translate(context, text, disambig):
return QtGui.QApplication.translate(context, text, disambig)

class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName(_fromUtf8("MainWindow"))
MainWindow.resize(264, 276)
self.centralwidget = QtGui.QWidget(MainWindow)
self.centralwidget.setObjectName(_fromUtf8("centralwidget"))
self.verticalLayout = QtGui.QVBoxLayout(self.centralwidget)
self.verticalLayout.setObjectName(_fromUtf8("verticalLayout"))
self.openFileButton = QtGui.QPushButton(self.centralwidget)
self.openFileButton.setObjectName(_fromUtf8("openFileButton"))
self.verticalLayout.addWidget(self.openFileButton)
self.fileNameLabel = QtGui.QLabel(self.centralwidget)
self.fileNameLabel.setObjectName(_fromUtf8("fileNameLabel"))
self.verticalLayout.addWidget(self.fileNameLabel)
self.tabWidget = QtGui.QTabWidget(self.centralwidget)
self.tabWidget.setObjectName(_fromUtf8("tabWidget"))
self.tab = QtGui.QWidget()
self.tab.setObjectName(_fromUtf8("tab"))
self.horizontalLayout_2 = QtGui.QHBoxLayout(self.tab)
self.horizontalLayout_2.setObjectName(_fromUtf8("horizontalLayout_2"))
self.formLayout = QtGui.QFormLayout()
self.formLayout.setFieldGrowthPolicy(QtGui.QFormLayout.AllNonFixedFieldsGrow)
self.formLayout.setObjectName(_fromUtf8("formLayout"))
self.label_2 = QtGui.QLabel(self.tab)
self.label_2.setObjectName(_fromUtf8("label_2"))
self.formLayout.setWidget(0, QtGui.QFormLayout.LabelRole, self.label_2)
self.videoCodecComboBox = QtGui.QComboBox(self.tab)
self.videoCodecComboBox.setObjectName(_fromUtf8("videoCodecComboBox"))
self.videoCodecComboBox.addItem(_fromUtf8(""))
self.videoCodecComboBox.addItem(_fromUtf8(""))
self.formLayout.setWidget(0, QtGui.QFormLayout.FieldRole, self.videoCodecComboBox)
self.label_3 = QtGui.QLabel(self.tab)
self.label_3.setObjectName(_fromUtf8("label_3"))
self.formLayout.setWidget(1, QtGui.QFormLayout.LabelRole, self.label_3)
self.videoQualityComboBox = QtGui.QComboBox(self.tab)
self.videoQualityComboBox.setObjectName(_fromUtf8("videoQualityComboBox"))
self.videoQualityComboBox.addItem(_fromUtf8(""))
self.videoQualityComboBox.addItem(_fromUtf8(""))
self.videoQualityComboBox.addItem(_fromUtf8(""))
self.videoQualityComboBox.addItem(_fromUtf8(""))
self.videoQualityComboBox.addItem(_fromUtf8(""))
self.formLayout.setWidget(1, QtGui.QFormLayout.FieldRole, self.videoQualityComboBox)
self.label = QtGui.QLabel(self.tab)
self.label.setObjectName(_fromUtf8("label"))
self.formLayout.setWidget(2, QtGui.QFormLayout.LabelRole, self.label)
self.resolutionComboBox = QtGui.QComboBox(self.tab)
self.resolutionComboBox.setObjectName(_fromUtf8("resolutionComboBox"))
self.resolutionComboBox.addItem(_fromUtf8(""))
self.resolutionComboBox.addItem(_fromUtf8(""))
self.resolutionComboBox.addItem(_fromUtf8(""))
self.formLayout.setWidget(2, QtGui.QFormLayout.FieldRole, self.resolutionComboBox)
self.horizontalLayout_2.addLayout(self.formLayout)
self.tabWidget.addTab(self.tab, _fromUtf8(""))
self.tab_2 = QtGui.QWidget()
self.tab_2.setObjectName(_fromUtf8("tab_2"))
self.horizontalLayout_3 = QtGui.QHBoxLayout(self.tab_2)
self.horizontalLayout_3.setObjectName(_fromUtf8("horizontalLayout_3"))
self.formLayout_2 = QtGui.QFormLayout()
self.formLayout_2.setFieldGrowthPolicy(QtGui.QFormLayout.AllNonFixedFieldsGrow)
self.formLayout_2.setObjectName(_fromUtf8("formLayout_2"))
self.label_5 = QtGui.QLabel(self.tab_2)
self.label_5.setObjectName(_fromUtf8("label_5"))
self.formLayout_2.setWidget(0, QtGui.QFormLayout.LabelRole, self.label_5)
self.audioCodecComboBox = QtGui.QComboBox(self.tab_2)
self.audioCodecComboBox.setObjectName(_fromUtf8("audioCodecComboBox"))
self.audioCodecComboBox.addItem(_fromUtf8(""))
self.audioCodecComboBox.addItem(_fromUtf8(""))
self.formLayout_2.setWidget(0, QtGui.QFormLayout.FieldRole, self.audioCodecComboBox)
self.label_6 = QtGui.QLabel(self.tab_2)
self.label_6.setObjectName(_fromUtf8("label_6"))
self.formLayout_2.setWidget(1, QtGui.QFormLayout.LabelRole, self.label_6)
self.audioQualityComboBox = QtGui.QComboBox(self.tab_2)
self.audioQualityComboBox.setObjectName(_fromUtf8("audioQualityComboBox"))
self.audioQualityComboBox.addItem(_fromUtf8(""))
self.audioQualityComboBox.addItem(_fromUtf8(""))
self.audioQualityComboBox.addItem(_fromUtf8(""))
self.audioQualityComboBox.addItem(_fromUtf8(""))
self.audioQualityComboBox.addItem(_fromUtf8(""))
self.formLayout_2.setWidget(1, QtGui.QFormLayout.FieldRole, self.audioQualityComboBox)
self.horizontalLayout_3.addLayout(self.formLayout_2)
self.tabWidget.addTab(self.tab_2, _fromUtf8(""))
self.verticalLayout.addWidget(self.tabWidget)
self.convertLayout = QtGui.QHBoxLayout()
self.convertLayout.setObjectName(_fromUtf8("convertLayout"))
self.convertButton = QtGui.QPushButton(self.centralwidget)
self.convertButton.setObjectName(_fromUtf8("convertButton"))
self.convertLayout.addWidget(self.convertButton)
self.progressBar = QtGui.QProgressBar(self.centralwidget)
self.progressBar.setProperty("value", 0)
self.progressBar.setObjectName(_fromUtf8("progressBar"))
self.convertLayout.addWidget(self.progressBar)
self.verticalLayout.addLayout(self.convertLayout)
self.fileSizeLabel = QtGui.QLabel(self.centralwidget)
self.fileSizeLabel.setObjectName(_fromUtf8("fileSizeLabel"))
self.verticalLayout.addWidget(self.fileSizeLabel)
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtGui.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 264, 21))
self.menubar.setObjectName(_fromUtf8("menubar"))
self.menuFile = QtGui.QMenu(self.menubar)
self.menuFile.setObjectName(_fromUtf8("menuFile"))
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtGui.QStatusBar(MainWindow)
self.statusbar.setObjectName(_fromUtf8("statusbar"))
MainWindow.setStatusBar(self.statusbar)
self.actionExit = QtGui.QAction(MainWindow)
self.actionExit.setObjectName(_fromUtf8("actionExit"))
self.actionOpenFile = QtGui.QAction(MainWindow)
self.actionOpenFile.setObjectName(_fromUtf8("actionOpenFile"))
self.menuFile.addAction(self.actionOpenFile)
self.menuFile.addAction(self.actionExit)
self.menubar.addAction(self.menuFile.menuAction())

self.retranslateUi(MainWindow)
self.tabWidget.setCurrentIndex(0)
QtCore.QMetaObject.connectSlotsByName(MainWindow)

def retranslateUi(self, MainWindow):
MainWindow.setWindowTitle(_translate("MainWindow", "Converter", None))
self.openFileButton.setText(_translate("MainWindow", "Open file", None))
self.fileNameLabel.setText(_translate("MainWindow", "aaaa.mkv", None))
self.label_2.setText(_translate("MainWindow", "Codec", None))
self.videoCodecComboBox.setItemText(0, _translate("MainWindow", "h264", None))
self.videoCodecComboBox.setItemText(1, _translate("MainWindow", "xvid", None))
self.label_3.setText(_translate("MainWindow", "<html><head/><body><p>Quality</p></body></html>", None))
self.videoQualityComboBox.setItemText(0, _translate("MainWindow", "Best", None))
self.videoQualityComboBox.setItemText(1, _translate("MainWindow", "Good", None))
self.videoQualityComboBox.setItemText(2, _translate("MainWindow", "Average", None))
self.videoQualityComboBox.setItemText(3, _translate("MainWindow", "Low", None))
self.videoQualityComboBox.setItemText(4, _translate("MainWindow", "Lowest", None))
self.label.setText(_translate("MainWindow", "Resolution", None))
self.resolutionComboBox.setItemText(0, _translate("MainWindow", "1920x1080", None))
self.resolutionComboBox.setItemText(1, _translate("MainWindow", "1280x720", None))
self.resolutionComboBox.setItemText(2, _translate("MainWindow", "1024x576", None))
self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab), _translate("MainWindow", "Video", None))
self.label_5.setText(_translate("MainWindow", "Codec", None))
self.audioCodecComboBox.setItemText(0, _translate("MainWindow", "mp3", None))
self.audioCodecComboBox.setItemText(1, _translate("MainWindow", "ogg vorbis", None))
self.label_6.setText(_translate("MainWindow", "<html><head/><body><p>Quality</p></body></html>", None))
self.audioQualityComboBox.setItemText(0, _translate("MainWindow", "Best", None))
self.audioQualityComboBox.setItemText(1, _translate("MainWindow", "Good", None))
self.audioQualityComboBox.setItemText(2, _translate("MainWindow", "Average", None))
self.audioQualityComboBox.setItemText(3, _translate("MainWindow", "Low", None))
self.audioQualityComboBox.setItemText(4, _translate("MainWindow", "Lowest", None))
self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_2), _translate("MainWindow", "Audio", None))
self.convertButton.setText(_translate("MainWindow", "Convert", None))
self.fileSizeLabel.setText(_translate("MainWindow", "Estimated file size: ", None))
self.menuFile.setTitle(_translate("MainWindow", "File", None))
self.actionExit.setText(_translate("MainWindow", "Exit", None))
self.actionOpenFile.setText(_translate("MainWindow", "Open File...", None))

 


 

Main.py

from PyQt4 import QtGui
import time
import os
import converter

class Converter(QtGui.QMainWindow, converter.Ui_MainWindow):
def __init__(self):
super(self.__class__, self).__init__()
self.setupUi(self)
self.hide_elements()
self.openFileButton.clicked.connect(self.open_file)
self.actionExit.triggered.connect(self.close)
self.actionOpenFile.triggered.connect(self.open_file)
self.resolutionComboBox.activated.connect(self.update_estimated_file_size)
self.audioQualityComboBox.activated.connect(self.update_estimated_file_size)
self.videoQualityComboBox.activated.connect(self.update_estimated_file_size)
self.convertButton.clicked.connect(self.start_progress_bar)

def hide_elements(self):
self.fileNameLabel.setVisible(False)
self.tabWidget.setVisible(False)
self.convertButton.setVisible(False)
self.progressBar.setVisible(False)
self.fileSizeLabel.setVisible(False)

def show_elements(self):
self.fileNameLabel.setVisible(True)
self.tabWidget.setVisible(True)
self.convertButton.setVisible(True)
self.progressBar.setVisible(True)
self.fileSizeLabel.setVisible(True)

def open_file(self):
file = QtGui.QFileDialog.getOpenFileName(self, "Choose video file", "", "*.avi;*.mkv")
if file:
self.fileNameLabel.setText(os.path.basename(file))
self.show_elements()
self.update_estimated_file_size()
self.progressBar.setValue(0)

def update_estimated_file_size(self):
videoQuality = 6 - self.videoQualityComboBox.currentIndex()
audioQuality = 6 - self.audioQualityComboBox.currentIndex()
resolution = 3 - self.resolutionComboBox.currentIndex()
size = 1000 * resolution + 500 * videoQuality + 100 * audioQuality
self.fileSizeLabel.setText("Estimated file size: " + str(size) + " Mb")

def start_progress_bar(self):
while True:
time.sleep(0.05)
value = self.progressBar.value() + 1
self.progressBar.setValue(value)
if value >= self.progressBar.maximum():
QtGui.QMessageBox.information(self, "Result", "File has been converted", QtGui.QMessageBox.Ok)
break

def main():
app = QtGui.QApplication([])
form = Converter()
form.show()
app.exec_()

if __name__ == '__main__':
main()

 


 

Заключение

Появление ПК и ОС с графическим интерфейсом привело к смещению внимания разработчиков программного обеспечения в сферу визуального или объектно-ориентированного программирования, сетевых протоколов, баз данных.

В настоящее время все операционные системы для персональных компьютеров обеспечивают взаимодействие с пользователем с помощью графического интерфейса.

Это позволяет даже начинающему пользователю компьютера уверенно работать в среде операционной системы (проводить операции с файлами, запускать программы и так далее).

Графический интерфейс позволяет осуществлять взаимодействие человека с компьютером в форме диалога с использованием окон, меню и элементов управления.

В ходе выполнения курсовой работы были получены знания о принципах построения пользовательского интерфейса в соответствии с Gnome HIG, также были реализован проект с использованием PyQt.


 

Список использованной литературы

1. Руководство по проектированию пользовательского интерфейса GNOME: https://developer.gnome.org/hig/stable/

2. PyQt4 Reference Guide: https://pyqt.sourceforge.net/Docs/PyQt4/

3. Nikola Kovacevic. PyQt: Getting started with PyQt and Qt Designer https://nikolak.com/pyqt-qt-designer-getting-started/

 



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2016-08-20 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: