[Python] Imprimir mas rápido

Iniciado por patilanz, 3 Agosto 2015, 11:09 AM

0 Miembros y 1 Visitante están viendo este tema.

patilanz

Hola tengo este codigo:

Código (python) [Seleccionar]
from os import system
from msvcrt import getch
import colorama
from colorama import Fore
import json

colorama.init()

maxX = 80
maxY = 40

system('mode 80,40')
class posistion:
def __init__(self):
self.x = 0
self.y = 1
def addX(self,v = 1):
if self.x < maxX - 1:
self.x += v
if self.x < 0:
self.x = 0
return self.x
else:
return -1
def addY(self,v = 1):
if self.y < maxY - 1:
self.y += v
if self.y < 1:
self.y = 1
return self.y
else:
return -1
class cForSave:
pass

def Mprint(m):
r = '\n'
for i,x in enumerate(m):
for j,y in enumerate(x):
if i == pos.y and j == pos.x:
r += (Fore.RED + y)
elif y == ' ':
r += (Fore.WHITE + y)
else:
r += (Fore.WHITE + y)
print r,
#print pos.x,pos.y


pos = posistion()
matrix = [[' ' for x in range(1,maxX + 1)] for x in range(1,maxY + 1)]
while True:
c = getch()
if c == '\000' or c == '\xe0':
key = ord(getch())
if key == 77: # right
pos.addX()
elif key == 75: # left
pos.addX(-1)
elif key == 80: # bottom
pos.addY()
elif key == 72: # top
pos.addY(-1)
elif c == '\t': # Save monster to file
f = open('monster','w')
s = cForSave()
s.matrix = matrix
s.pos = pos
json.dump(s,f)
f.close()
system('cls')
print 'Monster saved!'
system('pause')
elif c == '\r': # Load monster from file
try:
f = open('monster','r')
s = json.load(f)
matrix = s.matrix
pos = s.pos
except IOError:
system('cls')
print 'Monster file not found!'
system('pause')
else:
matrix[pos.y][pos.x] = c
system('cls')

Mprint(matrix)


Funciona pero muy lento y la pantalla parpadea. Es mi segundo programa en python y no se me ocurrió otra manera. No se como modificar solo un carácter del terminal con python y no reescribir todo.

Un saludo

engel lex

no hay ninguna manera en que pueda probar que es lo que pasa... pero recomiendo usar el cls justo antes de la impresión para evitar el parpadeo
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

patilanz

Cita de: engel lex en  3 Agosto 2015, 11:16 AM
no hay ninguna manera en que pueda probar que es lo que pasa... pero recomiendo usar el cls justo antes de la impresión para evitar el parpadeo

El cls no mejora nada. También probé con imprimir cada carácter en su sitio pero veo que tarda todavía mas:

Código (python) [Seleccionar]
def Mprint(m):
r = '\n'
for i,x in enumerate(m):
for j,y in enumerate(x):
if i == pos.y and j == pos.x:
r += (Fore.RED + '\033[' + str(i) + ';' + str(j) + 'H' + y)
elif y == ' ':
r += (Fore.WHITE + '\033[' + str(i) + ';' + str(j) + 'H' + y)
else:
r += (Fore.WHITE + '\033[' + str(i) + ';' + str(j) + 'H' + y)
print r,


Por ahora no se me ocurre otra cosa

engel lex

y si en lugar de borrar simplemente sobreescribes (y aagregas una cantidad x de espacios al final para sobreescribir en blanco el resto)
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

Eleкtro

No necesitas limpiar el buffer con el comando CLS, ni tampoco hacer un "char-fill" con espacios.

Lee:
http://foro.elhacker.net/scripting/iquestcomo_obtener_una_combinacion_mediante_su_indice-t438670.0.html;msg2027398#msg2027398

PD: al menos podrías haber indicado cual es la finalidad de tu script, ¿noc crees?.

Saludos