Effacer terminal

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:

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

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).

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.

J’ai essayé en faisant:

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 ?

Bonjour @mapommfj,

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

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 :

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 :

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 :

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.

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

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…

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

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

Merci à tous pour votre aide