2013-01-01 2 views
3

Как сделать вывод pygame от пользователя:Как получить текстовый ввод от пользователя в Pygame?

Я пытаюсь, чтобы пользователь напечатал что-то, и pygame печатает его на экране.

Это моя текущая программа:

import pygame, pygame.font, pygame.event, pygame.draw, string 
from pygame.locals import * 

def get_key(): 
    while 1: 
    event = pygame.event.poll() 
    if event.type == KEYDOWN: 
     return event.key 
    else: 
     pass 

def display_box(screen, message): 
    "Print a message in a box in the middle of the screen" 
    fontobject = pygame.font.Font(None,18) 
    pygame.draw.rect(screen, (0,0,0), 
        ((screen.get_width()/2) - 100, 
        (screen.get_height()/2) - 10, 
        200,20), 0) 
    pygame.draw.rect(screen, (255,255,255), 
        ((screen.get_width()/2) - 102, 
        (screen.get_height()/2) - 12, 
        204,24), 1) 
    if len(message) != 0: 
    screen.blit(fontobject.render(message, 1, (255,255,255)), 
       ((screen.get_width()/2) - 100, (screen.get_height()/2) - 10)) 
    pygame.display.flip() 

def ask(screen, question): 
    "ask(screen, question) -> answer" 
    pygame.font.init() 
    current_string = [] 
    display_box(screen, question + ": " + string.join(current_string,"")) 
    while 1: 
    inkey = get_key() 
    if inkey == K_BACKSPACE: 
     current_string = current_string[0:-1] 
    elif inkey == K_RETURN: 
     break 
    elif inkey == K_MINUS: 
     current_string.append("_") 
    elif inkey <= 127: 
     current_string.append(chr(inkey)) 
    display_box(screen, question + ": " + string.join(current_string,"")) 
    return string.join(current_string,"") 

def main(): 
    screen = pygame.display.set_mode((320,240)) 
    print ask(screen, "Name") + " was entered" 

if __name__ == '__main__': main() 

Я хочу, чтобы это так, когда пользователь нажимает войти, он emptys экран.

Помогите мне!

+0

Итак, что вы пробовали до сих пор? – favoretti

ответ

6

Вот пример сценария, который ближет вход на экран. Он показывает, как вы можете изменить строку name во время цикла через очередь событий pygame. Каждый кадр, экран очищается и поверхность имени перестраивается и разглаживается.

import pygame 
from pygame.locals import * 

def name(): 
    pygame.init() 
    screen = pygame.display.set_mode((480, 360)) 
    name = "" 
    font = pygame.font.Font(None, 50) 
    while True: 
     for evt in pygame.event.get(): 
      if evt.type == KEYDOWN: 
       if evt.unicode.isalpha(): 
        name += evt.unicode 
       elif evt.key == K_BACKSPACE: 
        name = name[:-1] 
       elif evt.key == K_RETURN: 
        name = "" 
      elif evt.type == QUIT: 
       return 
     screen.fill((0, 0, 0)) 
     block = font.render(name, True, (255, 255, 255)) 
     rect = block.get_rect() 
     rect.center = screen.get_rect().center 
     screen.blit(block, rect) 
     pygame.display.flip() 

if __name__ == "__main__": 
    name() 
    pygame.quit() 

Вот gist version

+0

Можете ли вы сделать так, чтобы вход отображался в поле под названием «Имя»? –

+0

Я бы предпочел, чтобы вы попробовали это сначала. В этом примере достаточно, чтобы показать вам, как развить поверхность «Font.render» с «Name» в ней над входом. Если у вас есть вопросы, я рад ответить на них. – Devourant

+0

Пользователь редактировал сценарий в этом сообщении, потому что он получил ошибку при выходе. Мне интересно, является ли ошибка той же самой [упомянутой в pygame wiki] (http://www.pygame.org/wiki/FrequentlyAskedQuestions#In%20IDLE%20why%20does%20the%20Pygame%20window%20not%20close% 20correctly?). Попробуйте обновленную версию и комментарий, если она не работает, поэтому мы можем выяснить, в чем проблема. – Devourant

Смежные вопросы