在 pygame 中键入的内容越多,如何让矩形绘图变长?

How do you get a rectangle drawing to lengthen the more you type in pygame?

在这个程序中,当用户键入更多文本时,我希望矩形在用户键入时自动变长,以将字母保留在矩形内。但是,当文本变长时,它不会更新矩形。我该如何解决这个问题?

from pygame import *

init()
screen = display.set_mode((800, 600))

name_font = font.Font(None, 32)
name_text = ''

class Rectangle:


    def __init__(self, x, y):
        self.x = x
        self.y = y
        self.input_rect = Rect(x, y, 140, 32)
        self.text_surface = name_font.render(name_text, True, (255, 255, 255))
        color = Color('lightskyblue3')
        draw.rect(screen, color, self.input_rect, 2)
        self.input_rect.w = self.text_surface.get_width() + 10
        screen.blit(self.text_surface, (self.input_rect.x + 5, self.input_rect.y + 5))

def naming():
    global name_text
    if events.type == KEYDOWN:
        if keys[K_BACKSPACE]:
            name_text = name_text[:-1]
            screen.fill((0, 0, 0))
            rect_1 = Rectangle(200, 200)
        else:
            name_text += events.unicode

while True:
    rect_1 = Rectangle(200, 200)
    for events in event.get():
        keys = key.get_pressed()
        naming()
        if events.type == QUIT:
            quit()
    display.update()
    time.delay(1)

Rectangle.text_surface 是一个 PyGame 表面。因此,您只需调用 self.text_surface.get_width().

即可轻松获得边界框的精确宽度

但是 border-rect 的起始尺寸为 140,因此无论新的(更长的)宽度是多少,此尺寸都必须是 140 的最大值。另一个问题是当矩形 re-sizes 时,旧的矩形被留下了。因此,每当我们现在 re-draw 矩形时,它会将背景擦除为黑色。

这一切都可以很容易地封装到现有的 __init__():

def __init__(self, x, y):
    self.x = x
    self.y = y
    self.text_surface = name_font.render(name_text, True, (255, 255, 255))
    rect_width = max( 140, 10 + self.text_surface.get_width() )    # Adjust the width
    color = Color('lightskyblue3')
    self.input_rect = Rect(x, y, rect_width, 32)                   # Use new width (if any)
    draw.rect(screen, (0,0,0) , self.input_rect, 0)                # Erase any existing rect
    draw.rect(screen, color, self.input_rect, 2)
    self.input_rect.w = self.text_surface.get_width() + 10
    screen.blit(self.text_surface, (self.input_rect.x + 5, self.input_rect.y + 5))