Hallo,
Ich habe mir ein Programm geschrieben, was die Konsole zeilenweise mit Text füllt. Sprich wenn x = 80, dann bitte in die nächste Zeile springen und wieder bei x = 0 anfangen. Das Programm funktioniert auch, nur gibt es leider ein kleines Problem:
Sobald der Scrollbalken in der Konsole ganz unten ist, füllt mein Programm nicht mehr schön wie sonst, Zeile für Zeile auf, sondern schreibt ab sofort nur noch alle Werte untereinander.
Ich hab mir überlegt, dass ich vielleicht mit
WConio.puttext(left, top, right, bottom, saved)
einfach so einen ganzen Text, wieder an die Stelle (0,0) setze und wieder "oben" weiter mache.
Aber gibt es vielleicht noch ne andere Möglichkeit? Irgendwie unterdrücken, dass der Scrollbalken unten anstößt irgend so was in der Art?
mfg,
qweet
Konsole und Scrollbalken
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
Kann es sein, dass du das Modul textwrap nachzubauen versuchst?
Poste doch bitte einen Code, ich kann dein Problem nicht wirklich nachvollziehen.
Poste doch bitte einen Code, ich kann dein Problem nicht wirklich nachvollziehen.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
okay ich versuche es nochmal ein bischen verständlicher zu erklären. Code wird nicht viel helfen, da es relativ viel Code ist, viele Verschachtelungen und Variablen mit + oder - irgend einen Wert...schätze das würde kryptischer als mein obiger Erklärungsversuch
Also:
Mein Programm macht folgendes:
Es gibt Zeichen aus in der Konsole. Dies beginnt bei (0,0) also oben links und geht weiter bis (79,0) also oben rechts.
Weiter rechts kann das Programm nun keine Zeichen mehr setzen. Also muss es jetzt in die nächste Zeile springen. Also jetzt in die Zeile (0,1).
Jetzt beginnt das ganze wieder von vorne.
Also ganz simpel:
Es ist gewollt, dass y = y + 6, da ich die Zeichen "male"
Genau das funktioniert auch einwandfrei. Zeile um Zeile werden Zeichen gesetzt, es gibt überhaupt kein Problem. Bisher.
Jetzt habe ich jedoch vor, dass noch mehr Zeichen gesetzt werden. Getreu nach altem Schema.
Doch sobald der Scrollbalken in der Konsole ganz unten ist, klappt das nicht mehr. Ab sofort werden alle Zeichen untereinander gesetzt.
Genau das will ich aber nicht.
Hoffe das war verständlich genug.
mfg, qweet
Also:
Mein Programm macht folgendes:
Es gibt Zeichen aus in der Konsole. Dies beginnt bei (0,0) also oben links und geht weiter bis (79,0) also oben rechts.
Weiter rechts kann das Programm nun keine Zeichen mehr setzen. Also muss es jetzt in die nächste Zeile springen. Also jetzt in die Zeile (0,1).
Jetzt beginnt das ganze wieder von vorne.
Also ganz simpel:
Code: Alles auswählen
if x == 81: #Wenn x = 80, dann soll unter die obere Bildreihe gesprungen werden
x = 0
y = y + 6
Genau das funktioniert auch einwandfrei. Zeile um Zeile werden Zeichen gesetzt, es gibt überhaupt kein Problem. Bisher.
Jetzt habe ich jedoch vor, dass noch mehr Zeichen gesetzt werden. Getreu nach altem Schema.
Doch sobald der Scrollbalken in der Konsole ganz unten ist, klappt das nicht mehr. Ab sofort werden alle Zeichen untereinander gesetzt.
Genau das will ich aber nicht.
Hoffe das war verständlich genug.
mfg, qweet
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
Du musst warscheinlich statt print sys.stdout.write verwenden.
Ich denke es ist am besten wenn ich mir den Code ansehe, also poste ihn mal in Nopaste und schickt mir die URL per PN, wenn möglich. Ich hab' heute ausreichend Zeit
Code: Alles auswählen
import time, sys
while True:
for i in range(80):
sys.stdout.write('x')
time.sleep(0.01)
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Nicht wirklich. Wie gibst Du die Zeichen aus? Man kann nicht so einfach ein Zeichen an einer beliebigen Stelle in der Konsole ausgeben. Dazu braucht man ANSI Escapes oder eine Bibliothek wie `curses` oder `WinConio` (oder so ähnlich). Was benutzt Du?qweet hat geschrieben: Hoffe das war verständlich genug.
Und noch eine ganz dumme Frage: Was ist ein Zeichen? Spontan würde ich sagen das ist die kleinste Einheit die man in einer Textkonsole ausgeben kann, aber Dein Kommentar mit ``y += 6`` und dem "malen" von Zeichen verwirrt mich etwas.
- jens
- Python-Forum Veteran
- Beiträge: 8502
- Registriert: Dienstag 10. August 2004, 09:40
- Wohnort: duisburg
- Kontaktdaten:
Warum gibst du nicht einfach ein "\r" aus? [nicht mit print, also: sys.stdout.write( "\r" ) ! ] Dann wird die aktuelle Zeile gelöscht und dein "Statusbalken" fängt wieder von vorn an.qweet hat geschrieben:Code: Alles auswählen
if x == 81: #Wenn x = 80, dann soll unter die obere Bildreihe gesprungen werden
Wenn du den unterschied zwischen print und sys.stdout.write() noch nicht kennen solltest: http://www.python-forum.de/viewtopic.php?p=23004#23004
Wie sowas auch anders geht kannst du beim portscanner.py anschauen...
Eine nöch andere Lösung ist vielleicht http://www.python-forum.de/viewtopic.php?t=3140
Also erstmal danke für die Antworten. Der Codeschnipsel oben war ganz nützlich. Ich hoffe ich kann mein Problem jetzt besser beschreiben. Diesmal mit Code
Also, ganz einfach macht mein Programm folgendes:
Wenn ich das Programm in der Konsole laufen lasse, schreibt es, sobald der Scrollbalken ganz unten ist, die 'x' nur noch untereinander.
Jetzt mit sys.stdout.write:
Wenn der Scrollbalken ganz unten ist, werden zwar die Zeichen weiterhin nebeneinander geschrieben, jedoch wird nichmehr y um 6 erhöht.
Ich möchte jedoch, dass das Programm immer alle 6 Zeilen eine Reihe vollschreibt. Die alten Zeilen will ich nicht löschen, wenns geht.
mfg,
qweet
Edit (Leonidas): Code in Python-Tags gesetzt.
Also, ganz einfach macht mein Programm folgendes:
Code: Alles auswählen
import WConio
import time
x = 0
y = 0
while True:
WConio.gotoxy(x, y)
print('x')
time.sleep(0.01)
x = x + 1
if x == 80:
x = 0
y = y + 6
raw_input()
Jetzt mit sys.stdout.write:
Code: Alles auswählen
import WConio
import time, sys
x = 0
y = 0
while True:
WConio.gotoxy(x, y)
sys.stdout.write('x')
time.sleep(0.01)
x = x + 1
if x == 80:
x = 0
y = y + 6
raw_input()
Ich möchte jedoch, dass das Programm immer alle 6 Zeilen eine Reihe vollschreibt. Die alten Zeilen will ich nicht löschen, wenns geht.
mfg,
qweet
Edit (Leonidas): Code in Python-Tags gesetzt.
- jens
- Python-Forum Veteran
- Beiträge: 8502
- Registriert: Dienstag 10. August 2004, 09:40
- Wohnort: duisburg
- Kontaktdaten:
Ich glaube das Problem wird sein, das du nicht wirklich in Zeile 80 oder 81 schreiben kannst. Denn in dieser Zeile weiß die Konsole, das sie die Ausgaben um eine Zeile scrollen soll...
Du darfst also nur einmal in diese Zeile schreiben, dann wird um eine Zeile gescrollt und danach muß du halt bei Zeile 79 weiterschreiben...
Aber wieso benutzt du überhaupt WConio.gotoxy() ???
Es reicht doch einfach nur sys.stdout.write( "x" ) zu nutzten, also komplett ohne Positionierung:
Du darfst also nur einmal in diese Zeile schreiben, dann wird um eine Zeile gescrollt und danach muß du halt bei Zeile 79 weiterschreiben...
Aber wieso benutzt du überhaupt WConio.gotoxy() ???
Es reicht doch einfach nur sys.stdout.write( "x" ) zu nutzten, also komplett ohne Positionierung:
Code: Alles auswählen
for i in xrange(500):
sys.stdout.write( "x" )
time.sleep(0.1)
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
Siehe mein erster Post mit Code in diesem Threadjens hat geschrieben:Code: Alles auswählen
for i in xrange(500): sys.stdout.write( "x" ) time.sleep(0.1)
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Okay hab das mal versucht, so weit ich das verstanden habe.
Die letzte Zeile bei mir in der Konsole ist die 298.
Dann ist der Scrollbalken ganz unten.
Jetzt schreibe mit:
zwei Zeilen weiter unten drunter. Aber schon hier hab ich nen Fehler. Anstatt das 'O' an die (50, 300) zu setzen, setzt er bei mir das O an die (0, 300).
Das Vollschreiben der nächsten Zeile klappt dann auch nicht.
insgesamt der Code:
Das WConio.gotoxy(x, y), brauch ich, da ich in meinem richtigen Programm ja nicht nur ein Zeichen neben das andere setze, sondern größere, gemalte Zeichen neben einander setze. Und das mach ich dann halt mit print() und Gotoxy.
Das grundlegende Problem scheint mir, ist eher, dass WConio.gotoxy jenseits der 300. Zeile nicht mehr richtig funktioniert. Jedenfalls bei mir
mfg,
qweet
Die letzte Zeile bei mir in der Konsole ist die 298.
Dann ist der Scrollbalken ganz unten.
Jetzt schreibe mit:
Code: Alles auswählen
WConio.gotoxy(50, 300)
print('O')
Das Vollschreiben der nächsten Zeile klappt dann auch nicht.
insgesamt der Code:
Code: Alles auswählen
import WConio
import time
x = 0
y = 298
WConio.clrscr()
while True:
WConio.gotoxy(x, y)
print('x')
time.sleep(0.01)
x = x + 1
if x == 80:
x = 0
y = y + 1
WConio.gotoxy(50, 300)
print('O')
raw_input()
Das grundlegende Problem scheint mir, ist eher, dass WConio.gotoxy jenseits der 300. Zeile nicht mehr richtig funktioniert. Jedenfalls bei mir
mfg,
qweet
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
Nutze immer die WConIO FUnktionen, mische nicht WConIO mit print!
Code: Alles auswählen
import WConio
import time
x = 0
y = 298
WConio.clrscr()
while True:
WConio.gotoxy(x, y)
WConio.cputs('x')
time.sleep(0.01)
x = x + 1
if x == 80:
x = 0
y = y + 1
WConio.gotoxy(50, 300)
WConio.cputs('O')
raw_input()
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice