Как я могу создать поле ввода текста с помощью Pygame?
Я хочу получить некоторый ввод текста от пользователя на Python и отобразить то, что он вводит в текстовом поле, и когда он нажимает enter, это сохраняется в виде строки.
Я искал везде, но просто ничего не могу найти. Я использую Pygame.
Переведено автоматически
Ответ 1
Вы можете определить прямоугольник как область поля ввода. Если происходит pygame.MOUSEBUTTONDOWN событие, используйте colliderect метод input_box rect, чтобы проверить, не сталкивается ли оно с event.pos, а затем активируйте его, установив для active переменной значение True.
Если поле активно, вы можете ввести что-нибудь, и Pygame сгенерирует pygame.KEYDOWN события, у которых есть unicode атрибут, который вы можете просто добавить к строке, например, text += event.unicode. Если пользователь нажимает enter, вы можете что-то сделать со text строкой (в примере я просто печатаю ее) и сбросить ее на ''.
import pygame as pg
defmain(): 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
whilenot 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()
Вот объектно-ориентированный вариант, который позволяет вам легко создавать несколько полей ввода:
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
defhandle_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)
defupdate(self): # Resize the box if the text is too long. width = max(200, self.txt_surface.get_width()+10) self.rect.w = width
defdraw(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)
Используйте KEYDOWN событие для получения ввода с клавиатуры (см. pygame.event). Нажатую клавишу можно получить из key атрибута pygame.event.Event объекта. unicode содержит строку из одного символа, которая является полностью переведенным символом. Добавьте символ в текст при нажатии клавиши. Необходимо иметь дело с двумя специальными клавишами. Если RETURN нажата, ввод завершен. Если BACKSPACE нажата, последний символ вводимого текста должен быть удален:
font = pygame.font.SysFont(None, 100) text = "" input_active = True
run = True while run: clock.tick(60) for event in pygame.event.get(): if event.type == pygame.QUIT: run = False elif event.type == pygame.MOUSEBUTTONDOWN: input_active = True text = "" elif event.type == pygame.KEYDOWN and input_active: if event.key == pygame.K_RETURN: input_active = False elif event.key == pygame.K_BACKSPACE: text = text[:-1] else: text += event.unicode
text_input_box = TextInputBox(50, 50, 400, font) group = pygame.sprite.Group(text_input_box)
run = True while run: clock.tick(60) event_list = pygame.event.get() for event in event_list: if event.type == pygame.QUIT: run = False group.update(event_list)
from pygame.rect import Rect from pygame_gui.elements.ui_text_entry_line import UITextEntryLine text_input = UITextEntryLine(relative_rect=Rect(0, 0, 100, 100), manager=manager)
Получить текст, если нажать enter:
for event in pygame.event.get(): if event.type == pygame.USEREVENT: if event.user_type == pygame_gui.UI_TEXT_ENTRY_FINISHED: if event.ui_element == text_input: entered_text = event.text