Bonjour,
Je suis en train de coder une application avec laquelle je crée (entre autre) mes séquences de cours. A la fin de chaque traitement je voudrais afficher la fiche de cours produite sous forme de fichier PDF.
Tout fonctionne bien sauf l'affichage dans l'onglet Visualisation (classe Visionnage). En fait je voudrais qu'a la fin de chaque traitement la fiche correspondante (les fichiers pdf produits, avec un nombre de pages qui peuvent être 1, 2, 3, ... selon les cas) s'affiche dans l'onglet Visualisation et contenu dans un QGraphicsView. A la fin de chaque traitement les fichiers pdf des séquences sont convertis en images png (dans le répertoire temporaire), je voudrais que par l'intermédiaire de la classe Visionnage (voir mon code plus bas) les images produites s'affichent dans un QGraphicsView piloté par un bouton correspondant à chaque page (chaque image). Pour l'instant ça ne fonctionne pas quand je passe par l'appel de la classe Visionnage avec l'attribut liste_images. Pouvez-vous m'aider ?
J'ai mis une copie d'écran de ce que je voudrais obtenir (l'image jointe avec les boutons en bas (Vue page 1, ...)).
Pour précision, je ne suis pas du tout un expert.
Voici une partie de mon script main :
Une partie du code la la classe APSC_Sequence_Prof :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117 ... class APSC_GUI(QMainWindow): # Classe GUI principale def __init__(self): super(APSC_GUI, self).__init__() # Version de PyQt5 et de Qt APSC_Print("PyQt {0} et Qt {1}".format(PYQT_VERSION_STR, QT_VERSION_STR)) # Appel de la classe de la séquence prof self.seq_p = APSC_Sequence_Prof() # Titre self.setWindowTitle('ArtsPlastocSequenceConceptor') # Logo/icône pour la fenêtre self.setWindowIcon(QIcon('logo_png_apsc'+os.sep+'logo_apsc_256x256.png')) self.setGeometry(20, 40, 900, 760) # La taille minimum est fixée à 900 x 760 self.setMinimumSize(900, 760) # Appel de la classe de mise en page de la séquence élève self.mep_seq_elev = MiseEnPageSequenceEleve(parent=None) # Appel de la fonction affichant le menu self.menus() # ============================================= # # Boîte d'onglets self.tab_widget = QTabWidget() # Appel des classes contenant le groupement de widgets self.win_widget_1 = APSC_Sequence_Prof(self) self.win_widget_2 = MiseEnPageSequenceEleve(self) self.win_widget_3 = FeuilleEvaluation(self) self.win_widget_4 = Visionnage(self) self.win_widget_5 = Info(self) # Le widget widget = QWidget() layout = QVBoxLayout(widget) # On liste le contenu du répertoire temporaire ... liste_contenu_tmp = os.listdir(tempfile.gettempdir()) # ------------------------------------------------------ # Au tout 1er démarrage d'APSC, le fichier temporaire : # data_affichage_onglets_apsc ... n'existe pas encore. # Tant que l'utilisateur n'aura pas sélectionné le type # d'Apparence des onglets de sélection des rubriques, # cela s'affichera en 'mode' texte # ------------------------------------------------------ # Boucle de vérification ... for contenu in liste_contenu_tmp : # if 'data_affichage_onglets_apsc' not in contenu : # On rajoute chaque onglet ... en 'mode' texte self.tab_widget.addTab(self.win_widget_1, "Séquence du professeur") self.tab_widget.addTab(self.win_widget_2, "Fiche élève") self.tab_widget.addTab(self.win_widget_3, "Feuille d'évaluation") self.tab_widget.addTab(self.win_widget_4, "Visualisation") self.tab_widget.addTab(self.win_widget_5, "Aide et informations") # --------------------------------------------------------- # Si l'apparence des onglets a déjà été modifié, c'est à # dire que l'utilisateur a déjà sélectionné le type # d'Apparence des onglets de sélection des rubriques, cela # s'affichera dans le 'mode' choisi par l'utilisateur # --------------------------------------------------------- # Boucle de vérification ... for contenu in liste_contenu_tmp : # Si le fichier tempo concerné est bien # dans le répertoire temporaire ... if 'data_affichage_onglets_apsc' in contenu : # ------------------------------------------------------- # # Utilisation de la classe Tempo_lecture pour la lecture # des données dans le répertoire (dit) temporaire # ------------------------------------------------------- # rep_tempo_lecture = Tempo_lecture(tempfile.gettempdir(), os.getcwd(), 'data_affichage_onglets_apsc_', 'data_affichage_onglets_apsc') # ... avec appel de la méthode affichage rep_tempo_aff = rep_tempo_lecture.affichage()[0] # Si sélection en 'mode' Texte uniquement ... if rep_tempo_aff == 'Texte uniquement' : self.tab_widget.addTab(self.win_widget_1, "Séquence du professeur") self.tab_widget.addTab(self.win_widget_2, "Fiche élève") self.tab_widget.addTab(self.win_widget_3, "Feuille d'évaluation") self.tab_widget.addTab(self.win_widget_4, "Visualisation") self.tab_widget.addTab(self.win_widget_5, "Aide et informations") # Si sélection en 'mode' Texte et icônes ... if rep_tempo_aff == 'Texte et icônes' : self.tab_widget.addTab(self.win_widget_1, QIcon(os.path.join('logo_png_apsc', 'icone_tete_de_prof_apsc_256x256.png')), "Séquence du professeur") self.tab_widget.addTab(self.win_widget_2, QIcon(os.path.join('logo_png_apsc', 'icone_tete_d_eleve_apsc_256x256.png')), "Fiche élève") self.tab_widget.addTab(self.win_widget_3, QIcon(os.path.join('logo_png_apsc', 'icone_evaluation_apsc_256x256.png')), "Feuille d'évaluation") self.tab_widget.addTab(self.win_widget_4, QIcon(os.path.join('logo_png_apsc', 'icone_visualisation_apsc_256x256.png')), "Visualisation") self.tab_widget.addTab(self.win_widget_5, QIcon(os.path.join('logo_png_apsc', 'icone_aide_version_apsc_256x256.png')), "Aide et informations") # Taille de l'icône dans le QTabWidget self.tab_widget.setIconSize(QSize(24, 24)) # Si sélection en 'mode' Icônes uniquement ... if rep_tempo_aff == 'Icônes uniquement' : self.tab_widget.addTab(self.win_widget_1, QIcon(os.path.join('logo_png_apsc', 'icone_tete_de_prof_apsc_256x256.png')), None) self.tab_widget.addTab(self.win_widget_2, QIcon(os.path.join('logo_png_apsc', 'icone_tete_d_eleve_apsc_256x256.png')), None) self.tab_widget.addTab(self.win_widget_3, QIcon(os.path.join('logo_png_apsc', 'icone_evaluation_apsc_256x256.png')), None) self.tab_widget.addTab(self.win_widget_4, QIcon(os.path.join('logo_png_apsc', 'icone_visualisation_apsc_256x256.png')), None) self.tab_widget.addTab(self.win_widget_5, QIcon(os.path.join('logo_png_apsc', 'icone_aide_version_apsc_256x256.png')), None) # Taille de l'icône dans le QTabWidget self.tab_widget.setIconSize(QSize(32, 32)) # Onglets positionnés au centre self.tab_widget.setStyleSheet("""QTabWidget::tab-bar {alignment: center;}""") layout.addWidget(self.tab_widget) self.setCentralWidget(widget) ...
Voici ma classe Visionnage (en chantier), ... le QGraphicsView n'affiche rien àa la fin du traitement :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73 ... # ========================================================== # Gestion de la visualisation (dans l'onglet Visualisation) # ========================================================== # Si des images PNG d'une fiche prof, ou d'une fiche # élève, ou d'une fiche d'évaluation existe déjà, # elles sont éliminées avant d'en recréer d'autres # On liste le contenu du répertoire temporaire ... liste_contenu_tmp = os.listdir(tempfile.gettempdir()) # ... ou du répertoire courant ... liste_contenu_rep_courant = os.listdir(os.getcwd()) # ------------------------------------------------------------ # Exception pour contrôler le répertoire temporaire utilisé # ------------------------------------------------------------ try : for contenu in liste_contenu_tmp : # Si le fichier tempo concerné est bien dedans ... if 'pdf_png_apsc' in contenu : APSC_Print("Le fichier temporaire contient déjà des fiches (prof, élève ou évaluation) ; le fichier {} est éliminé".format(contenu)) APSC_Print(" ") os.remove(tempfile.gettempdir()+os.sep+contenu) except : for contenu in liste_contenu_rep_courant : if 'pdf_png_apsc' in contenu : APSC_Print("Le fichier temporaire contient déjà des fiches (prof, élève ou évaluation) ; le fichier {} est éliminé".format(contenu)) APSC_Print(" ") os.remove(os.getcwd()+os.sep+contenu) # Chemin et nom de fichier du fichier PDF à traiter pdf_traitement = optio_2[0] # Chemin (dans le répertoire temporaire) et nom des images (PNG) img_traitement = tempfile.gettempdir()+os.sep+'pdf_png_apsc' # Sous windows ... if os.name == 'nt' : import subprocess # ... on utilise directement l'exécutable pdftoppm.exe # (se trouvant ds le répertoire racine (courant)) pdftoppm_executable = "pdftoppm.exe" # La commande ... commande = "{} -r 96 -png -aa yes {} {}".format(pdftoppm_executable, pdf_traitement, img_traitement) # subprocess.call(commande, shell = True) # Sous GNU/Linux ... else : # On utilise le module pdf2image ... installé par # la commande : pip3 install pdf2image from pdf2image import convert_from_path pages = convert_from_path(pdf_traitement, 96) for n, page in enumerate(pages) : page.save(img_traitement+'-'+str(n+1)+'.png', 'PNG') # ========================================================== liste_contenu_tmp_2 = os.listdir(tempfile.gettempdir()) ############### print(liste_contenu_tmp_2) ########## import glob ########## print("glob", glob.glob(tempfile.gettempdir()+os.sep+'pdf_png_apsc*.png')) ########### liste_images = glob.glob(tempfile.gettempdir()+os.sep+'pdf_png_apsc*.png') ######### # Visionnage des séquences prof et élève from affichage_apsc.visionnage_gui import Visionnage ############## visio = Visionnage(liste_images, parent=None) ################ # Temps de traitement ... (pour info) elapsed_seconds = (datetime.datetime.now() - start).total_seconds() secondes = float(elapsed_seconds % 60) secondes_ecoulees = "{0:.2f}".format(round(secondes, 2)) APSC_Print("Secondes écoulées : {}".format(secondes_ecoulees)) ...
J'espère que vous pourrez me donner un coup de main ...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126 ... # Je me suis inspiré de ce post sur Stackoverflow : # https://stackoverflow.com/questions/49670506/reading-frames-from-a-folder-and-display-in-qgraphicsview-in-pyqt4 # ... en l'adaptant complètement à mon besoin ... # Gérer les print ... #from affichage_apsc.apsc_print import APSC_Print # Merci à eyllanesc pour son aide est pour cette classe ... import # --> pour les icônes à gauche dans le bouton # --> https://stackoverflow.com/questions/53415379/align-icon-on-the-right-and-center-the-text-in-a-qpushbutton from affichage_apsc.push_button_icone_gauche import PushButtonIconeGauche import os, tempfile # Imports PyQt5 ----------------------------------------------------------------------- from PyQt5.QtWidgets import QWidget, QGroupBox, QPushButton, QGridLayout, \ QGraphicsScene, QGraphicsView, QGraphicsPixmapItem, \ QApplication from PyQt5.QtCore import QSize, Qt, QTimer from PyQt5.QtGui import QPixmap, QIcon # -------------------------------------------------------------------------------------- class Visionnage(QWidget): ''' Classe pour visionner le résultat (en images PNG de chaque page en PDF) des fiches prof, élève ou évaluation, selon les cas ''' def __init__(self, liste_images, parent=None): #super(Visionnage, self).__init__(parent) super().__init__() self.liste_images = liste_images #""" ############################### #if str(type(self.liste_images)) == "<class 'list'>" : ########### try : print('OKKKKKKK') ############ print("Images Temp", self.liste_images) ####### print(type(self.liste_images)) ###### # Utilisation QGraphicsScene et QGraphicsView self.scene = QGraphicsScene() self.graphique_vue = QGraphicsView(self.scene) # Dictionnaire des botons des pages de visionnement self.dico_bouton_visio = {} # Icône pour le bouton ... icone = QIcon(os.path.join('logo_png_apsc', 'icone_visualisation_apsc_256x256.png')) # ===================================================== groupe_1 = QGroupBox() groupe_2 = QGroupBox() grid_1 = QGridLayout() grid_1.setSpacing(10) grid_2 = QGridLayout() grid_2.setSpacing(10) # Ajout du QGraphicsView ds la grille 1 grid_1.addWidget(self.graphique_vue, 0, 0) print("len(self.liste_images)", len(self.liste_images)) # Boucle pour lister le nombre d'images et # attribuer les boutons en conséquence for n, i in enumerate(self.liste_images) : #for n in range(6) : # A GARDER ! print("Image tempo {}".format(n), i) # Bouton pour ajouter une ligne pour les questions d'enseignement self.dico_bouton_visio[n] = PushButtonIconeGauche("Vue page {}".format(n+1), icon = icone, iconSize = QSize(16, 16)) # Ajout du ou des bouton(s) dans la grille 2 grid_2.addWidget(self.dico_bouton_visio[n], 0, n) # A GARDER ! #QApplication.processEvents() ######### if n == 0 : self.dico_bouton_visio[0].clicked.connect(lambda : self.afficher(0)) elif n == 1 : self.dico_bouton_visio[1].clicked.connect(lambda : self.afficher(1)) elif n == 2 : self.dico_bouton_visio[2].clicked.connect(lambda : self.afficher(2)) elif n == 3 : self.dico_bouton_visio[3].clicked.connect(lambda : self.afficher(3)) elif n == 4 : self.dico_bouton_visio[4].clicked.connect(lambda : self.afficher(4)) elif n == 5 : self.dico_bouton_visio[5].clicked.connect(lambda : self.afficher(5)) # grid_1.setAlignment(Qt.AlignVCenter) # groupe_1.setLayout(grid_1) groupe_2.setLayout(grid_2) layout = QGridLayout() layout.addWidget(groupe_1, 0, 0) layout.addWidget(groupe_2, 1, 0) # self.setLayout(layout) #elif str(type(self.liste_images)) == "<class '__main__.APSC_GUI'>" : ########### except : print('Pas Oké !!!') ############# pass def afficher(self, n) : ''' Fonction pour afficher une image PNG de la fiche prof, de la fiche élève (ou de la fiche d'évaluation), en cours ''' #try : self.scene.clear() ########## self.graphique_vue.items().clear() ########## images = self.liste_images[n] pixmap = QPixmap(images) item = QGraphicsPixmapItem(pixmap) self.scene.addItem(item) self.graphique_vue.setScene(self.scene) # self.graphique_vue.show() #except : return
J'espère aussi avoir été suffisamment clair dans mes explications.
Je vous remercie d'avance.
a+
Partager