... | ... | @@ -44,13 +44,54 @@ else: |
|
|
On peut écrire une boucle **while** qui repose la question tant que le chemin n'est pas valide.
|
|
|
|
|
|
**3) j'utilise une fonction de Tkinter**
|
|
|
C'est cette option qui est choisie dans le REPL en ligne.
|
|
|
C'est cette option en mode "vite fait sur le gaz" qui est choisie dans le REPL en ligne ; on cite également une manière plus "propre" d'utiliser cette fonctionnalité.
|
|
|
|
|
|
a) mode "vite fait sur le gaz"
|
|
|
**askopenfilename** est une méthode très pratique du le module tkinter.filedialog, qui propose aussi **askdirectory** , **asksaveafile**... [voir la doc](https://docs.python.org/3/library/dialog.html)
|
|
|
Tkinter est un module pour réaliser des interface graphique, qui est présent dans le Python "de base". Ses méthodes sont donc prévues pour être appelées en présence d'une interface. En l'absence de cette interface, Tkinter va se débrouiller et ouvrir quand même une interface dans un coin, qu'il faudra refermer.
|
|
|
|
|
|
``` python
|
|
|
from tkinter.filedialog import askopenfilename
|
|
|
chemin_complet= askopenfilename() # ouverture d'une fenêtre explorateur
|
|
|
```
|
|
|
C'est une utilisation "vite fait sur le gaz" d'une fonctionnalité qui s'utilise normalement avec une interface graphique. En l'absence de cette interface, Tkinter va se débrouiller et ouvrir quand même une interface dans un coin, qu'il faudra refermer.
|
|
|
On verra si nécessaire comment définir proprement une interface, mais cela sort du cadre de ce premier atelier.
|
|
|
|
|
|
b) avec création d'une "application temporaire"
|
|
|
Cette solution fonctionne bien, mais c'est un peu pénible d'avoir une fenêtre "en plus" qu'il faut fermer à la main, au risque de voir ces fenêtres se multiplier si appelle plusieurs fois des méthodes de tkinter.
|
|
|
Il est donc préférable de créer une interface, pour la détruire juste après l'appel à la méthode de filedialog.
|
|
|
|
|
|
```python
|
|
|
import tkinter as Tk
|
|
|
from tkinter import filedialog as tk_filedialog
|
|
|
|
|
|
# on crée une fenêtre principale, souvent appelée root ou app
|
|
|
root = Tk.Tk()
|
|
|
root.title("self.titre"fenêtre temporaire")
|
|
|
root.protocol('WM_DELETE_WINDOW', self.root.withdraw) # pour empêcher sa fermeture
|
|
|
chemin = tk_filedialog.askopenfilename()
|
|
|
root.destroy() # on détruit la fenêtre
|
|
|
|
|
|
```
|
|
|
|
|
|
Si on utilise plusieurs fois les méthodes de filedialog, on propose de créer un "context manager" pour insérer des actions avant et après le bloc de code. La notion de context manager sort du cadre de ce premier atelier, même si on l'utilise pour ouvrir un ficher avec **with open() as...**. L'idée est de définir dans une classe ad-hoc ce que l'on fait avant et après l'exécution du bloc de code, dans les méthodes __enter__ et __exit__.
|
|
|
Cette notion est également pratique dans une classe "normale" pour définir des actions à la création et à la destruction d'une instance.
|
|
|
|
|
|
<details><summary>un exemple simple de context manager</summary>
|
|
|
class UnObjetPourTester:
|
|
|
def __init__(self, nom="un objet", poubelle ="grise"):
|
|
|
self.nom = nom
|
|
|
self.poubelle = poubelle
|
|
|
|
|
|
def __enter__(self):
|
|
|
print(f'Création de {self.nom}.')
|
|
|
|
|
|
def __exit__(self, exc_type, exc_value, tb):
|
|
|
print(f'Destruction de {self.nom} ; hop dans la poubelle {self.poubelle}.')
|
|
|
|
|
|
return False # False => mon exception va être remontée (bonne pratique)
|
|
|
|
|
|
</details>
|
|
|
|
|
|
|
|
|
Là encore, il est utile de vérifier si le fichier existe.
|
|
|
Il n'est pas rare d'avoir des problèmes de format ; sur le REPL.IT vous trouverez deux fichiers dont le nom commence par "B2220010" ; un seul permet de faire tourner le code correctement. Si vous les ouvrez, vous ne verrez pas de différence au premier abord. Celui qui est déposé sur le gitlab a été d'abord copié sur le site REPL, mais le code ne pouvait pas l'ouvrir... On a "truandé" en ouvrant un fichier sur le REPL puis en copiant-collant les données dedans...
|
|
|
Si vous avez un Mac vous pourriez être amené à pratiquer le même genre de bidouille ou bien à rechercher le format du fichier d'entrée.
|
... | ... | |