删除文字时如何缩小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.active = False
        self.x = x
        self.y = y
        self.text_surface = name_font.render(name_text,True,(255,255,255))
        self.rect_width = max(140,10 + self.text_surface.get_width())
        self.input_rect = Rect(x,y,self.rect_width,32)
        self.input_rect.w = self.text_surface.get_width() + 10
        self.click_value = 10


    def naming(self,events):
        global rect_1
        global name_text

        for e in events:
            if e.type == MOUSEBUTTONDOWN:
                if self.input_rect.x + self.click_value >= mx >= self.input_rect.x - 10 and self.input_rect.y + 26 >= my >= self.input_rect.y - 10:
                    self.active = True
                else:
                    self.active = False

            if e.type == KEYDOWN:
                if self.active:
                    if e.key == K_BACKSPACE:
                        name_text = name_text[:-1]
                        screen.fill((0,0))
                    else:
                        name_text += e.unicode
                        self.click_value += 7

                    self.text_surface = name_font.render(name_text,255))

    def draw(self,screen):
        draw.rect(screen,(0,0),self.input_rect,0)
        draw.rect(screen,255),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))


rect_1 = Rectangle(200,200)

while True:
    mx,my = mouse.get_pos()
    events = event.get()
    for e in events:
        if e.type == QUIT:
            quit()

    rect_1.naming(events)
    rect_1.draw(screen)
    display.update()
    time.delay(1)

解决方法

在绘制输入矩形之前,必须先计算其宽度:

class Rectangle:
    # [...]

    def draw(self,screen):
        self.input_rect.w = self.text_surface.get_width() + 10
        draw.rect(screen,(0,0),self.input_rect,0)
        draw.rect(screen,(255,255,255),2)
        screen.blit(self.text_surface,(self.input_rect.x + 5,self.input_rect.y + 5))

但是,如果要每帧清除屏幕,则错误的顺序并不重要。该错误几乎不会引起注意,因为它仅在单个帧中可见。清除每一帧中的屏幕,而不要清除K_BACKSPACE

while True:
    mx,my = mouse.get_pos()
    events = event.get()
    for e in events:
        if e.type == QUIT:
            quit()

    rect_1.naming(events)

    screen.fill((0,0)) # <---
    rect_1.draw(screen)
    display.update()
    time.delay(1)