Foro de elhacker.net

Programación => Scripting => Mensaje iniciado por: Yidu en 5 Junio 2017, 13:50 pm



Título: Simular la salida de un ciclo FOR con pygame [PYTHON]
Publicado por: Yidu en 5 Junio 2017, 13:50 pm
Hola de nuevo!

Quizás recomendaríais otro tipo de modulo para este tipo de impresiones. Bueno, me refiero a mostrar gráficas y salida de datos. Pygame se suele utilizar para el tema de videojuegos y multimedia. Algo tan simple como mostrar la salida de un ciclo FOR (u otras salidas de datos) no  me llegaba a aclarar. En todo caso, me gustaría saber vuestra opinión, si es la forma correcta de hacer esta implementación.

Creo un ciclo para mostrar 40 números. Pero como llega un momento que la ventana definida en pygame se queda pequeña, hemos de crear otra columna para que se muestre el resto de números. Lo ideal seria que se creasen tantas columnas como números del ciclo. Claro esta que llegaría un momento que también se llegaría al limite de esa misma ventana ¿Se debería crear una nueva ventana y perderíamos la anterior? ¿Pygame no tiene la barra de desplazamiento como las ventanas de windows?

Os dejo el código que he creado:
(Es un esquema básico o plantilla para mostrar el ejemplo)

Código
  1. import pygame
  2. import sys
  3. pygame.init()
  4.  
  5. pantalla = pygame.display.set_mode((800, 600))
  6. fuente = pygame.font.SysFont('Comic Sans MS', 20, True, False)
  7.  
  8. while True:
  9.  
  10.    for evento in pygame.event.get():
  11.        if evento.type == pygame.QUIT:
  12.            pygame.quit()
  13.            sys.exit()            
  14.  
  15.    pantalla.fill((255, 255, 255))
  16.  
  17.    # Coordenadas iniciales impresion de columnas
  18.    y = 0
  19.    x = 0
  20.    for numero in range(1, 41):        
  21.        imprime_numero = fuente.render(str(numero), True, (0, 0, 0))
  22.        pantalla.blit(imprime_numero, (x, y))
  23.        y += 20
  24.        # Si la coordenada 'y' llega a 400 se crea una nueva columna
  25.        if y == 400:
  26.            x = 40
  27.            y = 0                  
  28.  
  29.    pygame.display.flip()


Si lo ejecutáis se crea una columna del 1 al 20 y otra del 21 al 40.
¿Es la forma correcta de imprimir un ciclo FOR en pygame?

Saludos!

EDITO:

Con esta modificación en la linea 26 se crean mas columnas en base a mas números en el ciclo:
Código
  1. x += 40


