Pygame Backspace键输入的文本未清除。而是重叠的/

2024-04-24 23:55:21 发布

您现在位置:Python中文网/ 问答频道 /正文

Pic,以便更好地澄清问题: http://imgur.com/a/sbHax

如图所示,我输入了一些文本。我决定退格,但是我输入的新文本与前一个重叠。为什么会这样?在

对pygame来说是新手,而且已经为这个问题困扰太久了:(

请帮忙!我该怎么办

   if not cheat:
        WIN = pygame.image.load("Assets/winBox.png")
        self.SCREEN.blit(WIN, (175, 230))
        winRect = pygame.Rect(175, 230, 250, 164)
        pygame.display.update(winRect)
        done = False

        while not done:
            self.CLOCK.tick(self.FPS)
            mouse = pygame.mouse.get_pos()
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    self.STATE = 0
                    done = True

                if 219 <= mouse[0] <= 269 and 366 <= mouse[1] <= 378 and pygame.mouse.get_pressed()[0] == 1:
                    # RESTART
                    self.STATE = 6
                    done = True

                elif 311 <= mouse[0] <= 375 and 366 <= mouse[1] <= 378 and pygame.mouse.get_pressed()[0] == 1:
                    # MAIN MENU
                    self.STATE = 2
                    done = True


    else:
        WIN = pygame.image.load("Assets/winBoxWithScore.png")
        self.SCREEN.blit(WIN, (175, 230))
        winRect = pygame.Rect(175, 230, 250, 164)


        pygame.display.update(winRect)
        done = False

        while not done:
            self.CLOCK.tick(self.FPS)
            mouse = pygame.mouse.get_pos()
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    self.STATE = 0
                    done = True

                if 219 <= mouse[0] <= 269 and 366 <= mouse[1] <= 378 and pygame.mouse.get_pressed()[0] == 1:
                    # RESTART
                    self.STATE = 6
                    done = True

                if 311 <= mouse[0] <= 375 and 366 <= mouse[1] <= 378 and pygame.mouse.get_pressed()[0] == 1:
                    # MAIN MENU
                    self.STATE = 2
                    done = True

                elif 290 <= mouse[0] <= 345 and 275 <= mouse[1] <= 325 and pygame.mouse.get_pressed()[0] == 1:

                    WIN = pygame.image.load("Assets/winBoxBlank.png")
                    self.SCREEN.blit(WIN, (175, 230))
                    winRect = pygame.Rect(175, 230, 250, 164)

                    pygame.display.update(winRect)
                    name = ""
                    done = False
                    while not done:
                        self.CLOCK.tick(self.FPS)
                        mouse = pygame.mouse.get_pos()

                        self.SCREEN.blit(
                            pygame.font.SysFont('comicsansms', 22).render("Enter your name :", True, Color.black),
                            (210, 250))
                        # Textbox
                        pygame.draw.rect(self.SCREEN, Color.gray, (210, 310, 180, 35), 2)

                        for event in pygame.event.get():
                            if event.type == pygame.QUIT:
                                self.STATE = 0
                                done = True

                            # Keyboard events
                            if event.type == pygame.KEYDOWN:
                                if event.key == pygame.K_BACKSPACE:
                                    name = name[:-1]  # remove last char


                                elif event.key == pygame.K_RETURN or event.key == pygame.K_KP_ENTER:
                                    done = True  # break out of the while loop to return name
                                elif event.key == pygame.K_ESCAPE:
                                    self.menu()
                                    done = True

                                else:
                                    try:
                                        name += event.unicode  # append name
                                    except:
                                        pass
                        # Limit name to 10 characters
                        name = name[:10]
                        # Display characters typed
                        if len(name) != 0:
                            self.SCREEN.blit(pygame.font.SysFont('comicsansms', 22).render(name, True, Color.black),(230, 310))

                        pygame.display.update()

                    # Store score to the current textfile
                    p = Player(name, self.numdisks, str(len(self.moveList)))
                    with open("score.txt", "a") as sfile:
                        sfile.write("\n" + p.getName() + "\t" + str(p.getLevel()) + "\t" + str(p.getMove()))
                    # Navigate to the next page
                    self.STATE = 11

Tags: andnameselfeventtruegetifscreen
1条回答
网友
1楼 · 发布于 2024-04-24 23:55:21

在代码中,每次更新时都要重新绘制文本标签、文本框和名称:

self.SCREEN.blit(pygame.font.SysFont('comicsansms', 22).render("Enter your name :", True, Color.black), (210, 250))
# Textbox
pygame.draw.rect(self.SCREEN, Color.gray, (210, 310, 180, 35), 2)

但你没有清除框内的文本。问题是你画的是一个没有填充的矩形。绘制矩形的最后一个参数是宽度。设置为2。所以它画的是一个矩形,但不是填充的。在

https://www.pygame.org/docs/ref/draw.html#pygame.draw.rect

如果你也添加了一个填充矩形(在文本框内),它每次都会清除名称,只填充当前名称。在

^{pr2}$

你必须调整x,y,宽度和高度,以适应一个稍小的矩形,以适应外盒

相关问题 更多 >