2017-09-24 197 views

답변

3

입력 상자의 영역으로 rect을 정의 할 수 있습니다. pygame.MOUSEBUTTONDOWN 이벤트가 발생하면 input_box rect의 colliderect 메서드를 사용하여 event.pos과 충돌하는지 확인한 다음 active 변수를 True으로 설정하여 활성화하십시오.

상자가 활성화되어있는 경우 무언가를 입력하면 pygame이 속성을 갖는 pygame.KEYDOWN 이벤트를 생성하고 단순히 문자열에 추가 할 수 있습니다. text += event.unicode. 사용자가 Enter 키를 누르면 text 문자열 (예를 들어 방금 인쇄 한 것)을 사용하여 무언가를 수행하고 ''으로 재설정 할 수 있습니다. pygame_textinput처럼 사용할 수 타사 모듈도 있습니다

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

:

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

다음은 쉽게 여러 입력 상자를 생성 할 수있는 객체 지향 변형입니다.