2017-09-24 487 views
4

我想在python中获取用户的一些文本输入,并显示他们在文本框中输入的内容,当他们按下回车键时,它将被存储在一个字符串中。我已到处寻找,但我找不到任何东西(我正在使用pygame)如何使用pygame创建文本输入框?

回答

3

您可以将rect定义为输入框的区域。如果发生pygame.MOUSEBUTTONDOWN事件,请使用input_box矩形的colliderect方法检查它是否与event.pos冲突,然后通过将active变量设置为True将其激活。

如果该框处于活动状态,您可以输入东西,pygame将生成pygame.KEYDOWN事件,该事件的unicode属性可以简单添加到字符串中。 text += event.unicode。如果用户按Enter键,则可以使用text字符串(在示例中我只是将其打印出来)执行某些操作,并将其重置为''

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

这里是一个面向对象的变种,它允许您轻松地创建多个输入框:

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

也有像可pygame_textinput第三方模块。