From e92e9d79f95ad67e83074ef318278c3486601eac Mon Sep 17 00:00:00 2001 From: DH4 Date: Fri, 23 Jun 2017 17:38:05 -0500 Subject: [PATCH 1/3] QT5 Conversion + Directory Structure --- freeze.py | 51 +++++++++++++ setup.py | 70 +++++------------- background.png => src/background.png | Bin command.py => src/command.py | 0 {components => src/components}/__base__.py | 2 +- {components => src/components}/__init__.py | 0 {components => src/components}/color.py | 4 +- {components => src/components}/color.ui | 0 {components => src/components}/image.py | 2 +- {components => src/components}/image.ui | 0 {components => src/components}/original.py | 4 +- {components => src/components}/original.ui | 0 {components => src/components}/text.py | 4 +- {components => src/components}/text.ui | 0 {components => src/components}/video.py | 2 +- {components => src/components}/video.ui | 0 core.py => src/core.py | 9 ++- .../encoder-options.json | 0 main.py => src/main.py | 6 +- mainwindow.py => src/mainwindow.py | 55 +++++++------- mainwindow.ui => src/mainwindow.ui | 0 presetmanager.py => src/presetmanager.py | 8 +- presetmanager.ui => src/presetmanager.ui | 0 preview_thread.py => src/preview_thread.py | 6 +- video_thread.py => src/video_thread.py | 4 +- 25 files changed, 122 insertions(+), 105 deletions(-) create mode 100644 freeze.py rename background.png => src/background.png (100%) rename command.py => src/command.py (100%) rename {components => src/components}/__base__.py (99%) rename {components => src/components}/__init__.py (100%) rename {components => src/components}/color.py (99%) rename {components => src/components}/color.ui (100%) rename {components => src/components}/image.py (98%) rename {components => src/components}/image.ui (100%) rename {components => src/components}/original.py (99%) rename {components => src/components}/original.ui (100%) rename {components => src/components}/text.py (98%) rename {components => src/components}/text.ui (100%) rename {components => src/components}/video.py (99%) rename {components => src/components}/video.ui (100%) rename core.py => src/core.py (98%) rename encoder-options.json => src/encoder-options.json (100%) rename main.py => src/main.py (94%) rename mainwindow.py => src/mainwindow.py (94%) rename mainwindow.ui => src/mainwindow.ui (100%) rename presetmanager.py => src/presetmanager.py (98%) rename presetmanager.ui => src/presetmanager.ui (100%) rename preview_thread.py => src/preview_thread.py (94%) rename video_thread.py => src/video_thread.py (99%) diff --git a/freeze.py b/freeze.py new file mode 100644 index 0000000..48034dc --- /dev/null +++ b/freeze.py @@ -0,0 +1,51 @@ +from cx_Freeze import setup, Executable +import sys + +# Dependencies are automatically detected, but it might need +# fine tuning. + +buildOptions = dict( + packages=[], + excludes=[ + "apport", + "apt", + "curses", + "distutils", + "email", + "html", + "http", + "xmlrpc", + "nose" + ], + include_files=[ + "mainwindow.ui", + "presetmanager.ui", + "background.png", + "encoder-options.json", + "components/" + ], + includes=[ + 'numpy.core._methods', + 'numpy.lib.format' + ] +) + + +base = 'Win32GUI' if sys.platform == 'win32' else None + +executables = [ + Executable( + 'main.py', + base=base, + targetName='audio-visualizer-python' + ) +] + + +setup( + name='audio-visualizer-python', + version='1.0', + description='GUI tool to render visualization videos of audio files', + options=dict(build_exe=buildOptions), + executables=executables +) diff --git a/setup.py b/setup.py index 48034dc..fde3461 100644 --- a/setup.py +++ b/setup.py @@ -1,51 +1,19 @@ -from cx_Freeze import setup, Executable -import sys - -# Dependencies are automatically detected, but it might need -# fine tuning. - -buildOptions = dict( - packages=[], - excludes=[ - "apport", - "apt", - "curses", - "distutils", - "email", - "html", - "http", - "xmlrpc", - "nose" - ], - include_files=[ - "mainwindow.ui", - "presetmanager.ui", - "background.png", - "encoder-options.json", - "components/" - ], - includes=[ - 'numpy.core._methods', - 'numpy.lib.format' - ] -) - - -base = 'Win32GUI' if sys.platform == 'win32' else None - -executables = [ - Executable( - 'main.py', - base=base, - targetName='audio-visualizer-python' - ) -] - - -setup( - name='audio-visualizer-python', - version='1.0', - description='GUI tool to render visualization videos of audio files', - options=dict(build_exe=buildOptions), - executables=executables -) ++from setuptools import setup, find_packages + + -# Dependencies are automatically detected, but it might need +setup(name='audio_visualizer_python', + -# fine tuning. + version='1.0', + -buildOptions = dict(packages = [], excludes = [ + description='a little GUI tool to render visualization \ + - "apport", + videos of audio files', + - "apt", + license='MIT', + - "ctypes", + url='https://github.com/djfun/audio-visualizer-python', + - "curses", + packages=find_packages(), + - "distutils", + package_data={ + - "email", + 'src': ['*'], + - "html", + }, + - "http", + install_requires=['pillow-simd', 'numpy', ''], + - "json", + entry_points={ + - "xmlrpc", + 'gui_scripts': [ + - "nose" + 'audio-visualizer-python = avpython.main:main' + - ], include_files = ["main.ui"]) + ] + - + } + -import sys + ) \ No newline at end of file diff --git a/background.png b/src/background.png similarity index 100% rename from background.png rename to src/background.png diff --git a/command.py b/src/command.py similarity index 100% rename from command.py rename to src/command.py diff --git a/components/__base__.py b/src/components/__base__.py similarity index 99% rename from components/__base__.py rename to src/components/__base__.py index bef7f0e..a4677b1 100644 --- a/components/__base__.py +++ b/src/components/__base__.py @@ -1,4 +1,4 @@ -from PyQt4 import QtGui, QtCore +from PyQt5 import QtGui, QtCore, QtWidgets from PIL import Image import os diff --git a/components/__init__.py b/src/components/__init__.py similarity index 100% rename from components/__init__.py rename to src/components/__init__.py diff --git a/components/color.py b/src/components/color.py similarity index 99% rename from components/color.py rename to src/components/color.py index 5ffcdea..8f9a1d1 100644 --- a/components/color.py +++ b/src/components/color.py @@ -1,6 +1,6 @@ from PIL import Image, ImageDraw -from PyQt4 import uic, QtGui, QtCore -from PyQt4.QtGui import QColor +from PyQt5 import uic, QtGui, QtCore +from PyQt5.QtGui import QColor from PIL.ImageQt import ImageQt import os from . import __base__ diff --git a/components/color.ui b/src/components/color.ui similarity index 100% rename from components/color.ui rename to src/components/color.ui diff --git a/components/image.py b/src/components/image.py similarity index 98% rename from components/image.py rename to src/components/image.py index f8ae64e..8ca88d3 100644 --- a/components/image.py +++ b/src/components/image.py @@ -1,5 +1,5 @@ from PIL import Image, ImageDraw -from PyQt4 import uic, QtGui, QtCore +from PyQt5 import uic, QtGui, QtCore, QtWidgets import os from . import __base__ diff --git a/components/image.ui b/src/components/image.ui similarity index 100% rename from components/image.ui rename to src/components/image.ui diff --git a/components/original.py b/src/components/original.py similarity index 99% rename from components/original.py rename to src/components/original.py index 6222157..61f463d 100644 --- a/components/original.py +++ b/src/components/original.py @@ -1,7 +1,7 @@ import numpy from PIL import Image, ImageDraw -from PyQt4 import uic, QtGui, QtCore -from PyQt4.QtGui import QColor +from PyQt5 import uic, QtGui, QtCore +from PyQt5.QtGui import QColor import os from . import __base__ import time diff --git a/components/original.ui b/src/components/original.ui similarity index 100% rename from components/original.ui rename to src/components/original.ui diff --git a/components/text.py b/src/components/text.py similarity index 98% rename from components/text.py rename to src/components/text.py index 2375dcd..0f599ed 100644 --- a/components/text.py +++ b/src/components/text.py @@ -1,6 +1,6 @@ from PIL import Image, ImageDraw -from PyQt4.QtGui import QPainter, QColor, QFont -from PyQt4 import uic, QtGui, QtCore +from PyQt5.QtGui import QPainter, QColor, QFont +from PyQt5 import uic, QtGui, QtCore from PIL.ImageQt import ImageQt import os import io diff --git a/components/text.ui b/src/components/text.ui similarity index 100% rename from components/text.ui rename to src/components/text.ui diff --git a/components/video.py b/src/components/video.py similarity index 99% rename from components/video.py rename to src/components/video.py index 1d250bd..58ce7a3 100644 --- a/components/video.py +++ b/src/components/video.py @@ -1,5 +1,5 @@ from PIL import Image, ImageDraw -from PyQt4 import uic, QtGui, QtCore +from PyQt5 import uic, QtGui, QtCore import os import subprocess import threading diff --git a/components/video.ui b/src/components/video.ui similarity index 100% rename from components/video.ui rename to src/components/video.ui diff --git a/core.py b/src/core.py similarity index 98% rename from core.py rename to src/core.py index de6ed99..bb5d351 100644 --- a/core.py +++ b/src/core.py @@ -1,7 +1,7 @@ import sys import io import os -from PyQt4 import QtCore, QtGui, uic +from PyQt5 import QtCore, QtGui, uic from os.path import expanduser import subprocess as sp import numpy @@ -11,7 +11,7 @@ import time from collections import OrderedDict import json from importlib import import_module -from PyQt4.QtGui import QDesktopServices +from PyQt5.QtCore import QStandardPaths import string @@ -19,8 +19,9 @@ class Core(): def __init__(self): self.FFMPEG_BIN = self.findFfmpeg() - self.dataDir = QDesktopServices.storageLocation( - QDesktopServices.DataLocation) + self.dataDir = QStandardPaths.writableLocation( + QStandardPaths.AppConfigLocation + ) self.presetDir = os.path.join(self.dataDir, 'presets') if getattr(sys, 'frozen', False): # frozen diff --git a/encoder-options.json b/src/encoder-options.json similarity index 100% rename from encoder-options.json rename to src/encoder-options.json diff --git a/main.py b/src/main.py similarity index 94% rename from main.py rename to src/main.py index 106bd29..4bf26db 100644 --- a/main.py +++ b/src/main.py @@ -1,4 +1,4 @@ -from PyQt4 import QtGui, uic +from PyQt5 import QtGui, uic, QtWidgets import sys import os @@ -49,7 +49,7 @@ if __name__ == "__main__": # normal gui launch proj = None - app = QtGui.QApplication(sys.argv) + app = QtWidgets.QApplication(sys.argv) app.setApplicationName("audio-visualizer") app.setOrganizationName("audio-visualizer") @@ -72,7 +72,7 @@ if __name__ == "__main__": window = uic.loadUi(os.path.join(wd, "mainwindow.ui")) # window.adjustSize() - desc = QtGui.QDesktopWidget() + desc = QtWidgets.QDesktopWidget() dpi = desc.physicalDpiX() topMargin = 0 if (dpi == 96) else int(10 * (dpi / 96)) diff --git a/mainwindow.py b/src/mainwindow.py similarity index 94% rename from mainwindow.py rename to src/mainwindow.py index cdc2a51..a52a0f4 100644 --- a/mainwindow.py +++ b/src/mainwindow.py @@ -1,7 +1,7 @@ from queue import Queue -from PyQt4 import QtCore, QtGui, uic -from PyQt4.QtCore import QSettings, Qt -from PyQt4.QtGui import QMenu, QShortcut +from PyQt5 import QtCore, QtGui, uic, QtWidgets +from PyQt5.QtCore import QSettings, Qt +from PyQt5.QtWidgets import QMenu, QShortcut import sys import os import signal @@ -15,11 +15,11 @@ from presetmanager import PresetManager from main import LoadDefaultSettings -class PreviewWindow(QtGui.QLabel): +class PreviewWindow(QtWidgets.QLabel): def __init__(self, parent, img): super(PreviewWindow, self).__init__() self.parent = parent - self.setFrameStyle(QtGui.QFrame.StyledPanel) + self.setFrameStyle(QtWidgets.QFrame.StyledPanel) self.pixmap = QtGui.QPixmap(img) def paintEvent(self, event): @@ -39,14 +39,14 @@ class PreviewWindow(QtGui.QLabel): self.repaint() -class MainWindow(QtGui.QMainWindow): +class MainWindow(QtWidgets.QMainWindow): newTask = QtCore.pyqtSignal(list) processTask = QtCore.pyqtSignal() videoTask = QtCore.pyqtSignal(str, str, list) def __init__(self, window, project): - QtGui.QMainWindow.__init__(self) + QtWidgets.QMainWindow.__init__(self) # print('main thread id: {}'.format(QtCore.QThread.currentThreadId())) self.window = window @@ -148,7 +148,7 @@ class MainWindow(QtGui.QMainWindow): self.compMenu = QMenu() for i, comp in enumerate(self.core.modules): action = self.compMenu.addAction(comp.Component.__doc__) - action.triggered[()].connect( + action.triggered.connect( lambda item=i: self.core.insertComponent(0, item, self)) self.window.pushButton_addComponent.setMenu(self.compMenu) @@ -162,10 +162,7 @@ class MainWindow(QtGui.QMainWindow): componentList.setContextMenuPolicy( QtCore.Qt.CustomContextMenu) - componentList.connect( - componentList, - QtCore.SIGNAL("customContextMenuRequested(QPoint)"), - self.componentContextMenu) + componentList.customContextMenuRequested.connect(self.componentContextMenu) currentRes = str(self.settings.value('outputWidth'))+'x' + \ str(self.settings.value('outputHeight')) @@ -188,19 +185,19 @@ class MainWindow(QtGui.QMainWindow): self.projectMenu = QMenu() self.window.menuButton_newProject = self.projectMenu.addAction( "New Project") - self.window.menuButton_newProject.triggered[()].connect( + self.window.menuButton_newProject.triggered.connect( self.createNewProject) self.window.menuButton_openProject = self.projectMenu.addAction( "Open Project") - self.window.menuButton_openProject.triggered[()].connect( + self.window.menuButton_openProject.triggered.connect( self.openOpenProjectDialog) action = self.projectMenu.addAction("Save Project") - action.triggered[()].connect(self.saveCurrentProject) + action.triggered.connect(self.saveCurrentProject) action = self.projectMenu.addAction("Save Project As") - action.triggered[()].connect(self.openSaveProjectDialog) + action.triggered.connect(self.openSaveProjectDialog) self.window.pushButton_projects.setMenu(self.projectMenu) @@ -243,27 +240,27 @@ class MainWindow(QtGui.QMainWindow): self.drawPreview(True) # Setup Hotkeys - QtGui.QShortcut("Ctrl+S", self.window, self.saveCurrentProject) - QtGui.QShortcut("Ctrl+A", self.window, self.openSaveProjectDialog) - QtGui.QShortcut("Ctrl+O", self.window, self.openOpenProjectDialog) - QtGui.QShortcut("Ctrl+N", self.window, self.createNewProject) + QtWidgets.QShortcut("Ctrl+S", self.window, self.saveCurrentProject) + QtWidgets.QShortcut("Ctrl+A", self.window, self.openSaveProjectDialog) + QtWidgets.QShortcut("Ctrl+O", self.window, self.openOpenProjectDialog) + QtWidgets.QShortcut("Ctrl+N", self.window, self.createNewProject) - QtGui.QShortcut("Ctrl+T", self.window, activated=lambda: + QtWidgets.QShortcut("Ctrl+T", self.window, activated=lambda: self.window.pushButton_addComponent.click()) - QtGui.QShortcut("Ctrl+Space", self.window, activated=lambda: + QtWidgets.QShortcut("Ctrl+Space", self.window, activated=lambda: self.window.listWidget_componentList.setFocus()) - QtGui.QShortcut("Ctrl+Shift+S", self.window, + QtWidgets.QShortcut("Ctrl+Shift+S", self.window, self.presetManager.openSavePresetDialog) - QtGui.QShortcut("Ctrl+Shift+C", self.window, + QtWidgets.QShortcut("Ctrl+Shift+C", self.window, self.presetManager.clearPreset) - QtGui.QShortcut("Ctrl+Up", self.window, + QtWidgets.QShortcut("Ctrl+Up", self.window, activated=lambda: self.moveComponent(-1)) - QtGui.QShortcut("Ctrl+Down", self.window, + QtWidgets.QShortcut("Ctrl+Down", self.window, activated=lambda: self.moveComponent(1)) - QtGui.QShortcut("Ctrl+Home", self.window, self.moveComponentTop) - QtGui.QShortcut("Ctrl+End", self.window, self.moveComponentBottom) - QtGui.QShortcut("Ctrl+r", self.window, self.removeComponent) + QtWidgets.QShortcut("Ctrl+Home", self.window, self.moveComponentTop) + QtWidgets.QShortcut("Ctrl+End", self.window, self.moveComponentBottom) + QtWidgets.QShortcut("Ctrl+r", self.window, self.removeComponent) def cleanUp(self): self.timer.stop() diff --git a/mainwindow.ui b/src/mainwindow.ui similarity index 100% rename from mainwindow.ui rename to src/mainwindow.ui diff --git a/presetmanager.py b/src/presetmanager.py similarity index 98% rename from presetmanager.py rename to src/presetmanager.py index 3b02714..ec3f5cd 100644 --- a/presetmanager.py +++ b/src/presetmanager.py @@ -1,11 +1,11 @@ -from PyQt4 import QtGui, QtCore +from PyQt5 import QtGui, QtCore, QtWidgets import string import os import core -class PresetManager(QtGui.QDialog): +class PresetManager(QtWidgets.QDialog): def __init__(self, window, parent): super().__init__(parent.window) self.parent = parent @@ -41,8 +41,8 @@ class PresetManager(QtGui.QDialog): ) # make auto-completion for search bar - self.autocomplete = QtGui.QStringListModel() - completer = QtGui.QCompleter() + self.autocomplete = QtCore.QStringListModel() + completer = QtWidgets.QCompleter() completer.setModel(self.autocomplete) self.window.lineEdit_search.setCompleter(completer) self.window.lineEdit_search.textChanged.connect( diff --git a/presetmanager.ui b/src/presetmanager.ui similarity index 100% rename from presetmanager.ui rename to src/presetmanager.ui diff --git a/preview_thread.py b/src/preview_thread.py similarity index 94% rename from preview_thread.py rename to src/preview_thread.py index eabf715..4a46d51 100644 --- a/preview_thread.py +++ b/src/preview_thread.py @@ -1,5 +1,5 @@ -from PyQt4 import QtCore, QtGui, uic -from PyQt4.QtCore import pyqtSignal, pyqtSlot +from PyQt5 import QtCore, QtGui, uic +from PyQt5.QtCore import pyqtSignal, pyqtSlot from PIL import Image from PIL.ImageQt import ImageQt import core @@ -25,7 +25,7 @@ class Worker(QtCore.QObject): self.background.paste(Image.open(os.path.join( self.core.wd, "background.png"))) - @pyqtSlot(str, list) + @pyqtSlot(list) def createPreviewImage(self, components): dic = { "components": components, diff --git a/video_thread.py b/src/video_thread.py similarity index 99% rename from video_thread.py rename to src/video_thread.py index 265feee..5ea6d21 100644 --- a/video_thread.py +++ b/src/video_thread.py @@ -1,5 +1,5 @@ -from PyQt4 import QtCore, QtGui, uic -from PyQt4.QtCore import pyqtSignal, pyqtSlot +from PyQt5 import QtCore, QtGui, uic +from PyQt5.QtCore import pyqtSignal, pyqtSlot from PIL import Image, ImageDraw, ImageFont from PIL.ImageQt import ImageQt import core From 680214f5180a12f2250d8e266df9375ce99b9f80 Mon Sep 17 00:00:00 2001 From: tassaron Date: Fri, 23 Jun 2017 23:00:24 -0400 Subject: [PATCH 2/3] qt5 fixes also pep8 compliance --- src/command.py | 15 +++--- src/components/__base__.py | 14 +++--- src/components/color.py | 15 +++--- src/components/image.py | 2 +- src/components/video.py | 14 +++--- src/core.py | 28 ++++++----- src/main.py | 6 +-- src/mainwindow.py | 98 ++++++++++++++++++++++---------------- src/presetmanager.py | 55 +++++++++++---------- src/video_thread.py | 11 ++--- 10 files changed, 142 insertions(+), 116 deletions(-) diff --git a/src/command.py b/src/command.py index 1a1e810..2f71f31 100644 --- a/src/command.py +++ b/src/command.py @@ -22,9 +22,9 @@ class Command(QtCore.QObject): self.parser = argparse.ArgumentParser( description='Create a visualization for an audio file', epilog='EXAMPLE COMMAND: main.py myvideotemplate.avp ' - '-i ~/Music/song.mp3 -o ~/video.mp4 ' - '-c 0 image path=~/Pictures/thisWeeksPicture.jpg ' - '-c 1 video "preset=My Logo" -c 2 vis layout=classic') + '-i ~/Music/song.mp3 -o ~/video.mp4 ' + '-c 0 image path=~/Pictures/thisWeeksPicture.jpg ' + '-c 1 video "preset=My Logo" -c 2 vis layout=classic') self.parser.add_argument( '-i', '--input', metavar='SOUND', help='input audio file') @@ -113,10 +113,11 @@ class Command(QtCore.QObject): if name.capitalize() in compName: return compName - compFileNames = [ \ - os.path.splitext(os.path.basename( - mod.__file__))[0] \ - for mod in self.core.modules \ + compFileNames = [ + os.path.splitext( + os.path.basename(mod.__file__) + )[0] + for mod in self.core.modules ] for i, compFileName in enumerate(compFileNames): if name.lower() in compFileName: diff --git a/src/components/__base__.py b/src/components/__base__.py index a4677b1..a24af40 100644 --- a/src/components/__base__.py +++ b/src/components/__base__.py @@ -39,7 +39,7 @@ class Component(QtCore.QObject): then update self.page widgets using the preset dict. ''' self.currentPreset = presetName \ - if presetName != None else presetDict['preset'] + if presetName is not None else presetDict['preset'] def preFrameRender(self, **kwargs): '''Triggered only before a video is exported (video_thread.py) @@ -66,8 +66,8 @@ class Component(QtCore.QObject): print('Couldn\'t locate preset "%s"' % preset) quit(1) else: - print('Opening "%s" preset on layer %s' % \ - (preset, self.compPos)) + print('Opening "%s" preset on layer %s' % ( + preset, self.compPos)) self.core.openPreset(path, self.compPos, preset) else: print( @@ -88,8 +88,8 @@ class Component(QtCore.QObject): and return this as an RGB string and QPushButton stylesheet. In a subclass apply stylesheet to any color selection widgets ''' - dialog = QtGui.QColorDialog() - dialog.setOption(QtGui.QColorDialog.ShowAlphaChannel, True) + dialog = QtWidgets.QColorDialog() + dialog.setOption(QtWidgets.QColorDialog.ShowAlphaChannel, True) color = dialog.getColor() if color.isValid(): RGBstring = '%s,%s,%s' % ( @@ -142,10 +142,10 @@ class Component(QtCore.QObject): return image ''' + class BadComponentInit(Exception): def __init__(self, arg, name): - string = \ -'''################################ + string = '''################################ Mandatory argument "%s" not specified in %s instance initialization ###################################''' diff --git a/src/components/color.py b/src/components/color.py index 8f9a1d1..2e3902a 100644 --- a/src/components/color.py +++ b/src/components/color.py @@ -53,7 +53,7 @@ class Component(__base__.Component): page.spinBox_height.valueChanged.connect(self.update) page.checkBox_trans.stateChanged.connect(self.update) - self.fillLabels = [ \ + self.fillLabels = [ 'Solid', 'Linear Gradient', 'Radial Gradient', @@ -126,8 +126,8 @@ class Component(__base__.Component): r, g, b = self.color1 shapeSize = (self.sizeWidth, self.sizeHeight) # in default state, skip all this logic and return a plain fill - if self.fillType==0 and shapeSize == (width, height) \ - and self.x == 0 and self.y == 0: + if self.fillType == 0 and shapeSize == (width, height) \ + and self.x == 0 and self.y == 0: return Image.new("RGBA", (width, height), (r, g, b, 255)) frame = self.blankFrame(width, height) @@ -143,9 +143,11 @@ class Component(__base__.Component): image = ImageQt(frame) painter = QtGui.QPainter(image) if self.stretch: - w = width; h = height + w = width + h = height else: - w = self.sizeWidth; h = self.sizeWidth + w = self.sizeWidth + h = self.sizeWidth if self.fillType == 1: # Linear Gradient brush = QtGui.QLinearGradient( @@ -170,7 +172,8 @@ class Component(__base__.Component): else: brush.setColorAt(1.0, QColor(*self.color2)) painter.setBrush(brush) - painter.drawRect(self.x, self.y, + painter.drawRect( + self.x, self.y, self.sizeWidth, self.sizeHeight) painter.end() imBytes = image.bits().asstring(image.numBytes()) diff --git a/src/components/image.py b/src/components/image.py index 8ca88d3..3517af6 100644 --- a/src/components/image.py +++ b/src/components/image.py @@ -85,7 +85,7 @@ class Component(__base__.Component): def pickImage(self): imgDir = self.settings.value("backgroundDir", os.path.expanduser("~")) - filename = QtGui.QFileDialog.getOpenFileName( + filename, _ = QtWidgets.QFileDialog.getOpenFileName( self.page, "Choose Image", imgDir, "Image Files (%s)" % " ".join(self.imageFormats)) if filename: diff --git a/src/components/video.py b/src/components/video.py index 58ce7a3..0090426 100644 --- a/src/components/video.py +++ b/src/components/video.py @@ -41,8 +41,8 @@ class Video: '-i', self.videoPath, '-f', 'image2pipe', '-pix_fmt', 'rgba', - '-filter:v', 'scale=%s:%s' % - scale(self.scale, self.width, self.height, str), + '-filter:v', 'scale=%s:%s' % scale( + self.scale, self.width, self.height, str), '-vcodec', 'rawvideo', '-', ] @@ -180,7 +180,7 @@ class Component(__base__.Component): def pickVideo(self): imgDir = self.settings.value("backgroundDir", os.path.expanduser("~")) - filename = QtGui.QFileDialog.getOpenFileName( + filename, _ = QtWidgets.QFileDialog.getOpenFileName( self.page, "Choose Video", imgDir, "Video Files (%s)" % " ".join(self.videoFormats) ) @@ -199,8 +199,8 @@ class Component(__base__.Component): '-i', self.videoPath, '-f', 'image2pipe', '-pix_fmt', 'rgba', - '-filter:v', 'scale=%s:%s' % - scale(self.scale, width, height, str), + '-filter:v', 'scale=%s:%s' % scale( + self.scale, width, height, str), '-vcodec', 'rawvideo', '-', '-ss', '90', '-vframes', '1', @@ -238,6 +238,7 @@ class Component(__base__.Component): def commandHelp(self): print('Load a video:\n path=/filepath/to/video.mp4') + def scale(scale, width, height, returntype=None): width = (float(width) / 100.0) * float(scale) height = (float(height) / 100.0) * float(scale) @@ -248,6 +249,7 @@ def scale(scale, width, height, returntype=None): else: return (width, height) + def finalizeFrame(self, imageData, width, height): if self.distort: try: @@ -265,7 +267,7 @@ def finalizeFrame(self, imageData, width, height): imageData) if self.scale != 100 \ - or self.xPosition != 0 or self.yPosition != 0: + or self.xPosition != 0 or self.yPosition != 0: frame = self.blankFrame(width, height) frame.paste(image, box=(self.xPosition, self.yPosition)) else: diff --git a/src/core.py b/src/core.py index bb5d351..670a3c5 100644 --- a/src/core.py +++ b/src/core.py @@ -179,7 +179,7 @@ class Core(): clearThis = False # add loaded named presets to savedPresets dict - if 'preset' in preset and preset['preset'] != None: + if 'preset' in preset and preset['preset'] is not None: nam = preset['preset'] filepath2 = os.path.join( self.presetDir, name, str(vers), nam) @@ -195,12 +195,12 @@ class Core(): -1, self.moduleIndexFor(name), loader) - if i == None: + if i is None: loader.showMessage(msg="Too many components!") break try: - if 'preset' in preset and preset['preset'] != None: + if 'preset' in preset and preset['preset'] is not None: self.selectedComponents[i].loadPreset( preset ) @@ -210,8 +210,8 @@ class Core(): preset['preset'] ) except KeyError as e: - print('%s missing value %s' % - (self.selectedComponents[i], e)) + print('%s missing value %s' % ( + self.selectedComponents[i], e)) if clearThis: self.clearPreset(i) @@ -221,7 +221,6 @@ class Core(): errcode = 1 data = sys.exc_info() - if errcode == 1: typ, value, _ = data if typ.__name__ == KeyError: @@ -274,11 +273,11 @@ class Core(): i += 1 elif i == 2: lastCompPreset = Core.presetFromString(line) - data[section].append( - (lastCompName, + data[section].append(( + lastCompName, lastCompVers, - lastCompPreset) - ) + lastCompPreset + )) i = 0 return 0, data except: @@ -309,7 +308,9 @@ class Core(): return False, '' def exportPreset(self, exportPath, compName, vers, origName): - internalPath = os.path.join(self.presetDir, compName, str(vers), origName) + internalPath = os.path.join( + self.presetDir, compName, str(vers), origName + ) if not os.path.exists(internalPath): return if os.path.exists(exportPath): @@ -328,7 +329,7 @@ class Core(): return False def createPresetFile( - self, compName, vers, presetName, saveValueStore, filepath=''): + self, compName, vers, presetName, saveValueStore, filepath=''): '''Create a preset file (.avl) at filepath using args. Or if filepath is empty, create an internal preset using args''' if not filepath: @@ -463,7 +464,8 @@ class Core(): @staticmethod def presetToString(dictionary): '''Alphabetizes a dict into OrderedDict & returns string repr''' - return repr(OrderedDict(sorted(dictionary.items(), key=lambda t: t[0]))) + return repr( + OrderedDict(sorted(dictionary.items(), key=lambda t: t[0]))) @staticmethod def presetFromString(string): diff --git a/src/main.py b/src/main.py index 4bf26db..58fdb46 100644 --- a/src/main.py +++ b/src/main.py @@ -30,7 +30,6 @@ def LoadDefaultSettings(self): } for parm, value in default.items(): - #print(parm, self.settings.value(parm)) if self.settings.value(parm) is None: self.settings.setValue(parm, value) @@ -51,7 +50,7 @@ if __name__ == "__main__": app = QtWidgets.QApplication(sys.argv) app.setApplicationName("audio-visualizer") - app.setOrganizationName("audio-visualizer") + # app.setOrganizationName("audio-visualizer") if mode == 'cmd': from command import * @@ -76,7 +75,8 @@ if __name__ == "__main__": dpi = desc.physicalDpiX() topMargin = 0 if (dpi == 96) else int(10 * (dpi / 96)) - window.resize(window.width() * (dpi / 96), window.height() * (dpi / 96)) + window.resize( + window.width() * (dpi / 96), window.height() * (dpi / 96)) # window.verticalLayout_2.setContentsMargins(0, topMargin, 0, 0) main = MainWindow(window, proj) diff --git a/src/mainwindow.py b/src/mainwindow.py index a52a0f4..7a9e397 100644 --- a/src/mainwindow.py +++ b/src/mainwindow.py @@ -116,7 +116,6 @@ class MainWindow(QtWidgets.QMainWindow): codec = window.comboBox_videoCodec.itemText(i) if codec == self.settings.value('outputVideoCodec'): window.comboBox_videoCodec.setCurrentIndex(i) - #print(codec) for i in range(window.comboBox_audioCodec.count()): codec = window.comboBox_audioCodec.itemText(i) @@ -146,10 +145,11 @@ class MainWindow(QtWidgets.QMainWindow): # Make component buttons self.compMenu = QMenu() + self.compActions = [] for i, comp in enumerate(self.core.modules): action = self.compMenu.addAction(comp.Component.__doc__) action.triggered.connect( - lambda item=i: self.core.insertComponent(0, item, self)) + lambda _, item=i: self.core.insertComponent(0, item, self)) self.window.pushButton_addComponent.setMenu(self.compMenu) @@ -160,9 +160,10 @@ class MainWindow(QtWidgets.QMainWindow): self.window.pushButton_removeComponent.clicked.connect( lambda _: self.removeComponent()) - componentList.setContextMenuPolicy( - QtCore.Qt.CustomContextMenu) - componentList.customContextMenuRequested.connect(self.componentContextMenu) + componentList.setContextMenuPolicy(QtCore.Qt.CustomContextMenu) + componentList.customContextMenuRequested.connect( + self.componentContextMenu + ) currentRes = str(self.settings.value('outputWidth'))+'x' + \ str(self.settings.value('outputHeight')) @@ -245,19 +246,30 @@ class MainWindow(QtWidgets.QMainWindow): QtWidgets.QShortcut("Ctrl+O", self.window, self.openOpenProjectDialog) QtWidgets.QShortcut("Ctrl+N", self.window, self.createNewProject) - QtWidgets.QShortcut("Ctrl+T", self.window, activated=lambda: - self.window.pushButton_addComponent.click()) - QtWidgets.QShortcut("Ctrl+Space", self.window, activated=lambda: - self.window.listWidget_componentList.setFocus()) - QtWidgets.QShortcut("Ctrl+Shift+S", self.window, - self.presetManager.openSavePresetDialog) - QtWidgets.QShortcut("Ctrl+Shift+C", self.window, - self.presetManager.clearPreset) + QtWidgets.QShortcut( + "Ctrl+T", self.window, + activated=lambda: self.window.pushButton_addComponent.click() + ) + QtWidgets.QShortcut( + "Ctrl+Space", self.window, + activated=lambda: self.window.listWidget_componentList.setFocus() + ) + QtWidgets.QShortcut( + "Ctrl+Shift+S", self.window, + self.presetManager.openSavePresetDialog + ) + QtWidgets.QShortcut( + "Ctrl+Shift+C", self.window, self.presetManager.clearPreset + ) - QtWidgets.QShortcut("Ctrl+Up", self.window, - activated=lambda: self.moveComponent(-1)) - QtWidgets.QShortcut("Ctrl+Down", self.window, - activated=lambda: self.moveComponent(1)) + QtWidgets.QShortcut( + "Ctrl+Up", self.window, + activated=lambda: self.moveComponent(-1) + ) + QtWidgets.QShortcut( + "Ctrl+Down", self.window, + activated=lambda: self.moveComponent(1) + ) QtWidgets.QShortcut("Ctrl+Home", self.window, self.moveComponentTop) QtWidgets.QShortcut("Ctrl+End", self.window, self.moveComponentBottom) QtWidgets.QShortcut("Ctrl+r", self.window, self.removeComponent) @@ -280,7 +292,7 @@ class MainWindow(QtWidgets.QMainWindow): def updateComponentTitle(self, pos, presetStore=False): if type(presetStore) == dict: name = presetStore['preset'] - if name == None or name not in self.core.savedPresets: + if name is None or name not in self.core.savedPresets: modified = False else: modified = (presetStore != self.core.savedPresets[name]) @@ -362,21 +374,22 @@ class MainWindow(QtWidgets.QMainWindow): def openInputFileDialog(self): inputDir = self.settings.value("inputDir", os.path.expanduser("~")) - fileName = QtGui.QFileDialog.getOpenFileName( + fileName, _ = QtWidgets.QFileDialog.getOpenFileName( self.window, "Open Audio File", inputDir, "Audio Files (%s)" % " ".join(self.core.audioFormats)) - if not fileName == "": + if fileName: self.settings.setValue("inputDir", os.path.dirname(fileName)) self.window.lineEdit_audioFile.setText(fileName) def openOutputFileDialog(self): outputDir = self.settings.value("outputDir", os.path.expanduser("~")) - fileName = QtGui.QFileDialog.getSaveFileName( + fileName, _ = QtWidgets.QFileDialog.getSaveFileName( self.window, "Set Output Video File", outputDir, - "Video Files (%s);; All Files (*)" % " ".join(self.core.videoFormats)) + "Video Files (%s);; All Files (*)" % " ".join( + self.core.videoFormats)) if not fileName == "": self.settings.setValue("outputDir", os.path.dirname(fileName)) @@ -547,13 +560,13 @@ class MainWindow(QtWidgets.QMainWindow): '''Drop event for the component listwidget''' componentList = self.window.listWidget_componentList - modelIndexes = [ \ - componentList.model().index(i) \ - for i in range(componentList.count()) \ + modelIndexes = [ + componentList.model().index(i) + for i in range(componentList.count()) ] - rects = [ \ - componentList.visualRect(modelIndex) \ - for modelIndex in modelIndexes \ + rects = [ + componentList.visualRect(modelIndex) + for modelIndex in modelIndexes ] rowPos = [rect.contains(event.pos()) for rect in rects] @@ -602,9 +615,10 @@ class MainWindow(QtWidgets.QMainWindow): if self.autosaveExists(identical=False): ch = self.showMessage( msg="You have unsaved changes in project '%s'. " - "Save before %s?" % \ - (os.path.basename(self.currentProject)[:-4], - phrase), + "Save before %s?" % ( + os.path.basename(self.currentProject)[:-4], + phrase + ), showCancel=True) if ch: success = self.saveProjectChanges() @@ -613,7 +627,7 @@ class MainWindow(QtWidgets.QMainWindow): os.remove(self.autosavePath) def openSaveProjectDialog(self): - filename = QtGui.QFileDialog.getSaveFileName( + filename, _ = QtWidgets.QFileDialog.getSaveFileName( self.window, "Create Project File", self.settings.value("projectDir"), "Project Files (*.avp)") @@ -628,7 +642,7 @@ class MainWindow(QtWidgets.QMainWindow): self.core.createProjectFile(filename) def openOpenProjectDialog(self): - filename = QtGui.QFileDialog.getOpenFileName( + filename, _ = QtWidgets.QFileDialog.getOpenFileName( self.window, "Open Project File", self.settings.value("projectDir"), "Project Files (*.avp)") @@ -657,17 +671,19 @@ class MainWindow(QtWidgets.QMainWindow): def showMessage(self, **kwargs): parent = kwargs['parent'] if 'parent' in kwargs else self.window - msg = QtGui.QMessageBox(parent) + msg = QtWidgets.QMessageBox(parent) msg.setModal(True) msg.setText(kwargs['msg']) msg.setIcon( - kwargs['icon'] if 'icon' in kwargs else QtGui.QMessageBox.Information) + kwargs['icon'] + if 'icon' in kwargs else QtWidgets.QMessageBox.Information + ) msg.setDetailedText(kwargs['detail'] if 'detail' in kwargs else None) if 'showCancel'in kwargs and kwargs['showCancel']: msg.setStandardButtons( - QtGui.QMessageBox.Ok | QtGui.QMessageBox.Cancel) + QtWidgets.QMessageBox.Ok | QtWidgets.QMessageBox.Cancel) else: - msg.setStandardButtons(QtGui.QMessageBox.Ok) + msg.setStandardButtons(QtWidgets.QMessageBox.Ok) ch = msg.exec_() if ch == 1024: return True @@ -687,7 +703,7 @@ class MainWindow(QtWidgets.QMainWindow): return self.presetManager.findPresets() - self.menu = QtGui.QMenu() + self.menu = QMenu() menuItem = self.menu.addAction("Save Preset") menuItem.triggered.connect( self.presetManager.openSavePresetDialog @@ -695,8 +711,10 @@ class MainWindow(QtWidgets.QMainWindow): # submenu for opening presets try: - presets = self.presetManager.presets[str(self.core.selectedComponents[index])] - self.submenu = QtGui.QMenu("Open Preset") + presets = self.presetManager.presets[ + str(self.core.selectedComponents[index]) + ] + self.submenu = QMenu("Open Preset") self.menu.addMenu(self.submenu) for version, presetName in presets: diff --git a/src/presetmanager.py b/src/presetmanager.py index ec3f5cd..97f6e0e 100644 --- a/src/presetmanager.py +++ b/src/presetmanager.py @@ -1,4 +1,4 @@ -from PyQt5 import QtGui, QtCore, QtWidgets +from PyQt5 import QtCore, QtWidgets import string import os @@ -21,13 +21,15 @@ class PresetManager(QtWidgets.QDialog): # window self.lastFilter = '*' - self.presetRows = [] # list of (comp, vers, name) tuples + self.presetRows = [] # list of (comp, vers, name) tuples self.window = window self.window.setWindowFlags(QtCore.Qt.WindowStaysOnTopHint) # connect button signals - self.window.pushButton_delete.clicked.connect(self.openDeletePresetDialog) - self.window.pushButton_rename.clicked.connect(self.openRenamePresetDialog) + self.window.pushButton_delete.clicked.connect( + self.openDeletePresetDialog) + self.window.pushButton_rename.clicked.connect( + self.openRenamePresetDialog) self.window.pushButton_import.clicked.connect(self.openImportDialog) self.window.pushButton_export.clicked.connect(self.openExportDialog) self.window.pushButton_close.clicked.connect(self.window.close) @@ -36,7 +38,8 @@ class PresetManager(QtWidgets.QDialog): self.drawFilterList() self.window.comboBox_filter.currentIndexChanged.connect( lambda: self.drawPresetList( - self.window.comboBox_filter.currentText(), self.window.lineEdit_search.text() + self.window.comboBox_filter.currentText(), + self.window.lineEdit_search.text() ) ) @@ -47,7 +50,8 @@ class PresetManager(QtWidgets.QDialog): self.window.lineEdit_search.setCompleter(completer) self.window.lineEdit_search.textChanged.connect( lambda: self.drawPresetList( - self.window.comboBox_filter.currentText(), self.window.lineEdit_search.text() + self.window.comboBox_filter.currentText(), + self.window.lineEdit_search.text() ) ) self.drawPresetList('*') @@ -72,16 +76,14 @@ class PresetManager(QtWidgets.QDialog): parseList.append((compName, int(compVers), preset)) except ValueError: continue - self.presets =\ - { - compName : \ - [ - (vers, preset) \ - for name, vers, preset in parseList \ - if name == compName \ - ] \ - for compName, _, __ in parseList \ - } + self.presets = { + compName: [ + (vers, preset) + for name, vers, preset in parseList + if name == compName + ] + for compName, _, __ in parseList + } def drawPresetList(self, compFilter=None, presetFilter=''): self.window.listWidget_presets.clear() @@ -96,7 +98,8 @@ class PresetManager(QtWidgets.QDialog): continue for vers, preset in presets: if not presetFilter or presetFilter in preset: - self.window.listWidget_presets.addItem('%s: %s' % (component, preset)) + self.window.listWidget_presets.addItem( + '%s: %s' % (component, preset)) self.presetRows.append((component, vers, preset)) if preset not in presetNames: presetNames.append(preset) @@ -124,11 +127,11 @@ class PresetManager(QtWidgets.QDialog): while True: index = componentList.currentRow() currentPreset = selectedComponents[index].currentPreset - newName, OK = QtGui.QInputDialog.getText( + newName, OK = QtWidgets.QInputDialog.getText( self.parent.window, 'Audio Visualizer', 'New Preset Name:', - QtGui.QLineEdit.Normal, + QtWidgets.QLineEdit.Normal, currentPreset ) if OK: @@ -149,7 +152,7 @@ class PresetManager(QtWidgets.QDialog): break def createNewPreset( - self, compName, vers, filename, saveValueStore, **kwargs): + self, compName, vers, filename, saveValueStore, **kwargs): path = os.path.join(self.presetDir, compName, str(vers), filename) if self.presetExists(path, **kwargs): return @@ -163,7 +166,7 @@ class PresetManager(QtWidgets.QDialog): msg="%s already exists! Overwrite it?" % os.path.basename(path), showCancel=True, - icon=QtGui.QMessageBox.Warning, + icon=QtWidgets.QMessageBox.Warning, parent=window) if not ch: # user clicked cancel @@ -196,7 +199,7 @@ class PresetManager(QtWidgets.QDialog): ch = self.parent.showMessage( msg='Really delete %s?' % name, showCancel=True, - icon=QtGui.QMessageBox.Warning, + icon=QtWidgets.QMessageBox.Warning, parent=self.window ) if not ch: @@ -223,11 +226,11 @@ class PresetManager(QtWidgets.QDialog): while True: index = presetList.currentRow() - newName, OK = QtGui.QInputDialog.getText( + newName, OK = QtWidgets.QInputDialog.getText( self.window, 'Preset Manager', 'Rename Preset:', - QtGui.QLineEdit.Normal, + QtWidgets.QLineEdit.Normal, self.presetRows[index][2] ) if OK: @@ -250,7 +253,7 @@ class PresetManager(QtWidgets.QDialog): break def openImportDialog(self): - filename = QtGui.QFileDialog.getOpenFileName( + filename, _ = QtWidgets.QFileDialog.getOpenFileName( self.window, "Import Preset File", self.settings.value("presetDir"), "Preset Files (*.avl)") @@ -275,7 +278,7 @@ class PresetManager(QtWidgets.QDialog): def openExportDialog(self): if not self.window.listWidget_presets.selectedItems(): return - filename = QtGui.QFileDialog.getSaveFileName( + filename, _ = QtWidgets.QFileDialog.getSaveFileName( self.window, "Export Preset", self.settings.value("presetDir"), "Preset Files (*.avl)") diff --git a/src/video_thread.py b/src/video_thread.py index 5ea6d21..b45381c 100644 --- a/src/video_thread.py +++ b/src/video_thread.py @@ -121,15 +121,12 @@ class Worker(QtCore.QObject): vencoders = options['video-codecs'][vcodec] aencoders = options['audio-codecs'][acodec] - #print(encoders) for encoder in vencoders: - #print(encoder) if encoder in encoders: vencoder = encoder break for encoder in aencoders: - #print(encoder) if encoder in encoders: aencoder = encoder break @@ -167,10 +164,10 @@ class Worker(QtCore.QObject): numpy.seterr(divide='ignore') # Call preFrameRender on all components - print('Loaded Components:', ", ".join( - ["%s) %s" % (num, str(component)) \ - for num, component in enumerate(reversed(self.components)) - ])) + print('Loaded Components:', ", ".join([ + "%s) %s" % (num, str(component)) + for num, component in enumerate(reversed(self.components)) + ])) self.staticComponents = {} numComps = len(self.components) for compNo, comp in enumerate(self.components): From 83d55593d005cd540b042b27e6141a3d506d4215 Mon Sep 17 00:00:00 2001 From: DH4 Date: Fri, 23 Jun 2017 23:39:22 -0500 Subject: [PATCH 3/3] Fixed QtWidgets not imported on some components. --- src/components/color.py | 2 +- src/components/original.py | 2 +- src/components/text.py | 4 ++-- src/components/video.py | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/components/color.py b/src/components/color.py index 2e3902a..44ed82e 100644 --- a/src/components/color.py +++ b/src/components/color.py @@ -1,5 +1,5 @@ from PIL import Image, ImageDraw -from PyQt5 import uic, QtGui, QtCore +from PyQt5 import uic, QtGui, QtCore, QtWidgets from PyQt5.QtGui import QColor from PIL.ImageQt import ImageQt import os diff --git a/src/components/original.py b/src/components/original.py index 61f463d..0d5001c 100644 --- a/src/components/original.py +++ b/src/components/original.py @@ -1,6 +1,6 @@ import numpy from PIL import Image, ImageDraw -from PyQt5 import uic, QtGui, QtCore +from PyQt5 import uic, QtGui, QtCore, QtWidgets from PyQt5.QtGui import QColor import os from . import __base__ diff --git a/src/components/text.py b/src/components/text.py index 0f599ed..76961c9 100644 --- a/src/components/text.py +++ b/src/components/text.py @@ -1,6 +1,6 @@ from PIL import Image, ImageDraw from PyQt5.QtGui import QPainter, QColor, QFont -from PyQt5 import uic, QtGui, QtCore +from PyQt5 import uic, QtGui, QtCore, QtWidgets from PIL.ImageQt import ImageQt import os import io @@ -138,7 +138,7 @@ class Component(__base__.Component): painter.drawText(x, y, self.title) painter.end() - imBytes = image.bits().asstring(image.numBytes()) + imBytes = image.bits().asstring(image.byteCount()) return Image.frombytes('RGBA', (width, height), imBytes) diff --git a/src/components/video.py b/src/components/video.py index 0090426..70247e1 100644 --- a/src/components/video.py +++ b/src/components/video.py @@ -1,5 +1,5 @@ from PIL import Image, ImageDraw -from PyQt5 import uic, QtGui, QtCore +from PyQt5 import uic, QtGui, QtCore, QtWidgets import os import subprocess import threading