본문 바로가기

pygame_phyics

pygame 입력 필드 만들기

pygame.key.start_text_input()

일단 이벤트로 받는데 그렇기 위해서는 게임 시작때 이것을 실행해야한다

 

입력 필드 예제:

class InputField:
    def __init__(self, size) -> None:
        self.image = pygame.Surface(size, pygame.SRCALPHA)
        self.image.fill((0, 0, 0, 255))
        self.font = pygame.font.SysFont("malgungothic", size[1])
        self.text = "" # 글자 원본 
        self.edit_pos = 0 # 수정하는 위치 / 깜박꺼리는 커서
        self.text_edit = False
        self.text_editing = "" # 한국어처럼 글자 편집하는 글자 
        
    def event(self, event):
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_BACKSPACE:
                self.text = self.text[:self.edit_pos-1] + self.text[self.edit_pos:]
                self.edit_pos = max(0, self.edit_pos-1)
        elif event.type == pygame.TEXTEDITING:
            self.text_edit = True
            self.text_editing = event.text 
            self.text_editing_pos = event.start
        elif event.type == pygame.TEXTINPUT:
            self.text_edit = False
            self.text_editing = ""
            self.text = self.text[:self.edit_pos] + event.text + self.text[self.edit_pos:]
            self.edit_pos = min(self.edit_pos + len(event.text), len(self.text + self.text_editing))
                
    def render(self, surface):
        surface.blit(self.image, self.image.get_rect(topleft=(200, 500)))
        string = self.font.render(self.text + self.text_editing, True, (255, 255, 255))
        surface.blit(string, string.get_rect(topleft=(200, 500)))

여기서 이벤트 함수를 보면 새로운 타입 pygame.TEXTEDITING, pygame.TEXTINPUT 인데 이걸로 입력을 받는다

 pygame.TEXTEDITING 에서는 한국어처럼 모아쓰기 하는 글자는 이게 모아써주고

 pygame.TEXTINPUT 은 글자가 입력됬을떄, 풀어쓰기는 글자 입력만하면, 모아쓰기는 글자가 완성되면 실행된다

 

전체 예시 코드

 

import pygame

class InputField:
    def __init__(self, size) -> None:
        self.image = pygame.Surface(size, pygame.SRCALPHA)
        self.image.fill((0, 0, 0, 255))
        self.font = pygame.font.SysFont("malgungothic", size[1])
        self.text = ""
        self.edit_pos = 0
        self.text_edit = False
        self.text_editing = ""
        
    def event(self, event):
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_BACKSPACE:
                self.text = self.text[:self.edit_pos-1] + self.text[self.edit_pos:]
                self.edit_pos = max(0, self.edit_pos-1)
        elif event.type == pygame.TEXTEDITING:
            self.text_edit = True
            self.text_editing = event.text
            self.text_editing_pos = event.start
        elif event.type == pygame.TEXTINPUT:
            self.text_edit = False
            self.text_editing = ""
            self.text = self.text[:self.edit_pos] + event.text + self.text[self.edit_pos:]
            self.edit_pos = min(self.edit_pos + len(event.text), len(self.text + self.text_editing))
                
    def render(self, surface):
        surface.blit(self.image, self.image.get_rect(topleft=(200, 500)))
        string = self.font.render(self.text + self.text_editing, True, (255, 255, 255))
        surface.blit(string, string.get_rect(topleft=(200, 500)))

pygame.init()
pygame.key.start_text_input()
screen = pygame.display.set_mode((1000, 800))

input_field = InputField((300, 50))

while True:
    screen.fill((100, 0, 50))
    
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
        input_field.event(event)
        
    input_field.render(screen)
    
    pygame.display.update()

 

pygame_phyics 은 InputField 에 깜빡거리는 커서, 줄넘김, 커서 이동 등을 구현함

 

참고시 github: https://github.com/fireing123/pygame_phyics

 

GitHub - fireing123/pygame_phyics

Contribute to fireing123/pygame_phyics development by creating an account on GitHub.

github.com