If you find this project useful, please, do not forget to it.
On version v4 Pyforms code was reorganized and splitted in 3 subprojects. Now the GUI, Web and Terminal implementations are located at the repositories
and their respectives documentation at:
The libraries are now available on the PyPI repositories, which means you can install them using the commands
> pip install pyforms-gui > pip install pyforms-web > pip install pyforms-terminal
If you wish you can also install all layers at once, using the command:
> pip install pyforms
All the modules will be imported in the same way as in previous versions, with the exception of the BaseWidget class, that now is imported using the string:
from pyforms.basewidget import BaseWidget
The main diference of these updates, is that, it is not mandatory anymore to install all the 3 diferent layers and its requirements. For example, it does not make sense to install pyforms-gui and its requirements like pyqt5 on a webserver where we are going to execute pyforms only on Web mode.
Pyforms is a Python cross-enviroment framework to develop GUI applications, which promotes modular software design and code reusability with minimal effort.
Example of an application running in the Desktop, Web and Terminal enviroments:
The documentation is still in development, but you can find a preview on pyforms.readthedocs.org
Check the documentation pyforms.readthedocs.org
Pyforms is open-source library under the MIT license.
The development of this library started with the necessity of allowing users with low programming skills to edit parameters of my python scripts. The idea was to transform scripts which had already been developed into GUI applications with a low effort and in a short time.
For example in my computer vision applications in the majority of the times there were variables that had to be set manually in the scripts for each video, to adjust the thresholds, blobs sizes, and other parameters to the environment light conditions... To test each set of parameters the script had to be executed. With GUI applications, users would be able to set the parameters using a GUI interface and visualize the results instantly without the need of restarting the script. That was the idea.
After looking into the several python options for GUI interfaces, PyQt was the one that seemed the best tool for a fast development with the QtDesigner, but after a while developing in Qt, switching between the designer and the python IDE was becoming too costly in terms of time, because the interfaces were constantly evolving, and it was tedious, because GUI controls were repeated several times.
Being a Django developer, I did get inspiration on it for this framework. In the Django Models we just need to define the type of variables and their disposition in the form (in ModelAdmin) to generate a HTML form for data edition. For the GUIs that I wanted to build for my python scripts, I would like to have the same simplicity, because I did wanted to focus on the algorithms and not on GUIs developing.
The result was the simplicity that we can see in the example below:
class ComputerVisionAlgorithm(BaseWidget): def __init__(self): super(ComputerVisionAlgorithm,self).__init__('Computer vision algorithm example') #Definition of the forms fields self._videofile = ControlFile('Video') self._outputfile = ControlText('Results output file') self._threshold = ControlSlider('Threshold', 114, 0,255) self._blobsize = ControlSlider('Minimum blob size', 100, 100,2000) self._player = ControlPlayer('Player') self._runbutton = ControlButton('Run') #Define the function that will be called when a file is selected self._videofile.changed_event = self.__video_file_selection_event #Define the event that will be called when the run button is processed self._runbutton.value = self.__run_event #Define the event called before showing the image in the player self._player.process_frame_event = self.__process_frame #Define the organization of the Form Controls self._formset = [ ('_videofile', '_outputfile'), '_threshold', ('_blobsize', '_runbutton'), '_player' ] def __video_file_selection_event(self): """ When the videofile is selected instanciate the video in the player """ self._player.value = self._videofile.value def __process_frame(self, frame): """ Do some processing to the frame and return the result frame """ return frame def __run_event(self): """ After setting the best parameters run the full algorithm """ pass