【问题标题】:Why can't I type more than 1 letter into my pygame textboxes? [duplicate]为什么我不能在我的 pygame 文本框中输入超过 1 个字母? [复制]
【发布时间】:2021-09-06 14:07:24
【问题描述】:

我希望用户在单击两个文本框时能够在每个文本框中输入一个名称。相反,下一个字母将始终替换前一个字母,而不是在屏幕上写出一个新字母。例如,如果您尝试键入“mat”,则 a 将替换 m,t 将替换 a。我该如何解决这个问题?

from pygame import *

screen_width = 1400
screen_height = 800

init()
screen = display.set_mode((screen_width, screen_height))

name_font = font.Font(None, 32)
name_1 = ""
name_2 = ""


class Rectangle:

    def __init__(self, x, y):
        self.name = ""
        self.active = False
        self.x = x
        self.y = y

        self.text_surface = name_font.render(self.name, 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, player_name):

        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:
                        player_name = player_name[:-1]
                        screen.fill((0, 0, 0))
                    else:
                        player_name += e.unicode
                        self.click_value += 7

                    self.text_surface = name_font.render(player_name, True, (255, 255, 255))

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


rect_1 = Rectangle(200, 200)

rect_2 = Rectangle(200, 400)

while True:
    mx, my = mouse.get_pos()

    events = event.get()
    for e in events:
        if e.type == QUIT:
            quit()

    screen.fill((0, 0, 0))
    rect_1.naming(name_1)
    rect_1.draw(screen)

    rect_2.naming(name_2)
    rect_2.draw(screen)

    display.update()
    time.delay(1)

我认为这与 name_1 和 name_2 变量的位置有关,但我不完全确定。

【问题讨论】:

    标签: python pygame textbox


    【解决方案1】:

    Pyhton 没有输入输出参数的概念。使用self.name 属性,而不是参数:

    from pygame import *
    
    screen_width = 1400
    screen_height = 800
    
    init()
    screen = display.set_mode((screen_width, screen_height))
    
    name_font = font.Font(None, 32)
    name_1 = ""
    name_2 = ""
    
    class Rectangle:
    
        def __init__(self, x, y):
            self.name = ""
            self.active = False
            self.x = x
            self.y = y
    
            self.text_surface = name_font.render(self.name, 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):
    
            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:
                            self.name = self.name[:-1]
                            screen.fill((0, 0, 0))
                        else:
                            self.name += e.unicode
                            self.click_value += 7
    
                        self.text_surface = name_font.render(self.name, True, (255, 255, 255))
            return self.name
    
        def draw(self, screen):
            draw.rect(screen, (0, 0, 0), self.input_rect, 0)
            draw.rect(screen, (255, 255, 255), 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))
    
    
    rect_1 = Rectangle(200, 200)
    
    rect_2 = Rectangle(200, 400)
    
    while True:
        mx, my = mouse.get_pos()
    
        events = event.get()
        for e in events:
            if e.type == QUIT:
                quit()
    
        screen.fill((0, 0, 0))
        name_1 = rect_1.naming()
        rect_1.draw(screen)
    
        name_2 = rect_2.naming()
        rect_2.draw(screen)
    
        display.update()
        time.delay(1)
    

    【讨论】:

      【解决方案2】:

      您可以使用此代码:-

      import pygame
      import sys
      
      pygame.init()
      
      clock = pygame.time.Clock()
      
      # it will display on screen
      screen = pygame.display.set_mode([600, 500])
      
      # basic font for user typed
      base_font = pygame.font.Font(None, 32)
      user_text = ''
      
      # create rectangle
      input_rect = pygame.Rect(200, 200, 140, 32)
      
      # color_active stores color(lightskyblue3) which
      # gets active when input box is clicked by user
      color_active = pygame.Color('lightskyblue3')
      
      # color_passive store color(chartreuse4) which is
      # color of input box.
      color_passive = pygame.Color('chartreuse4')
      color = color_passive
      
      active = False
      
      while True:
          for event in pygame.event.get():
      
          # if user types QUIT then the screen will close
              if event.type == pygame.QUIT:
                  pygame.quit()
                  sys.exit()
      
              if event.type == pygame.MOUSEBUTTONDOWN:
                  if input_rect.collidepoint(event.pos):
                      active = True
                  else:
                      active = False
      
              if event.type == pygame.KEYDOWN:
      
                  # Check for backspace
                  if event.key == pygame.K_BACKSPACE:
      
                      # get text input from 0 to -1 i.e. end.
                      user_text = user_text[:-1]
      
                  # Unicode standard is used for string
                  # formation
                  else:
                      user_text += event.unicode
          
          # it will set background color of screen
          screen.fill((255, 255, 255))
      
          if active:
              color = color_active
          else:
              color = color_passive
              
          # draw rectangle and argument passed which should
          # be on screen
          pygame.draw.rect(screen, color, input_rect)
      
          text_surface = base_font.render(user_text, True, (255, 255, 255))
          
          # render at position stated in arguments
          screen.blit(text_surface, (input_rect.x+5, input_rect.y+5))
          
          # set width of textfield so that text cannot get
          # outside of user's text input
          input_rect.w = max(100, text_surface.get_width()+10)
          
          # display.flip() will update only a portion of the
          # screen to updated, not full area
          pygame.display.flip()
          
          # clock.tick(60) means that for every second at most
          # 60 frames should be passed.
          clock.tick(60)
      
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-03
        • 2011-04-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多