¿Cómo obtener una entrada del usuario en Pygame y guardarla como una variable?

Mi idea es que quiero tomar alguna información del usuario en el juego como el nombre del usuario, luego quiero ponerlo en la pantalla. Tal vez antes de comenzar el juego o la mitad del juego, importa.

Intenté InputBox, etc. pero no funciona en realidad, probé algunos de los módulos similares pero ninguno de ellos funcionó , algunos de ellos simplemente escribieron mi texto en la pantalla, eso es todo, lo que quiero es tomar esa entrada y poner algunos lugares. en la pantalla de pygame.

Así que tengo que guardar esa entrada como una variable . ¿Hay alguna forma posible de hacer esto?

Ejemplo:

font1 = pygame.font.SysFont("None", 30) score=0 text=font1.render("{}".format(score), True,(255,255,255)) ... ... if sneakeattheapple: score += 1 text=font1.render("{}".format(score), True,(255,255,255)) ... ... screen.blit(text,(275,6)) 

Esto va a poner la variable de puntuación en la pantalla, luego, cuando quiero actualizar la puntuación como en el juego de serpientes, cuando sneak coma la manzana puedo actualizar el texto para poder actualizar la variable de puntuación. Pero esta variable de puntuación ya está definida, quiero para hacer eso con una variable dada por el usuario.

EDIT : Ya verifico todas las respuestas y preguntas en SO, eso no es lo que estoy preguntando y lo que quiero. Hay algunas formas de imprimir esas variables, esto no es lo que quiero como dije. Detectar eventos del teclado e imprimirlos no forma parte de mi pregunta. Di el ejemplo con “nombre”, pero ESTA pregunta no tiene relación con mi pregunta

EDIT 2: Déjame ser más claro. En Python podemos hacer esto;

 x=input("Do you want to do this?(y/n): ") if x=="y": #do something if x=="n": #do something 

Y podemos preguntar esto cuando queramos, donde sea que queramos … Esto es lo que quiero hacer en Pygame.

Actualmente estoy asumiendo que esta función trabajada con su progtwig es exitosa y no genera errores. Aquí hay una función en el enlace que nos dio:

 def ask(screen, question): "ask(screen, question) -> answer" pygame.font.init() current_string = [] display_box(screen, question + ": " + string.join(current_string,"")) while 1: inkey = get_key() if inkey == K_BACKSPACE: current_string = current_string[0:-1] elif inkey == K_RETURN: break elif inkey == K_MINUS: current_string.append("_") elif inkey <= 127: current_string.append(chr(inkey)) display_box(screen, question + ": " + string.join(current_string,"")) return string.join(current_string,"") 

Parece que esta es la forma en que obtienes información de un usuario con una pantalla de pygame, ¿no? Veamos la línea 4 de esta función:

 current_string = [] 

Las cosas que el usuario escribe se almacenan en esta lista. Suponiendo que sepa cómo tomar una cadena y ponerla en la pantalla, podría guardar la cadena de esta manera:

 string_input = ''.join(current_string) 

Si puedes realizar una función similar (si esta no funciona), ¡puedes hacer lo mismo! Simplemente guarde el primer elemento en la lista que contiene la cadena en una variable como se muestra arriba. Si tiene algún problema, por favor comente para que pueda editar mi respuesta.
A la siguiente parte ahora. Simplemente puede activar esta función en cualquier momento. Es posible que desee activar cuando algo sucede. Un ejemplo es cuando la serpiente se come la manzana. Probablemente tienes una función para eso, creo. Puedes hacer una variable como esta:

 Eat = 0 

Y poner en esa función. Cuando esa variable es igual a 0. Nada realmente activa la otra función. Cuando la serpiente se come la manzana, restablece la variable a 1 y luego activa la función de esta manera:

 if Eat = 0: someclassname.ask() 

Lo haces con muchas otras ocasiones. Espero que esto sea más claro y más útil!

No hay nada cocido en Pygame para esto. Tendrá que usar una biblioteca de GUI de terceros o comstackrla usted mismo. Ejemplo: si el cuadro de texto tiene el foco, tome todos los eventos de keydown y agregue a una cadena. Cada cuadro, dibuja un cuadro, luego dibuja la cuerda en la parte superior.

Construir uno simple no debería ser tan difícil, pero si quieres uno más completo, es probable que sea más fácil usar una biblioteca.

¿Ha intentado obtener eventos clave y luego juntarlos para formar algo? Podrías poner algo como esto dentro de tu bucle principal del juego.

 input = '' for event in pygame.event.get(): if event.type == pygame.KEYDOWN: if event.key == pygame.K_ESCAPE: playing = False if event.key == pygame.K_w: input = input + "w" if event.key == pygame.K_s: input = input + "s" if event.key == pygame.K_a: input = input + "a" 

Luego puede verificar cuándo el usuario ha terminado con la entrada (botón / tecla de ingreso) y finalizar la variable. Con esto, es posible que se encuentre con un problema en el que la tecla se mantenga presionada por más tiempo, por lo que obtiene 3 palabras por solo presionar el botón una vez. Si este es el caso, puede 1. no permitir otra entrada hasta que haya transcurrido cierto tiempo (.25 s ¿quizás?) O 2. usar pygame.KEYUP en lugar de pygame.KEYDOWN y verificar exclusivamente los golpes.

Aquí hay una posible solución, puede ser realmente útil para futuros visitantes que también están sufriendo con este problema como yo. Cual es;

Primero haciendo una función de renderizado de texto.

 def text1(word,x,y): font = pygame.font.SysFont(None, 25) text = font.render("{}".format(word), True, RED) return screen.blit(text,(x,y)) 

Entonces una función funciona como input ;

 def inpt(): word="" text1("Please enter your name: ",300,400) #example asking name pygame.display.flip() done = True while done: for event in pygame.event.get(): if event.type==pygame.QUIT: pygame.quit() quit() if event.type == pygame.KEYDOWN: if event.key == pygame.K_a: word+=str(chr(event.key)) if event.key == pygame.K_b: word+=chr(event.key) if event.key == pygame.K_c: word+=chr(event.key) if event.key == pygame.K_d: word+=chr(event.key) if event.key == pygame.K_RETURN: done=False #events... return text1(word,700,30) 

Como puede ver, esta función captura eventos de teclado, también tiene su propio bucle while, es importante. Rompo el bucle cuando if event.key == pygame.K_RETURN: done=False botón Enter que es if event.key == pygame.K_RETURN: done=False . Luego regresando nuestra palabra con función text1 , desplegando. Se pueden configurar otros eventos del curso según la opinión, como el botón de espacio para un hueco, etc.

Entonces, en realidad tenemos que hacer una función de intro y le preguntaremos el nombre del usuario allí, por ejemplo, cuando la función de intro se hace, el nombre se establece en la pantalla hasta que finaliza el juego.

 def game_intro(): intro=True while intro: for event in pygame.event.get(): if event.type==pygame.QUIT: pygame.quit() quit() if event.type==pygame.KEYDOWN: if event.key==pygame.K_RETURN: intro=False inpt() #Here we are calling our function screen.fill(white) pygame.display.update() clock.tick(15) 

Vea que rompemos este bucle con el botón Enter nuevamente. Así que le haremos al usuario nuestra pregunta en la introducción, luego la pondremos en la pantalla, por ejemplo, en la esquina superior derecha.

Para hacer que un usuario ingrese algo escribe

 variable = input() 

Ahora un usuario puede escribir algo para que haga algo.

 if variable = ('input'): print('the input works') 

Ahora, si escribo entrada, dirá que la entrada funciona