微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Python Pygame 字体 x 坐标

如何解决Python Pygame 字体 x 坐标

我正在尝试在 pygame 中制作一个 2d 密码生成器,我必须询问用户并从用户那里获取有关他想要密码的数字长度的文本输入。 我知道文本输入会很短,但是如果用户输入一个大字符串,文本输入通过我的屏幕宽度,那么我的问题是如何检测字体是否通过我的屏幕宽度,所以从现在开始,无论用户输入什么显示在新行上,因为如果文本不在换行符中,我的用户将无法看到他现在输入的内容

这是我的文本输入功能

def text_input(x,y,color,char=None,char_x=None,char_y=None,char_color=None,fill=(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_y)
                if char is not None:
                    char_text = str(char)
                    char_text_surface = FONT.render(char_text,char_color)
                    draw(char_text_surface,True)

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

如果你想知道这里的 draw 函数是什么是它的代码

def draw(thing,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,y)

如果你想知道我的完整代码就问我我会编辑这篇文章

解决方法

使用 pygame.font.Font.size 确定呈现文本所需的空间量:

text_width,text_height = FONT.size(text)

字体的行距可以用get_linesize

使用此方法逐行渲染文本:

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:],color)
        WINDOW.blit(text_surf,line_y))
    
    if update:
        pygame.display.update()
def text_input(x,char=None,char_x=None,char_y=None,char_color=None,fill=(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,100,True)
,

每个 character_text_surface 都会有一个宽度,你可以用:

character_text_surface.get_width()

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。