Python Pygame字体x坐标

2024-05-14 02:37:50 发布

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

我正试图在pygame中制作一个2d密码生成器,我必须询问用户,并从用户那里获取关于他希望密码长度的文本输入。 我知道文本输入会很短,但如果用户键入一个大字符串,文本输入会超过我的屏幕宽度,那么我的问题是如何检测字体是否超过我的屏幕宽度,因此从现在起,无论用户输入的内容是什么,都会显示在新行上,因为如果文本不在新行中,我的用户将无法看到他是什么现在进入

以下是我的文本输入功能:

def text_input(x, y, color, char=None, char_x=None, char_y=None, char_color=None, fill=(0, 0, 0), thing=None,
               thing_x=None, thing_y=None):
    """

    :param x: Defines the x axis or the width position where the text input should be drawn.
    :param y: Defines the y axis or the height position where the text input should be drawn.
    :param color: Defines the color of the text input.
    :param char: If the parameter char in not entered it does not do anything otherwise it display's the the parameter
                 char's text on the screen
    :param char_x: If the parameter char is entered char_x Defines the x axis or the width position where the text
                   should be drawn.
    :param char_y: If the parameter char is entered char_y Defines the y axis or the height position where the text
                   should be drawn.
    :param char_color: Defines the color of the text of the parameter char in rgb color pixels.
    :param fill: If the parameter fill is entered it fills the display with the tuple of the rgb color pixels which the
                 user entered. But if the parameter fill is not entered it fills the display with the rgb color code
                 black.
    :param thing: If the user wants some thing to been drawn on the display the fill the parameter thing with the object
                  they want to draw. But if the parameter thing is not entered. The thing parameter should be a pygame
                  Surface.
    :param thing_x: If the parameter thing is entered thing_x Defines the x axis or the width position where the
                    parameter thing should be drawn
    :param thing_y: If the parameter thing is entered thing_y Defines the y axis or the height position where the
                    parameter thing should be drawn.
    :return: It Display's the text input and the other parameters which were entered on the window and the updates it.
    """

    characters = ""
    WINDOW.fill(fill)
    if thing is not None:
        draw(thing, thing_x, thing_y)
    if char is not None:
        char_text = str(char)
        char_text_surface = FONT.render(char_text, True, char_color)
        draw(char_text_surface, char_x, char_y, True)
    pygame.display.update()

    while True:
        for detect in pygame.event.get():
            if detect.type == QUIT:
                exit()

            elif detect.type == KEYDOWN:
                if detect.key == K_BACKSPACE:
                    characters = characters[:-1]
                elif detect.key == K_RETURN:
                    global text
                    text = characters
                    return text

                else:
                    characters = characters + detect.unicode

                WINDOW.fill(fill)
                if thing is not None:
                    draw(thing, thing_x, thing_y)
                if char is not None:
                    char_text = str(char)
                    char_text_surface = FONT.render(char_text, True, char_color)
                    draw(char_text_surface, char_x, char_y, True)

                text = FONT.render(f"{characters}", True, color)
                print(char_x)
                draw(text, x, y, True)

如果您想知道draw函数是什么,下面是它的代码:

def draw(thing, x, y, update=None):
    """

    :param thing: The object what needs to be drawn on the screen
    :param x: Defines the x axis or the width position where the object should be drawn.
    :param y: Defines the y axis or the height position where the object should be drawn.
    :param update: If the parameter update is not passed we don't update the display.
                   But if the parameter update is passed as True we update the display.
    :return: It returns the object on the display at its specific place or it returns
            the object on the display at its specific place and updates and updates the display based on the parameter
            update.
    """

    if update is True:
        WINDOW.blit(thing, (x, y))
        return pygame.display.update()

    else:
        return WINDOW.blit(thing, (x, y)

如果你想知道我的完整代码,请询问我,我将编辑此帖子:


Tags: thetextnoneifparameterparamisdisplay
2条回答

每个字符\u文本\u表面都有一个宽度,您可以通过以下方式获得:

character_text_surface.get_width()

因此,您需要做的是有一个total_width变量,对于每个blit的字符,将该字符的宽度添加到total_width中。然后你可以像这样测试它:

if start_of_input_x + total_width >= screenwidth:
  y += character_text_surface.get_height()

使用^{}确定渲染文本所需的空间量:

text_width, text_height = FONT.size(text)

字体的行距可以通过^{}获得

使用以下方法逐行渲染文本:

def render_text(font, text, color, x, y, max_length = 100, update=False):

    line_y = y
    si = 0
    ei = 1
    while ei < len(text)+1:
        text_width, text_height = font.size(text[si:ei])
        if text_width > max_length:
            text_surf = font.render(text[si:ei-1], True, color)
            WINDOW.blit(text_surf, (x, line_y))
            line_y += font.get_linesize()
            si = ei-1
        ei += 1
    if si < len(text):
        text_width, text_height = font.size(text[si:])
        text_surf = font.render(text[si:], True, color)
        WINDOW.blit(text_surf, (x, line_y))
    
    if update:
        pygame.display.update()
def text_input(x, y, color, char=None, char_x=None, char_y=None, char_color=None, fill=(0, 0, 0), thing=None,
               thing_x=None, thing_y=None):
    # [...]

    while True:
        for detect in pygame.event.get():
            if detect.type == QUIT:
                exit()

            elif detect.type == KEYDOWN:
                # [...]

                render_text(FONT, characters, color, x, y, 100, True)

相关问题 更多 >