Konsole und Scrollbalken

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
qweet
User
Beiträge: 119
Registriert: Freitag 2. September 2005, 21:26

Montag 12. September 2005, 16:40

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
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Montag 12. September 2005, 17:08

Kann es sein, dass du das Modul textwrap nachzubauen versuchst?

Poste doch bitte einen Code, ich kann dein Problem nicht wirklich nachvollziehen.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
qweet
User
Beiträge: 119
Registriert: Freitag 2. September 2005, 21:26

Montag 12. September 2005, 17:34

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:

Code: Alles auswählen

if x == 81:			#Wenn x = 80, dann soll unter die obere Bildreihe gesprungen werden
	x = 0
	y = y + 6
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
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Montag 12. September 2005, 17:48

Du musst warscheinlich statt print sys.stdout.write verwenden.

Code: Alles auswählen

import time, sys

while True:
    for i in range(80):
        sys.stdout.write('x')
        time.sleep(0.01)
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 8)
My god, it's full of CARs! | Leonidasvoice vs Modvoice
BlackJack

Montag 12. September 2005, 21:49

qweet hat geschrieben: Hoffe das war verständlich genug. :)
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?

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.
Benutzeravatar
jens
Moderator
Beiträge: 8483
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Dienstag 13. September 2005, 06:21

qweet hat geschrieben:

Code: Alles auswählen

if x == 81:			#Wenn x = 80, dann soll unter die obere Bildreihe gesprungen werden
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.

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

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
qweet
User
Beiträge: 119
Registriert: Freitag 2. September 2005, 21:26

Dienstag 13. September 2005, 12:34

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:

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()
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:

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()
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.
Benutzeravatar
jens
Moderator
Beiträge: 8483
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Dienstag 13. September 2005, 12:39

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:

Code: Alles auswählen

for i in xrange(500):
  sys.stdout.write( "x" )
  time.sleep(0.1)

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Dienstag 13. September 2005, 13:04

jens hat geschrieben:

Code: Alles auswählen

for i in xrange(500):
  sys.stdout.write( "x" )
  time.sleep(0.1)
Siehe mein erster Post mit Code in diesem Thread :roll:
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Gast

Dienstag 13. September 2005, 15:53

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:

Code: Alles auswählen

WConio.gotoxy(50, 300)
print('O')
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:

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 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 :D

mfg,
qweet
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Dienstag 13. September 2005, 17:59

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 Modvoice
Antworten