Saya ingin menghapus teks yang dimasukkan oleh pengguna ke layar. Setiap kali pengguna menekan Return, teks yang diketik harus ditampilkan ke layar. Untuk input teks saya menggunakan [text_input module] ini (https://github.com/Nearoo/pygame -teks-input).

Berikut adalah kode yang saya buat sejauh ini:

import pygame_textinput
import pygame
pygame.init()

# Set some parameters
duration = 5.0
time = pygame.time.get_ticks()/1000

screen = pygame.display.set_mode((400, 400))
clock = pygame.time.Clock()

yoffset = 5
# Function that positions user input rects on screen
def renderInput(text, xoffset, yoffset):
    font = pygame.font.SysFont("arial", 20)
    renderText = font.render(text, False, (0, 0, 0))
    rectText = renderText.get_rect()
    rectText = rectText.move((0 + xoffset),  (screen.get_height()/2 + yoffset))
    return  renderText, rectText

# Fills the screen once at the beginning
screen.fill((225, 225, 225))

while (pygame.time.get_ticks()/1000) < time + duration:
    # creat new text input object on every trial
    textinput = pygame_textinput.TextInput()

    while True:
        # Fills the surface after each keypress
        screen.fill((225, 225, 225))

        # Check events
        events = pygame.event.get()
        for event in events:
            if event.type == pygame.QUIT:
                exit()

        # Feed with events every frame
        # This evaluates to True once Return is pressed
        if textinput.update(events):
            userInput = textinput.get_text()
            yoffset += 20
            break

        # Blit surface onto the screen
        screen.blit(textinput.get_surface(), (10, 10))
        # Update screen
        pygame.display.update()
        clock.tick(30)

    # Blits user input to screen each time "Return" is pressed
    # First get input text and the rectangle of the text
    text, textrect = renderInput(userInput, 5, yoffset)
    # Then blit it to the screen
    screen.blit(text, textrect)
    pygame.display.update()

Masalah saya adalah, bahwa blitting hanya berfungsi jika saya tidak mengisi layar setelah setiap penekanan tombol dalam loop sementara yang menangani input. Jika saya melakukan itu, maka input teks, bagaimanapun, tidak dihapus setelah setiap kali pengguna menekan Return.

Jadi apakah ada cara untuk memiliki keduanya, menggambar ulang setelah setiap penekanan tombol dan menampilkan teks di bawah setelah setiap kali Return ditekan oleh pengguna.

Terima kasih.

1
imarevic 15 Agustus 2017, 16:42

2 jawaban

Jawaban Terbaik

Jika saya memahami Anda dengan benar, teks di bidang input harus dihapus dan harus di-blit di area utama layar. Saya akan menetapkan teks ke variabel user_input jika pengguna menekan enter dan kemudian membuat instance pygame_textinput.TextInput() baru untuk mengosongkan bidang input.

Saya telah mencoba menyederhanakan kode Anda, karena kedua loop while agak membingungkan dan saya tidak yakin apa tujuannya. Biasanya hanya ada satu while loop dalam sebuah game.

import pygame
import pygame_textinput


pygame.init()

screen = pygame.display.set_mode((400, 400))
clock = pygame.time.Clock()
font = pygame.font.SysFont("arial", 20)

textinput = pygame_textinput.TextInput()
user_input = ''

done = False

while not done:
    events = pygame.event.get()
    for event in events:
        if event.type == pygame.QUIT:
            done = True

    if textinput.update(events):
       user_input = textinput.get_text()
       textinput = pygame_textinput.TextInput()

    # Draw everything.
    screen.fill((225, 225, 225))

    screen.blit(textinput.get_surface(), (10, 10))

    user_input_surface = font.render(user_input, True, (30, 80, 100))
    screen.blit(user_input_surface, (10, 50))

    pygame.display.update()
    clock.tick(30)

pygame.quit()

Sunting: Dalam versi ini saya menambahkan permukaan teks yang dirender ke daftar dan menghapusnya dengan offset.

import pygame
import pygame_textinput


pygame.init()

screen = pygame.display.set_mode((400, 400))
clock = pygame.time.Clock()
font = pygame.font.SysFont("arial", 20)

textinput = pygame_textinput.TextInput()
user_inputs = []

done = False

while not done:
    events = pygame.event.get()
    for event in events:
        if event.type == pygame.QUIT:
            done = True

    if textinput.update(events):
       user_inputs.append(
           font.render(textinput.get_text(), True, (30, 80, 100)))
       textinput = pygame_textinput.TextInput()

    screen.fill((225, 225, 225))

    screen.blit(textinput.get_surface(), (10, 10))

    for y, text_surf in enumerate(user_inputs):
        screen.blit(text_surf, (10, 50+30*y))

    pygame.display.update()
    clock.tick(30)

pygame.quit()

Sunting2: Untuk mendapatkan tabel, Anda dapat menggunakan modulo untuk offset baris dan pembagian lantai untuk offset kolom. Masalah dengan contoh ini adalah bahwa permukaan teks dapat tumpang tindih jika terlalu lebar.

for n, text_surf in enumerate(user_inputs):
    # 5 rows. Offset = 30 pixels.
    y_pos = 50 + (n%5) * 30
    # After 5 rows add a new column. Offset = 100 pixels.
    x_pos = 10 + n // 5 * 100
    screen.blit(text_surf, (x_pos, y_pos))
1
skrx 17 Agustus 2017, 06:55

Saya telah mengedit kode saya yang berisi saran Anda. Terima kasih banyak, ini sepertinya menyelesaikan masalah saya. Berikut adalah versi saat ini termasuk timer:

import pygame_textinput
import pygame
pygame.init()

# Set some parameters
duration = 5.0
time = pygame.time.get_ticks()/1000
xoffset = 5
yoffset = 5

screen = pygame.display.set_mode((400, 400))
font = pygame.font.SysFont("arial", 20)
clock = pygame.time.Clock()

# Creates textinput instance and an empty list to store inputs
textinput = pygame_textinput.TextInput()
userInputs = []

# Fills the screen once at the beginning
screen.fill((225, 225, 225))

while (pygame.time.get_ticks()/1000) < time + duration:

    # Check events
    events = pygame.event.get()
    for event in events:
        if event.type == pygame.QUIT:
            exit()

    # Feed with events every frame
    # This evaluates to True once Return is pressed
    if textinput.update(events):
        userInputs.append(font.render(textinput.get_text(), True, (30, 80, 100)))
        textinput = pygame_textinput.TextInput()

    # Fill screen
    screen.fill((225, 225, 225))
    # Blit its surface onto the screen
    screen.blit(textinput.get_surface(), (screen.get_rect().centerx, screen.get_rect().height/5))

    for y, text_surf in enumerate(userInputs):
            screen.blit(text_surf, (10, (screen.get_rect().height/4)+30*y))

    # Update screen
    pygame.display.update()
    clock.tick(30)

Saya tidak ingin terlalu mengganggu Anda, tetapi sekarang saya memiliki satu masalah lagi yang harus saya pecahkan. Apakah mungkin untuk merender input teks di kolom kedua setelah keluar dari batas bawah layar? Jadi misalnya, jika pengguna mengetik banyak kata, yang tidak cocok di bawah satu sama lain, apakah mungkin untuk memindahkan input teks berikutnya ke kanan dan membuatnya mulai di sebelah input pertama (buat kolom kedua sehingga untuk berbicara ). Terima kasih atas bantuan Anda selama ini, saya sangat menghargainya.

1
imarevic 16 Agustus 2017, 09:06