2016-08-29 13 views
2

Ich würde gerne wissen, wie Sie mehrere Zeilen in Python 3.5 neu drucken.Wie werden mehrere gedruckte Zeilen mit Python in-place aktualisiert?

Dies ist ein Beispiel für ein Skript, bei dem ich die gedruckte Anweisung aktualisieren möchte.

import random 
import time 

a = 0 
while True: 
    statement = """ 
    Line {} 
    Line {} 
    Line {} 
    Value = {} 
    """.format(random.random(), random.random(), random.random(), a) 
    print(statement, end='\r') 
    time.sleep(1) 
    a += 1 

Was ich versuche ist haben:

Line 1 
Line 2 
Line 3 
Value = 1 

schreiben oben auf/update/Refresh:

Line 1 
Line 2 
Line 3 
Value = 0 

Die Werte jeder Zeile wird jedes Mal ändern. Dies gibt mir effektiv eine Statusaktualisierung jeder Zeile.

Ich sah another question from 5 years ago jedoch mit dem Zusatz der end Argument in Python 3+ Druckfunktion, ich hoffe, dass es eine viel einfachere Lösung ist.

+1

Nicht sicher, was Sie versuchen zu tun? Bitte geben Sie eine Beispiel-Konsole Ausgabe – TheLazyScripter

+0

Aktualisiert, hoffentlich ist es jetzt klarer, wenn nicht bitte lass es mich wissen – Greg

+0

so ist es eigentlich eine einzige Zeile, die Sie aktualisieren möchten? –

Antwort

1

Wenn Sie den Bildschirm jedes Mal beim print() rufen löschen möchten, so dass es erscheint der Druck jedes Mal überschrieben wird, können Sie clear in Unix oder cls in Windows verwenden, zum Beispiel:

import subprocess 
a = 0 
while True: 
    print(a) 
    a += 1 
    subprocess.call("clear") 
+0

Dies funktioniert nur, wenn er im Terminal arbeitet. Was ist, wenn er den IDLE oder einen anderen Dolmetscher benutzt? – TheLazyScripter

+0

Diese Lösung ist nicht tragbar – BPL

+0

Ja @BPL Ihre Antwort ist portabler :) obwohl Hinweis "os.system" ist veraltet –

2

Wenn ich verstanden habe richtig sind Sie für diese Art der Lösung:

import random 
import time 
import os 


def clear_screen(): 
    os.system('cls' if os.name == 'nt' else 'clear') 

a = 0 
while True: 
    clear_screen() 

    statement = """ 
    Line {} 
    Line {} 
    Line {} 
    Value = {} 
    """.format(random.random(), random.random(), random.random(), a) 
    print(statement, end='\r') 
    time.sleep(1) 
    a += 1 

Diese Lösung wird mit einigen Software wie IDLE nicht funktionieren, Sublime Text Eclipse .. Das Problem bei der Ausführung dieser Art von Software ist, dass clear/cls ANSI-Escape-Sequenzen verwendet, um den Bildschirm zu löschen. Diese Befehle schreiben eine Zeichenfolge wie "\ 033 [[80; j" an den Ausgabepuffer. Die native Eingabeaufforderung ist in der Lage, dies als Befehl zum Löschen des Bildschirms zu interpretieren, aber diese Pseudo-Terminals wissen nicht, wie sie zu interpretieren sind, so dass sie nur ein kleines Quadrat drucken, als ob sie ein unbekanntes Zeichen drucken würden.

Wenn Sie diese Art von Software verwenden, könnte ein Hack um Druck machen ('\ n' * 100), es wird nicht die optimale Lösung sein, aber es ist besser als nichts.

+0

Dies funktioniert nur wenn er im Terminal arbeitet. Was ist, wenn er den IDLE oder einen anderen Dolmetscher benutzt? – TheLazyScripter

+0

nette Kopie einfügen! – dsgdfg

+1

@TheLazyScripter Ich habe dieses IDLE-Ding nie benutzt, nachdem ich viele Jahre mit Python gearbeitet habe, also ist es mir persönlich egal. Auch das OP erwähnte diese Anforderung nicht, so dass die Annahme ist, dass er ein echtes Tool verwendet. – BPL

0

Sie könnten dafür curses verwenden.

#!/usr/bin/python3 

import curses 
from time import sleep 
from random import random 

statement = """ 
Line {} 
Line {} 
Line {} 
Value = {}""" 

screen = curses.initscr() 
n = 0 

while n < 20: 
    screen.clear() 
    screen.addstr(0, 0, statement.format(random(), random(), random(), n)) 
    screen.refresh() 
    n += 1 
    sleep(0.5) 

curses.endwin() 
Verwandte Themen