Texto multilinea en pygame

Agrupa todas las consultas sobre los lenguajes de programacion como C, C++, Python, Java ...

Texto multilinea en pygame

Notapor cadrogui » Mar Dic 18, 2007 5:58 pm

holas, estoy trabajando con pygame y encontre genial la implementacion que tiene para renderizar textos usando TTF, pero solamente he podido dibujar textos de una sola linea, alguien me podria ayudar a dibujar textos multilineas, he tratado de la siguiente manera:

'una\ncadena'

pero en el interprete python me funciona, pero en pygame no pasa nada, alguien me puede dar un cable por favor!!!!!

salu2
cadrogui
 
Mensajes: 5
Registrado: Mié Dic 05, 2007 10:23 pm

Notapor hugoruscitti » Mar Dic 18, 2007 7:00 pm

Saludos, existe una función externa a pygame que tal vez
te resulte útil para esto:

http://www.pygame.org/pcr/text_rect/index.php

la función se llama "render_textrect", y además de interpretar
saltos de linea con "\n" ajusta tu texto al área de un rectángulo.
He aquí una imagen del programa funcionando:

Imagen

Saludos.
Avatar de Usuario
hugoruscitti
Site Admin
 
Mensajes: 1242
Registrado: Dom Jul 30, 2006 3:57 am
Ubicación: Buenos Aires, Argentina

Notapor cadrogui » Mar Dic 18, 2007 9:07 pm

gracias por la respuesta. he escrito la siguiente funcion, y en la terminal me muestra "none" de forma infinita hasta q se cierra el programa, alguien sabe por que?

Código: Seleccionar todo
def DIB_TXT(TEXT, TAMANO, X_COOR, Y_COOR, COLOR, FUENTE):
   
   if COLOR == 'NEGRO':
      COLOR_T = (0,0,0)
   elif COLOR == 'BLANCO':
      COLOR_T = (255,255,255)
   elif COLOR == 'ROJO':
      COLOR_T = (255,0,0)
   elif COLOR == 'VERRDE':
      COLOR_T = (0,255,0)
   elif COLOR == 'AZUL':
      COLOR_T = (0,0,255)
   elif COLOR == 'AMARILLO':
      COLOR_T = (255,255,0)
   elif COLOR == 'CYAN':
      COLOR_T = (0,255,255)
   elif COLOR == 'MAGNETA':
      COLOR_T = (255,0,255)
   
   # SELECCCIONAMOS LA FUENTE ELEGIDA.
   
   if FUENTE == 1:
      FUENTE_T = 'FGAaron.ttf'
   elif FUENTE == 2:
      FUENTE_T = 'font.ttf'
   elif FUENTE == 3:
      FUENTE_T = 'hak.ttf'
   elif FUENTE == 4:
      FUENTE_T = 'HermanDecanus.TTF'
   elif FUENTE == 5:
      FUENTE_T = 'horros.ttf'
   elif FUENTE == 6:
      FUENTE_T = 'Inhishan.ttf'
   elif FUENTE == 7:
      FUENTE_T = 'Inmyc.ttf'

   # LOS TEXTOS SON RENDERIZADOS CON FUENTES TTF QUE DEBEN ESTAR UBICADAS EN
   # UNA CARPETA LLAMADA "FUENTES", DONDE FONT.TTF ES EL ARCHIVO POR DEFECTO
   
   pygame.font.init()
   ruta_ttf = os.path.join('fuentes', FUENTE_T)
   fuente = pygame.font.Font(ruta_ttf, TAMANO)
   texto = fuente.render(TEXT, 1, COLOR_T)
   screen.blit(texto, (X_COOR,Y_COOR))


print DIB_TXT('Texto de prueba.', 28, 200, 430, 'BLANCO', 6)


voy a trata de habilitar la opcion de dividir la cadena para q sea multilinea, o bien agregar las funcionalidades de mi funcion a la otra.


salu2
cadrogui
 
Mensajes: 5
Registrado: Mié Dic 05, 2007 10:23 pm

Notapor Dokan » Mar Dic 18, 2007 9:15 pm