Título: Re: Simular la salida de un ciclo FOR con pygame [PYTHON]
Publicado por: tincopasan en 11 Junio 2017, 19:21 pm
Como ya hay muchas vistas y los que más saben no te han contestado, me tomo el atrevimiento de hacerlo:
1)
Citar
Quizás recomendaríais otro tipo de modulo para este tipo de impresiones
Efectivamente,pygame está pensado para otras cosas, es como querer cocinar sobre un motor de auto porque este se calienta.
2)
Citar
¿Pygame no tiene la barra de desplazamiento como las ventanas de windows?
pygame no tiene ni la ventana! por eso la definis cuando la creas, de la misma forma podés implementar una barra de desplazamiento, creándola!
3)
Citar
Si lo ejecutáis se crea una columna del 1 al 20 y otra del 21 al 40.
¿Es la forma correcta de imprimir un ciclo FOR en pygame?
no existen formas correctas o incorrectas, solo distintas
4)
Citar
Claro esta que llegaría un momento que también se llegaría al limite de esa misma ventana ¿Se debería crear una nueva ventana y perderíamos la anterior? 
Siempre podrías guardar los datos y si cambias de ventanas(o redibujar) poner lo que quieras.
5)en lo particular redibujaría la pantalla con los datos y columnas que quiera para que no se llene y simular un desplazamiento, algo así:
Código
  1. #-*- coding:utf -8 -*-
  2. import pygame
  3. class Lugar:
  4.    total_lugares = 20
  5.    numeros=list(range(1,51))
  6.    inicio=0
  7.    final=total_lugares
  8.    maximo=len(numeros) -total_lugares +1
  9.  
  10.    def lista(self):
  11.        x=0
  12.        y=0        
  13.        for i in range(Lugar.total_lugares):
  14.            texto = fuente.render(str(Lugar.numeros[i]), 0, (255,255,255 ))
  15.            pantalla.blit(texto,(x,y))
  16.            y+=20
  17.    def arriba(self):
  18.        x=0
  19.        y=0
  20.        if Lugar.inicio < Lugar.maximo - 1:
  21.            Lugar.inicio+=1
  22.            Lugar.final+=1
  23.            parcial=Lugar.numeros[Lugar.inicio:Lugar.final]
  24.            pantalla.fill((0,0,0))
  25.            for i in range(Lugar.total_lugares):
  26.                texto = fuente.render(str(parcial[i]), 0, (255,255,255 ))
  27.                pantalla.blit(texto,(x,y))
  28.                y+=20
  29.  
  30.  
  31.    def abajo(self):
  32.        x=0
  33.        y=0        
  34.  
  35.        if Lugar.inicio > 0 :
  36.            Lugar.inicio-=1
  37.            Lugar.final-=1
  38.            parcial=Lugar.numeros[Lugar.inicio:Lugar.final]
  39.            pantalla.fill((0,0,0))
  40.            for i in range(Lugar.total_lugares):
  41.                texto = fuente.render(str(parcial[i]), 0, (255,255,255 ))
  42.                pantalla.blit(texto,(x,y))
  43.                y+=20
  44.  
  45. pygame.init()
  46. dimension=(800,600)
  47. pantalla = pygame.display.set_mode(dimension)
  48. fuente = pygame.font.SysFont('Comic Sans MS', 20, True, False)
  49. salir=False
  50. reloj=pygame.time.Clock()
  51.  
  52. lugar1=Lugar()
  53. lugar1.lista()
  54. while salir != True :
  55.    for evento in pygame.event.get():
  56.        if evento.type == pygame.KEYDOWN:
  57.            if evento.key == pygame.K_DOWN:
  58.                lugar1.arriba()
  59.            if evento.key == pygame.K_UP:
  60.                lugar1.abajo()
  61.  
  62.        if evento.type == pygame.QUIT:
  63.            salir=True
  64.    reloj.tick(20)
  65.  
  66.    pygame.display.update()
  67.  

por supuesto hay muchas otras formas de hacerlo
6)como dije antes se puede hacer con gráficos, no solo con las teclas de arriba y abajo, pero ese sería otro tutorial o te toca realizarlo solo.
Saludos


Título: Re: Simular la salida de un ciclo FOR con pygame [PYTHON]
Publicado por: Yidu en 12 Junio 2017, 19:20 pm
Pues muchas gracias por todas las explicaciones. La verdad es que escogí Pygame para practicar un poco la POO. Aunque claro, también se puede practicar este paradigma con la consola o un editor.

Supongo que para iniciarse con una GUI recomendarías tkinter ¿No? Mas que nada por el ejemplo con el que abrí el post. 

De todas formas estudiare el código que has posteado. Que seguro me servirá para seguir aprendiendo. Un saludo!


Título: Re: Simular la salida de un ciclo FOR con pygame [PYTHON]
Publicado por: tincopasan en 12 Junio 2017, 23:40 pm
si vas a hacer gui simples, para empezar tkinter está bien, pero si tu idea es ahcer algo mejor, más profesional, ni pierdas tiempo con esa huevada y comenzá directamente aprendiendo pyqt