python text pygame textinput

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 ) .