Prueba también con el formato habitual para textos multilínea de python, que son las comillas triples tal y como sigue:
""" este texto saldría por consola respetando

todos los saltos de línea, así como "" / @ # % etc (si no me equivoco)"""

no se si te valdrá para lo que necesitas hacer en pygame, pero por probar...
si quieres más info echa un vistazo al apartado 3.1.2 del manual oficial de python.
ya nos contarás si te sirve!!
Avatar de Usuario
Dokan
 
Mensajes: 143
Registrado: Lun Dic 03, 2007 10:40 pm

Notapor hugoruscitti » Jue Dic 20, 2007 2:46 am

cadrogui escribió:gracias por la respuesta. he escrito la siguiente funcion, y en la terminal me muestra "none" de forma infinita hasta q se cierra el programa, alguien sabe por que?

...



Saludos, por lo que veo está faltando algo de código para ver el programa
funcionando (o ver si está fallando).

Agregué algo de ese código que falta para ver tu función y note dos cosas
para comentar:

1 - para invocar al código de una función alcanza con escribir su nombre
y los argumentos, en este caso:

Código: Seleccionar todo
DIB_TXT('Texto ...', ...)


en tu código escribes:

Código: Seleccionar todo
print DIB_TXT('Texto ...', ...)


la sentencia "print" que está a la izquierda significa que le pides a
python que imprima por consola el retorno de la función "DIB_TXT", y como
en el código de la función "DIB_TXT" no hay ningún retorno (usando "return
algo", entonces python devuelve "None".

Como nos comentas que el programa imprime muchas veces "None", seguramente
tu programa está dentro de un bucle ("while" por ejemplo), y eso hace
que python ejecute muchas veces la sentencia "print"... puedes quitar la
sentencia 'print' y listo.

2 - Otro asunto es "¿cual es el contexto de esa función?", es decir,
"¿que hay alrededor de esa función?". Está bien el código de la función,
pero los cambios no se verán en pantalla hasta que ejecutes una sentencia
como "pygame.display.flip()"... ¿has colocado esta sentencia en alguna
parte del programa después de imprimir?, posiblemente ese sea el problema
original.


Luego estuve viendo como hacer para imprimir texto en varias lineas, y
escribí un código similar al tuyo añadiendo esta funcionalidad y quitando
otras:

Imagen

Código: Seleccionar todo
# -*- encoding: utf-8 -*-
import pygame

def imprimir_texto(screen, texto, x, y, color, fuente):
    # separa el texto en elementos de una lista
    # ejemplo: convierte "hola \n mundo" en ["hola ", " mundo"]
    texto_en_lineas = texto.split('\n')

    # un bucle que itera por cada una de las lineas del texto
    for linea in texto_en_lineas:
        nueva = fuente.render(linea, 1, color)

        # imprime en pantalla (se debe ejecutar pygame.display.flip() luego)
        screen.blit(nueva, (x, y))

        # reduce la altura de la coordenada vertical, para luego volver
        # a imprimir la siguiente linea de texto mas abajo.
        y += nueva.get_height()


def main():
    pygame.font.init()
    screen = pygame.display.set_mode((320, 240))

    fuente = pygame.font.Font(None, 25)
    verde = (90, 255, 90)
    texto = " Hola, \n este es un texto \n escrito en varias lineas."
    imprimir_texto(screen, texto, 10, 10, verde, fuente)

    # Importate: muestra los cambios en pantalla, sin esta sentencia
    # la pantalla permanecerá de color 'negro'.
    pygame.display.flip()

    # detiene el programa durante 4 segundos antes de cerrar la ventana.
    pygame.time.wait(4000)


if __name__ == '__main__':
    main()


parece mucho código, pero gran parte de todo ello son comentarios...


Por último, quisiera hacer una recomendación general acerca del código:
Es una buena idea ir construyendo el programa
paso a paso, de lo mas simple a lo mas complejo. En este caso puedes
escribir primero una función que imprima texto en una sola linea y de
un solo color; luego, si funciona bien, agregarle la posibilidad de imprimir
en diferentes colores, y si funciona bien, agregar la posibilidad de alterar
la tipografía y así... luego podrás ir implementando muchas cosas mas.

En tu función noté que tienes muchas cosas ya implementadas: colores,
tipografías y tamaños variables. El problema de hacer todo esto junto, está
en que si algo falla, te costará más tiempo saber "qué" está fallando.
En cambio, si haces la función paso por paso, probando los cambios cada vez,
encontrarás el motivo de cualquier fallo de manera inmediata. Python se adapta
muy bien a esta forma de trabajar: editar, probar, editar de nuevo...
inténtalo, es incluso mas divertido y constructivo que escribir todo el
código primero y luego ver que ocurre. Esto evita esa sensación de no
"encontrar" el motivo de un error durante mucho tiempo y detenerse.

Saludos.
Avatar de Usuario
hugoruscitti
Site Admin
 
Mensajes: 1242
Registrado: Dom Jul 30, 2006 3:57 am
Ubicación: Buenos Aires, Argentina

Notapor cadrogui » Vie Dic 21, 2007 2:15 am

super buena la funcion, funciona de maravilla, respecto del None, tenias razon estaba demas el Print.. jjejjeje

salu2 y gracias.

adapto el code y lo muestro.
cadrogui
 
Mensajes: 5
Registrado: Mié Dic 05, 2007 10:23 pm

Notapor cadrogui » Vie Dic 21, 2007 6:13 am

ok , la funcion terminada funcionando..


Código: Seleccionar todo
# FUNCION PARA DIBUJAR TEXTO EN PANTALLA.
# LISTA DE COLORES
# http://www.miliuco.net/docs/rgb.htm

def DIB_TXT(SCREEN, TEXT, TAMANO, X_COOR, Y_COOR, COLOR, FUENTE):
   
   if COLOR == 'NEGRO':
      COLOR_T = (0,0,0)
   elif COLOR == 'BLANCO':
      COLOR_T = (255,255,255)
   elif COLOR == 'ROJO':
      COLOR_T = (255,0,0)
   elif COLOR == 'VERRDE':
      COLOR_T = (0,255,0)
   elif COLOR == 'AZUL':
      COLOR_T = (0,0,255)
   elif COLOR == 'AMARILLO':
      COLOR_T = (255,255,0)
   elif COLOR == 'CYAN':
      COLOR_T = (0,255,255)
   elif COLOR == 'MAGNETA':
      COLOR_T = (255,0,255)
   
   # SELECCCIONAMOS LA FUENTE ELEGIDA.
   
   if FUENTE == 1:
      FUENTE_T = 'FGAaron.ttf'
   elif FUENTE == 2:
      FUENTE_T = 'font.ttf'
   elif FUENTE == 3:
      FUENTE_T = 'hak.ttf'
   elif FUENTE == 4:
      FUENTE_T = 'HermanDecanus.TTF'
   elif FUENTE == 5:
      FUENTE_T = 'horros.ttf'
   elif FUENTE == 6:
      FUENTE_T = 'Inhishan.ttf'
   elif FUENTE == 7:
      FUENTE_T = 'Inmyc.ttf'

   # LOS TEXTOS SON RENDERIZADOS CON FUENTES TTF QUE DEBEN ESTAR UBICADAS EN
   # UNA CARPETA LLAMADA "FUENTES", DONDE FONT.TTF ES EL ARCHIVO POR DEFECTO
   
   texto_en_lineas = TEXT.split('\n')

      for linea in texto_en_lineas:
           
       ruta_ttf = os.path.join('fuentes', FUENTE_T)
       fuente = pygame.font.Font(ruta_ttf, TAMANO)
       nueva = fuente.render(linea, 1, COLOR_T)             
           SCREEN.blit(nueva, (X_COOR,Y_COOR))
       Y_COOR += nueva.get_height() 



gracias por la ayuda.
cadrogui
 
Mensajes: 5
Registrado: Mié Dic 05, 2007 10:23 pm


Volver a Sobre lenguajes de programación

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado

cron