# Effacer terminal

**URL:** <https://discuss.afpy.org/t/effacer-terminal/2390>\
**Category:** Entraide\
**Created:** [Novembre 27, 2024, 12:54 UTC](https://discuss.afpy.org/t/effacer-terminal/2390 "2024-11-27T12:54:41Z")\
**Posts on this page:** 8\
**Page:** 1

<div class="post-metadata">

**Author:** ![mapommBL](https://discuss.afpy.org/user_avatar/discuss.afpy.org/mapommbl/32/1720_2.png) [@mapommBL](https://discuss.afpy.org/u/mapommBL)\
**Post date:** [Novembre 27, 2024, 12:54 UTC](https://discuss.afpy.org/t/effacer-terminal/2390/1 "2024-11-27T12:54:41Z")

</div>

Bonjour, encore une petite question de néophyte, désolé:  
j’ai un script qui ouvre (à travers une combo) un terminal où se déroule un script python3. Cela donne:

```python
def sel_mo(event):
	af=ctn.get()
	if af == c1:
		subprocess.run(f"gnome-terminal -- python3 {f1}", shell=True)
	elif af == c2:
		subprocess.run(f"gnome-terminal -- python3 {f2}", shell=True)
	etc...

```

je voudrais fermer le terminal quand on change d’item dans la combo puisque je rouvre un terminal à chaque item, mais je n’y arrive pas.  
J’avais essayé un bouton avec `subprocess.run("clear", shell=True)`, mais cela ne donne rien.  
Auriez-vous une piste ? Merci d’avance

---

<div class="post-metadata">

**Author:** ![entwanne](https://discuss.afpy.org/user_avatar/discuss.afpy.org/entwanne/32/8_2.png) [@entwanne](https://discuss.afpy.org/u/entwanne)\
**Post date:** [Novembre 27, 2024, 1:29 UTC](https://discuss.afpy.org/t/effacer-terminal/2390/2 "2024-11-27T13:29:36Z")

</div>

Bonjour,

Tu lances un sous-processus graphique qui fait ensuite sa propre vie.  
En effet `clear` (nettoyer le terminal courant) n’a pas d’effet pour lui.

Le plus simple que je vois, serait d’envoyer un signal (`SIGINT` ou `SIGTERM` par exemple) pour lui demander de s’arrêter, puis d’attendre qu’il se termine effectivement.

Mais ton programme a-t-il vraiment besoin d’instancier des terminaux ? Il y a peut-être de meilleures manières de faire pour lancer un script et en suivre l’avancement (par exemple simplement relayer la sortie de ce script dans le terminal courant sur la sortie standard).

---

<div class="post-metadata">

**Author:** ![mapommBL](https://discuss.afpy.org/user_avatar/discuss.afpy.org/mapommbl/32/1720_2.png) [@mapommBL](https://discuss.afpy.org/u/mapommBL)\
**Post date:** [Novembre 27, 2024, 2:35 UTC](https://discuss.afpy.org/t/effacer-terminal/2390/3 "2024-11-27T14:35:25Z")

</div>

merci pour tes pistes. Au départ j’ai un lanceur (qui ouvre un terminal) et de là je pouvais lancer directement mes scripts python qui s’exécutaient dans ce terminal. J’ai voulu que mon lanceur n’ouvre pas de terminal, c’est pourquoi j’ai ensuite utilisé `subprocess.run(f"gnome-terminal – python3 {f}“, shell=True)`.  
Comme je n’ai pas encore maitrisé les `SIGINT` et `SIGTERM`, je vais regarder ta seconde solution.

---

<div class="post-metadata">

**Author:** ![mapommBL](https://discuss.afpy.org/user_avatar/discuss.afpy.org/mapommbl/32/1720_2.png) [@mapommBL](https://discuss.afpy.org/u/mapommBL)\
**Post date:** [Novembre 28, 2024, 4:34 UTC](https://discuss.afpy.org/t/effacer-terminal/2390/4 "2024-11-28T16:34:20Z")

</div>

J’ai essayé en faisant:

```python
result = subprocess.run(["python3", f1], capture_output=True, text=True)
		k=result.stdout.split('\n')
		for n in range (0,len(k)):
			L1=Label(fen1, text = k[n], bg='bisque', font=("Verdana", 10)).place(x=xl, y=yl+1*d)
			yl=yl+1*d

```

j’affiche donc dans ma fenetre le résultat de mon script, mais je n’arrive pas à effacer le label en question…  
c’était quelquechose dans ce sens que tu proposais ?

---

<div class="post-metadata">

**Author:** ![mdk](https://discuss.afpy.org/user_avatar/discuss.afpy.org/mdk/32/3_2.png) [@mdk](https://discuss.afpy.org/u/mdk)\
**Post date:** [Novembre 28, 2024, 4:58 UTC](https://discuss.afpy.org/t/effacer-terminal/2390/5 "2024-11-28T16:58:47Z")

</div>

Bonjour @mapommBL,

J’ai plusieurs pistes, en partant de ton programme :

```python
result = subprocess.run(["python3", f1], capture_output=True, text=True)
k=result.stdout.split('\n')
for n in range (0,len(k)):
    L1=Label(fen1, text = k[n], bg='bisque', font=("Verdana", 10)).place(x=xl, y=yl+1*d)
    yl=yl+1*d

```

d’abord, tu peux probablement te passer de `range` et itérer directement sur les lignes :

```python
result = subprocess.run(["python3", f1], capture_output=True, text=True)
lines = result.stdout.split('\n')
for line in lines:
    L1=Label(fen1, text=line, bg='bisque', font=("Verdana", 10)).place(x=xl, y=yl+1*d)
    yl=yl+1*d

```

mais ça ne répond pas à ta question, comment « nettoyer » les lignes. La complexité ici c’est que tu as plusieurs `Label`, un par ligne, pour nettoyer il faudrait tous les retrouver et les vider. Possible, mais on peut faire mieux.

On pourrait se contenter d’un seul `Label` :

```python
result = subprocess.run(["python3", f1], capture_output=True, text=True)
stdout_label = Label(fen1, text=result.stdout, bg='bisque', font=("Verdana", 10))
stdout_label.grid(column=0, row=0)

```

je le place lors d’une autre instruction de manière à garder une variable sur le label, la variable `stdout_label`.

Maintenant que tu n’as plus qu’un label, et une variable pour y accéder, tu peux le vider, ou le changer, via :

```python
stdout_label.config(text="")

```

Peut-être que dans ton contexte tu auras besoin de créer le label d’abord, une fois pour toute, puis changer son texte à chaque `subprocess.run` lancé. L’idée en tout cas est de ne pas recréer le `Label` à chaque fois mais de le réutiliser.

---

<div class="post-metadata">

**Author:** ![mapommBL](https://discuss.afpy.org/user_avatar/discuss.afpy.org/mapommbl/32/1720_2.png) [@mapommBL](https://discuss.afpy.org/u/mapommBL)\
**Post date:** [Novembre 28, 2024, 5:16 UTC](https://discuss.afpy.org/t/effacer-terminal/2390/6 "2024-11-28T17:16:15Z")

</div>

merci pour ta suggestion @mdk, je vais regarder cela demain et te donnerais le résultat. Bonne soirée

---

<div class="post-metadata">

**Author:** ![mapommBL](https://discuss.afpy.org/user_avatar/discuss.afpy.org/mapommbl/32/1720_2.png) [@mapommBL](https://discuss.afpy.org/u/mapommBL)\
**Post date:** [Novembre 29, 2024, 7:59 UTC](https://discuss.afpy.org/t/effacer-terminal/2390/7 "2024-11-29T07:59:13Z")

</div>

Bonjour @mdk, j’ai essayé ta proposition, mais j’ai 2 problèmes:  
1-le texte de mon label est centré (je n’ai pas pu le caler à gauche)  
2- `stdout_label.config(text="")` n’efface pas le label (de plusieurs lignes)  
J’ai essayé avec un `.grid.forget()` sans effet.  
Je continue à chercher…

---

<div class="post-metadata">

**Author:** ![mapommBL](https://discuss.afpy.org/user_avatar/discuss.afpy.org/mapommbl/32/1720_2.png) [@mapommBL](https://discuss.afpy.org/u/mapommBL)\
**Post date:** [Novembre 29, 2024, 3:02 UTC](https://discuss.afpy.org/t/effacer-terminal/2390/8 "2024-11-29T15:02:17Z")

</div>

Je crois que la solution suivante répond à mon besoin (comme d’ailleurs la solution ouvrant un terminal à chaque fois et que je ferme à la main):  
j’ai créé une zone scrollable dans laquelle j’affiche le résultat et que j’efface avec un

```python
for widget in scrollable_frame.winfo_children():
			widget.destroy()

```

Merci à tous pour votre aide
