python - ¿Cómo crear un cuadro de entrada de texto con pygame?
textinput (2)
Puede definir un
rect
como el área del cuadro de entrada.
Si se produce un evento
pygame.MOUSEBUTTONDOWN
, use el método
input_box
de
input_box
rect para verificar si colisiona con
event.pos
y luego
event.pos
estableciendo una variable
active
en
True
.
Si el cuadro está activo, puede escribir algo y pygame generará eventos
pygame.KEYDOWN
que tienen un atributo
unicode
que simplemente puede agregar a una cadena, por ejemplo,
text += event.unicode
.
Si el usuario presiona Intro, puede hacer algo con la cadena de
text
(en el ejemplo que acabo de imprimir) y restablecerla a
''''
.
import pygame as pg
def main():
screen = pg.display.set_mode((640, 480))
font = pg.font.Font(None, 32)
clock = pg.time.Clock()
input_box = pg.Rect(100, 100, 140, 32)
color_inactive = pg.Color(''lightskyblue3'')
color_active = pg.Color(''dodgerblue2'')
color = color_inactive
active = False
text = ''''
done = False
while not done:
for event in pg.event.get():
if event.type == pg.QUIT:
done = True
if event.type == pg.MOUSEBUTTONDOWN:
# If the user clicked on the input_box rect.
if input_box.collidepoint(event.pos):
# Toggle the active variable.
active = not active
else:
active = False
# Change the current color of the input box.
color = color_active if active else color_inactive
if event.type == pg.KEYDOWN:
if active:
if event.key == pg.K_RETURN:
print(text)
text = ''''
elif event.key == pg.K_BACKSPACE:
text = text[:-1]
else:
text += event.unicode
screen.fill((30, 30, 30))
# Render the current text.
txt_surface = font.render(text, True, color)
# Resize the box if the text is too long.
width = max(200, txt_surface.get_width()+10)
input_box.w = width
# Blit the text.
screen.blit(txt_surface, (input_box.x+5, input_box.y+5))
# Blit the input_box rect.
pg.draw.rect(screen, color, input_box, 2)
pg.display.flip()
clock.tick(30)
if __name__ == ''__main__'':
pg.init()
main()
pg.quit()
Aquí hay una variante orientada a objetos que le permite crear fácilmente múltiples cuadros de entrada:
import pygame as pg
pg.init()
screen = pg.display.set_mode((640, 480))
COLOR_INACTIVE = pg.Color(''lightskyblue3'')
COLOR_ACTIVE = pg.Color(''dodgerblue2'')
FONT = pg.font.Font(None, 32)
class InputBox:
def __init__(self, x, y, w, h, text=''''):
self.rect = pg.Rect(x, y, w, h)
self.color = COLOR_INACTIVE
self.text = text
self.txt_surface = FONT.render(text, True, self.color)
self.active = False
def handle_event(self, event):
if event.type == pg.MOUSEBUTTONDOWN:
# If the user clicked on the input_box rect.
if self.rect.collidepoint(event.pos):
# Toggle the active variable.
self.active = not self.active
else:
self.active = False
# Change the current color of the input box.
self.color = COLOR_ACTIVE if self.active else COLOR_INACTIVE
if event.type == pg.KEYDOWN:
if self.active:
if event.key == pg.K_RETURN:
print(self.text)
self.text = ''''
elif event.key == pg.K_BACKSPACE:
self.text = self.text[:-1]
else:
self.text += event.unicode
# Re-render the text.
self.txt_surface = FONT.render(self.text, True, self.color)
def update(self):
# Resize the box if the text is too long.
width = max(200, self.txt_surface.get_width()+10)
self.rect.w = width
def draw(self, screen):
# Blit the text.
screen.blit(self.txt_surface, (self.rect.x+5, self.rect.y+5))
# Blit the rect.
pg.draw.rect(screen, self.color, self.rect, 2)
def main():
clock = pg.time.Clock()
input_box1 = InputBox(100, 100, 140, 32)
input_box2 = InputBox(100, 300, 140, 32)
input_boxes = [input_box1, input_box2]
done = False
while not done:
for event in pg.event.get():
if event.type == pg.QUIT:
done = True
for box in input_boxes:
box.handle_event(event)
for box in input_boxes:
box.update()
screen.fill((30, 30, 30))
for box in input_boxes:
box.draw(screen)
pg.display.flip()
clock.tick(30)
if __name__ == ''__main__'':
main()
pg.quit()
También hay módulos de terceros disponibles como pygame_textinput .
Quiero obtener algo de entrada de texto del usuario en python y mostrar lo que están escribiendo en un cuadro de texto, y cuando presionan Intro, se almacena en una cadena. He buscado por todas partes pero no puedo encontrar nada (estoy usando pygame)
Puede encontrar un gran módulo para la entrada de texto de pygame
pygame_textinput
.
Lo he estado usando por un tiempo y realmente me gusta.
En la descripción se incluye un tutorial sobre cómo usarlo.
Sin embargo, he agregado la posibilidad de dibujar un rectángulo (de color) alrededor del texto, agregando un parámetro
rect
y un parámetro
rect_color
a la función
__init __ ()
y agregando
if self.rect != None:
pygame.draw.rect(screen, self.rect_color, self.rect) #screen is my pygame display surface
a la función de actualización ( self, events ) .