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.