Foro de elhacker.net

Programación => Scripting => Mensaje iniciado por: patilanz en 3 Agosto 2015, 11:09 am



Título: [Python] Imprimir mas rápido
Publicado por: patilanz en 3 Agosto 2015, 11:09 am
Hola tengo este codigo:

Código
  1. from os import system
  2. from msvcrt import getch
  3. import colorama
  4. from colorama import Fore
  5. import json
  6.  
  7. colorama.init()
  8.  
  9. maxX = 80
  10. maxY = 40
  11.  
  12. system('mode 80,40')
  13. class posistion:
  14. def __init__(self):
  15. self.x = 0
  16. self.y = 1
  17. def addX(self,v = 1):
  18. if self.x < maxX - 1:
  19. self.x += v
  20. if self.x < 0:
  21. self.x = 0
  22. return self.x
  23. else:
  24. return -1
  25. def addY(self,v = 1):
  26. if self.y < maxY - 1:
  27. self.y += v
  28. if self.y < 1:
  29. self.y = 1
  30. return self.y
  31. else:
  32. return -1
  33. class cForSave:
  34. pass
  35.  
  36. def Mprint(m):
  37. r = '\n'
  38. for i,x in enumerate(m):
  39. for j,y in enumerate(x):
  40. if i == pos.y and j == pos.x:
  41. r += (Fore.RED + y)
  42. elif y == ' ':
  43. r += (Fore.WHITE + y)
  44. else:
  45. r += (Fore.WHITE + y)
  46. print r,
  47. #print pos.x,pos.y
  48.  
  49.  
  50. pos = posistion()
  51. matrix = [[' ' for x in range(1,maxX + 1)] for x in range(1,maxY + 1)]
  52. while True:
  53. c = getch()
  54. if c == '\000' or c == '\xe0':
  55. key = ord(getch())
  56. if key == 77: # right
  57. pos.addX()
  58. elif key == 75: # left
  59. pos.addX(-1)
  60. elif key == 80: # bottom
  61. pos.addY()
  62. elif key == 72: # top
  63. pos.addY(-1)
  64. elif c == '\t': # Save monster to file
  65. f = open('monster','w')
  66. s = cForSave()
  67. s.matrix = matrix
  68. s.pos = pos
  69. json.dump(s,f)
  70. f.close()
  71. system('cls')
  72. print 'Monster saved!'
  73. system('pause')
  74. elif c == '\r': # Load monster from file
  75. try:
  76. f = open('monster','r')
  77. s = json.load(f)
  78. matrix = s.matrix
  79. pos = s.pos
  80. except IOError:
  81. system('cls')
  82. print 'Monster file not found!'
  83. system('pause')
  84. else:
  85. matrix[pos.y][pos.x] = c
  86. system('cls')
  87.  
  88. Mprint(matrix)
  89.  
  90.  
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


Título: Re: [Python] Imprimir mas rápido
Publicado por: 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


Título: Re: [Python] Imprimir mas rápido
Publicado por: patilanz en 4 Agosto 2015, 13:45 pm
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
  1. def Mprint(m):
  2. r = '\n'
  3. for i,x in enumerate(m):
  4. for j,y in enumerate(x):
  5. if i == pos.y and j == pos.x:
  6. r += (Fore.RED + '\033[' + str(i) + ';' + str(j) + 'H' + y)
  7. elif y == ' ':
  8. r += (Fore.WHITE + '\033[' + str(i) + ';' + str(j) + 'H' + y)
  9. else:
  10. r += (Fore.WHITE + '\033[' + str(i) + ';' + str(j) + 'H' + y)
  11. print r,

Por ahora no se me ocurre otra cosa


Título: Re: [Python] Imprimir mas rápido
Publicado por: engel lex en 4 Agosto 2015, 13:48 pm
y si en lugar de borrar simplemente sobreescribes (y aagregas una cantidad x de espacios al final para sobreescribir en blanco el resto)


Título: Re: [Python] Imprimir mas rápido
Publicado por: Eleкtro en 4 Agosto 2015, 14:45 pm
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