Commit e7bc51dc authored by Robert Sebille's avatar Robert Sebille

Initial commit

parents
Pipeline #129153 passed with stages
in 32 seconds
This diff is collapsed.
GNU GENERAL PUBLIC LICENSE
La classe fournit des outils pour afficher des petits films à partir de frames en ascii.
Les frames peuvent être dans un seul fichier, avec un séparateur ou dans plusieurs fichiers qui seront lus d'un répertoire à préciser, et dans l'ordre alphanumérique croissants.
Unzip the zip file, then:
~$ cd films
Demo:
~$ python3 demo.py
Importation de la classe, pour un fichier dans le répertoire principal:
from classes.Film import Film
Aide:
help(Film)
demo.py montre un exemple d'usage
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# vim:fileencoding=utf-8
#
# class Film.py
#
# Copyright 2019 Robert Sebille <robert@sebille.name>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
# MA 02110-1301, USA.
#
#
from time import sleep
from os import listdir
class Film:
"""Cette classe fournit des outils pour afficher des petits films
à partir de frames en ascii.
Les frames peuvent être dans un seul fichier, avec un séparateur ou
dans plusieurs fichiers qui seront lus d'un répertoire à préciser,
et dans l'ordre alphanumérique croissants.
"""
def __init__(self, titre=""):
"""Constructeur"""
self.titre = str(titre)
self.frames = []
self.reverse = False
self.affiche_titre = True
self.affiche_ctrl_c = True
self.titre_x = 2
def __str__(self):
"""Retoune la chaîne "Film : Titre du film" """
return str("Film : " + self.titre)
# Private
def __ccls(cls): # clear the screen
return "\033[2J"
__ccls = classmethod(__ccls)
def __ccxy2(self, x, y): # position cursor at x across, y down
return "\033["+str(y)+";"+str(x)+"f"
def __csrv(self): # print reverse
return "\033[7m"
def __csrs(self): # print, reset all
return "\033[0m"
# Public
# class methods
def clearsc(cls):
"""Efface l'écran."""
print(cls.__ccls())
clearsc = classmethod(clearsc)
# getters
def get_titre(self):
"""Retourne le titre """
return self.titre
def get_affiche_titre(self):
"""Retourne si il faut afficher le titre (booléen)"""
return self.affiche_titre
def get_affiche_ctrl_c(self):
"""Retourne si il faut afficher une mention CTRL + C (booléen)"""
return self.affiche_ctrl_c
def get_titre_x(self):
"""Retourne la coordonnées x d'affichage du titre"""
return self.titre_x
def get_reverse(self):
"""Retourne le sens du film en avant ou en arrière (booléen)"""
return self.reverse
def get_film(self, nb=0, x=2, y=2, trace=0, delai=0.1):
"""Lance l'instance film en lisant les frames.
- nb: nombre de frames à exécuter. 0 = non déterminé
- x, y les coordonnées haut gauche de départ du film (y compris
le titre, si self.affiche_titre = True
- trace nombre de blancs à ajouter à la frame suivant le sens du film:
avant si self.reverse = False, après si self.reverse = True
- delai: la durée en seconde de chaque frame
Si self.reverse = True, le film peut avoir des effets de bord non
désiré quand x < 0. Vous pouvez régler cela via l'appel de la
méthode.
"""
self.clearsc()
if self.affiche_titre:
self.goto(self.titre_x + 2, y)
print(self.get_titre())
y += 2
if self.reverse:
dep = nb
after = " " * trace
before = ""
else:
dep = 0
after = ""
before = " " * trace
while (dep <= nb and dep >= 0) or nb == 0:
try:
for f in self.frames:
for l in range(len(f)):
self.goto(x + dep, y + l)
print(before + f[l] + after)
self.goto(0, y + l + 2)
if self.affiche_ctrl_c:
print(" CTRL + C to stop.")
sleep(delai)
if self.reverse:
dep -= 1
else:
dep += 1
except KeyboardInterrupt:
print("\nReçu CTRL + C")
input("Pressez entrée pour sortir.")
exit("Bye !")
# setters
def set_titre(self, titre):
"""Modifie ou crée le titre"""
self.titre = titre
def set_affiche_titre(self, affiche_titre):
"""Décide si il faut afficher le titre (booléen)"""
self.affiche_titre = affiche_titre
def set_affiche_ctrl_c(self, affiche_ctrl_c):
"""Décide si il faut afficher une mention CTRL + C (booléen)"""
self.affiche_ctrl_c = affiche_ctrl_c
def set_titre_x(self, titre_x):
"""Décide la coordonnée x du titre"""
self.titre_x = titre_x
def set_reverse(self, direction):
"""Décide le sens du film, en avant ou en arrière (booléen)"""
self.reverse = direction
def set_frame(self, fichier, sep="#"):
"""Lit les frames à partir d'un seul fichier. Ces frames sont
séparées par un séparateur, par défaut #
"""
with open(fichier) as c:
liste = c.readlines()
s = "".join(liste)
liste = s.split(sep)
for l in liste:
self.frames.append(l.split("\n"))
def set_frames(self, repertoire):
"""Lit les frames à partir de fichiers dans répertoire. Chaque frame
est dans un fichier propre. Les fichiers sont lus dans le répertoire
dans le sens alphnumérique croissant de leurs noms.
"""
frms = []
for fichier in listdir(repertoire):
with (open(repertoire + '/' + fichier)) as f:
frms.append(f.read())
for f in frms:
self.frames.append(f.split("\n"))
# other methods
def goto(self, x, y):
"""Amène le curseur en x, y pour impression (print)"""
print(self.__ccxy2(x, y), sep="", end="")
def print_rev(self, message):
"""Inverse couleur et background pour l'impression d'un message"""
print(self.__csrv() + " " + message + " " + self.__csrs())
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# vim:fileencoding=utf-8
#
# exemple.py
#
# Copyright 2019 Robert Sebille <robert@sebille.name>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
# MA 02110-1301, USA.
#
#
from time import sleep
from classes.Film import Film
if __name__ == '__main__':
# On crée 4 nouveaux films (f1, 2, 3, 4), avec leur titre (non requis))
f1 = Film("La promenade tranquille ...")
f1.set_frames("frames/")
f2 = Film("La moto infernale")
f2.set_frame("frame/roflflyingmoto")
f3 = Film("La poursuite impitoyable")
f3.set_frame("frame/poursuiteci")
f4 = Film("La poursuite effroyable")
f4.set_frame("frame/poursuiteic")
# goto: place le curseur à x, y pour impression
f1.goto(20, 6)
f1.print_rev("Les studios Robert Sebille présentent")
sleep(2)
# on efface l'écran. Méthode de classe, car quand on efface l'écran,
# c'est pour tous les objets films
Film.clearsc()
f1.goto(25, 6)
# Inverse couleur et background pour l'impression d'un message
# get_titre, bon, faut-il l'expliquer? ;)'
f1.print_rev(f1.get_titre())
sleep(2)
# lance le film f1. 65 frames à jouer, démarrer le film en 2, 2
# 0 blanc de "trace", delai de 0.2 secondes par frame
f1.get_film(66, 2, 2, 0, 0.2)
f1.goto(27, 6)
print("Sniff ! Que c'était beau !")
sleep(2)
Film.clearsc()
f2.goto(27, 6)
f2.print_rev(f2.get_titre())
sleep(2)
f2.get_film(82, 2, 2, 0, 0.05)
f1.goto(30, 6)
print("Tonnerre! Quelle vitesse !")
sleep(2)
Film.clearsc()
f3.goto(27, 6)
f3.print_rev(f3.get_titre())
sleep(2)
f3.get_film(45, 2, 2, 0, 0.2)
f3.goto(13, 6)
print("Quelle suspense époustouflant !")
sleep(2)
f3.goto(13, 6)
print("Rembobinons ? ")
sleep(1)
f3.goto(13, 6)
print("Rembobinons ! ")
sleep(1)
# Place le sens du film en arrière
f3.set_reverse(True)
# on a mis un débit par frame plus rapide pour le rembobinage
f3.get_film(45, 2, 2, 0, 0.05)
sleep(1)
Film.clearsc()
f3.goto(13, 6)
print("Et rejouons ce splendide film ! ")
sleep(2)
# on replace le sens du film en avant
f3.set_reverse(False)
f3.get_film(45, 2, 2, 0, 0.2)
f3.goto(10, 6)
print("Quelle film ! On ne s'en lasse pas !")
sleep(2)
f3.goto(10, 6)
print("Mais ce n'est pas tout, voyons la suite")
sleep(2)
Film.clearsc()
f4.set_titre("La revanche des indiens")
f4.goto(27, 6)
f4.print_rev(f4.get_titre())
sleep(2)
Film.clearsc()
f4.goto(27, 6)
print("Ha ha !")
sleep(2)
f4.get_film(45, 2, 2)
sleep(1)
Film.clearsc()
f4.goto(27, 6)
f4.print_rev("C'est fini ! Sniff !")
sleep(2)
Film.clearsc()
f4.goto(27, 6)
f4.print_rev("A vous de jouer !")
[file_prefs]
final_new_line=true
ensure_convert_new_lines=false
strip_trailing_spaces=false
replace_tabs=true
[indentation]
indent_width=4
indent_type=0
indent_hard_tab_width=8
detect_indent=false
detect_indent_width=false
indent_mode=2
[project]
name=Classe film
base_path=/home/robert/Nextcloud/dev/python/
description=
[long line marker]
long_line_behaviour=1
long_line_column=80
[files]
current_page=0
FILE_NAME_0=1242;Python;0;EUTF-8;0;1;0;%2Fhome%2Frobert%2FNextcloud%2Fdev%2Fpython%2Fasciiart%2Ffilms%2Fclasses%2FFilm.py;0;4
FILE_NAME_1=1709;Python;0;EUTF-8;0;1;0;%2Fhome%2Frobert%2FNextcloud%2Fdev%2Fpython%2Fasciiart%2Ffilms%2Fdemo.py;0;4
[VTE]
last_dir=/home/robert/Nextcloud/dev/python/puissance4
~@_ Pan ! ;
o_, . o> o ,
^~__|__&/ô ~~__/`_§/0
\\b // // \_\\
\\// // \\
``` °° °°
#
_@_ Psssi ! :
o , _/o .
~~__\`_§/0 <-- ^~__\|_&/ô
// b\\ \\/_//
// \\ \\//
°° °° ```
; Pan ! ~@_
o , ._o
~~__/`_§/0 <o ^~__|__&/ô
// \_\\ \\b //
// \\ \\//
°° °° ```
#
: Psssi ! _@_
o\_ . --> o
^~__|/_&/ô ~~__\`_§/0
\\/_// // b\\
\\// // \\
``` °° °°
__ LOL
LOL / R\
_\__/ LOL
/ \ __
R ___/ _@==\/_o|
:\_\__|\___ /_ \\ _
\-/\./\ //_o|/\./\
\/_\/ ---' \/_\/
#
ROFL __
ROFL / R\
_\__/
O / \ __
R ___/ _@==\/_o|
:\_\__|\___ /_ \\ _
\-/_|_\ //_o|/_|_\
\_|_/ ---' \_|_/
#
__
/ R\
F _\__/ ROFL
O / \ __
R ___/ _@==\/_o|
:\_\__|\___ /_ \\ _
\-/\./\ //_o|/\./\
\/_\/ ---' \/_\/
#
__
L / R\ LOL
F _\__/
O / \ __
R ___/ _@==\/_o|
:\_\__|\___ /_ \\ _
\-/_|_\ //_o|/_|_\
\_|_/ ---' \_|_/
__
_/&_\_
(;; o\
\ <
| /
/ \
||
/@|
(++
||
||
-=-
__
_/&_\)
(;; o\
\ <
| /
/ \
||\
/@| @
(++
|\
|\\
-=-='
__
_/&_\)
(:: o\
\ =
| /
/ \
//||\
@ / | @
(++
/ \\
// \\
`=- -='
__
_/&_\_
(:: o\
\ =
| /
/ \
//||
@ / |
(++
/||
// |
`=- -=-
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment