2016-03-21 6 views
1

Lasst uns sagen, ich habe dieses kleine Python-Programm:Python-Programm Benutzereingaben zu übernehmen und Konsole aktualisieren, ohne „Scrollen“

def drawLine(): 

    userInput = input("Coordinates:") 
    userInput = userInput.split() # x y 

    # Draw 
    # ... some drawing algo which will print an "X" on the screen with x,y 

drawLine() 
drawLine() 

nun feststellen, dass drawLine() zweimal aufgerufen wird, so dass zwei Eingänge getroffen werden können und zwei X-es gemalt werden. Leider wird die Konsole nach oben scrollen. Ich will, dass mein Python-Programm "auf" hört, um Benutzer zu drücken, und "nicht weg scrollen". Denken Sie an eine Mini-Konsole Photoshop, die auch Ihre Leinwand nicht außer Sichtweite scrollt.

Aktualisieren: Das Problem ist klein genug, um keine Bibliothek zu verwenden.

+1

Wenn Sie keine Bibliothek verwenden möchten, werden Sie eine Menge fiddly Code schreiben. Verwenden Sie eine Bibliothek. –

+1

Überprüfen Sie zumindest den Code, den die Bibliotheken verwenden, um sich ein Bild davon zu machen, wie es gemacht wird. –

+0

Das Überprüfen von Bibliotheken ist eine großartige Idee. Ich denke, dieses Problem wurde bereits woanders gelöst. Mabi weiß jemand, ohne dass ich ein paar Minuten oder sogar Stunden mit Google verbringe. – nottinhill

Antwort

1

VT100-Steuercodes:

input("something:") 
print('\x1b[1A\x1b[2K\x1b[1A') 
input("something else:") 

Es muss etwas ähnliches für Fenster sein.

+0

Danke @xvan, diese funktionieren super für meine Zwecke - http://www.ccs.neu.edu/research/gpc/MSim/vona/terminal/VT100_Escape_Codes.html – nottinhill

1

Ich bin nicht sicher, ob ich Ihre Frage vollständig verstehe, aber ich denke, dass es erreicht werden kann, indem Sie die Konsole löschen und den 'Rahmen' neu zeichnen. How to clear the interpreter console?

+0

ok redraw und irgendeine Art von noecho dann ...? – nottinhill

1

Wenn es in Ordnung wäre, die Eingabe unter der Konsole zu belassen, könnten Sie eine Klasse verwenden, um Ihre Zeichenfläche in einem Array zu belassen und sie nur bei Bedarf zu rendern. Hier

ein Beispiel:

#X-Drawer 
class Canvas: 
    def __init__(self, w, h): 
     self.w = w 
     self.h = h 
     self.c = [] 
     for i in range(w * h): 
      self.c.append(' ') 
     print len(self.c) 
    def render(self): 
     u = 0 
     s = "" 
     for i in range(len(self.c)): 
      s += self.c[i] 
      if not i % self.w: 
       s += "\n" 
     print s 
    def drawX(self, x, y): 
     n = [(x, y), (x + 1, y + 1), (x + 2, y + 2), (x + 2, y), (x, y + 2)] 
     for i in n: 
      v = i[0] * self.w + i[1] 
      if v < len(self.c): 
       self.c[v] = 'X' 
    def drawLine(self, x, d): 
     n = [] 
     if d: 
      n = [(x, y), (x + 1, y + 1), (x + 2, y + 2)] 
     else: 
      n = [(x, y), (x + 1, y + 1), (x + 2, y + 2)] 
     for i in n: 
      v = i[0] * self.w + i[1] 
      if v < len(self.c): 
       self.c[v] = 'X' 

def clearScreen(): 
    for i in range(64): 
     print 

c = Canvas(25, 25) 

while True: 
    clearScreen() 
    c.render() 
    i = raw_input("Coordinates: ").split() 
    c.drawX(int(i[0]), int(i[1])) 

Sie könnten auch die Clear mit einem o Aufruf clr ersetzen (How to clear the interpreter console?) statt 64 Zeilen zu drucken.

Hinweis: In meinem Beispiel wird die Funktion drawX verwendet. Sie können die Funktion drawLine und verschiedene Koordinaten verwenden, um die Linien zu zeichnen.

Verwandte Themen