预览键盘输入并在鼠标点击时显示文字pygam

2024-10-05 11:04:33 发布

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

我试图将用户键入的内容作为预览显示到屏幕上,当他们用鼠标左键单击时,它会将文本快速显示到屏幕上。你知道吗

from pygame import *

init()
screen = display.set_mode((640, 480))
clock = time.Clock()
running = True

font = font.SysFont("comicsansms", 72) # Default font
textC = "a" # Stores user input
text = font.render(textC, True, (255,0,0)) # Render Text

while running:

    mx, my = mouse.get_pos()
    mb = mouse.get_pressed()
    for e in event.get():
        if e.type == QUIT:
            running = False

        if e.type == KEYDOWN:
            print(textC)
            if key.get_pressed()[K_BACKSPACE]:
                textC = textC[:-1] # removes last letter
            else:
                textC += e.unicode # adds letter

        screen.fill((255, 255, 255)) #fill screen white
        screen.blit(text, (mx, my)) # display text

    display.flip()
    clock.tick(60)

quit()

Tags: texttruegetif屏幕mydisplayscreen
2条回答

我修改了您的示例,将存储的文本放在您单击的位置。更改textC时,需要更新text曲面。我还可以在鼠标单击时清除textC缓冲区。你知道吗

from pygame import *

init()
screen = display.set_mode((640, 480))
clock = time.Clock()
running = True

font = font.SysFont("comicsansms", 72) # Default font
textC = "a" # Stores user input
text = font.render(textC, True, (255,0,0)) # Render Text
pos = None # store mouse click location

while running:
    mx, my = mouse.get_pos()
    mb = mouse.get_pressed()
    for e in event.get():
        if e.type == QUIT:
            running = False

        if e.type == KEYDOWN:
            print(textC)
            if key.get_pressed()[K_BACKSPACE]:
                textC = textC[:-1] # removes last letter
            else:
                textC += e.unicode # adds letter
            # need to update the text surface:
            text = font.render(textC, True, (255,0,0)) # Render Text

        elif e.type == MOUSEBUTTONDOWN:
            pos = mouse.get_pos() 
            locked_text = font.render(textC, True, (0,255,0))
            textC = ""
            text = font.render(textC, True, (255,0,0)) # Clear text

        screen.fill((255, 255, 255)) #fill screen white
        if pos:
            screen.blit(locked_text, pos)
        screen.blit(text, (mx, my)) # display text

    display.flip()
    clock.tick(60)

quit()

如果希望文本持久化,则需要创建文本表面及其位置的列表,然后在每一帧中遍历它们。在这种情况下,可能值得考虑Sprites。你知道吗

首先,您没有正确捕捉鼠标事件。使用MOUSEBUTTONDOWN事件的方式与使用KEYDOWN键事件的方式相同,然后使用mouse.get_pressed来知道正在按下哪个鼠标按钮。你知道吗

第二,问题是每次screen.fill执行时,所有的表面都会被擦除,因此有必要以某种方式跟踪文本和呈现文本的位置。它可以是一个列表。你知道吗

所以你的代码看起来像这样

from pygame import *

init()
screen = display.set_mode((640, 480))
clock = time.Clock()
running = True

font = font.SysFont("comicsansms", 72) # Default font
textC = "a" # Stores user input
text = font.render(textC, True, (255,0,0)) # Render Text

text_rendered = []

def rerender_text():
    for surface, pos in text_rendered:
        screen.blit(surface, pos)  # display text

while running:
    screen.fill((255, 255, 255))  # fill screen white
    mx, my = mouse.get_pos()
    for e in event.get():
        if e.type == QUIT:
            running = False

        if e.type == KEYDOWN:
            keys = list(key.get_pressed())
            index = keys.index(1)
            if key.get_pressed()[K_BACKSPACE]:
                textC = textC[:-1] # removes last letter
            else:
                textC += e.unicode # adds letter

        if e.type == MOUSEBUTTONDOWN:
            if mouse.get_pressed()[0]: # Left click
                screen.blit(text, (mx, my))  # display text
                # save the text and the position for rerendering
                text_rendered.append((text,(mx,my))) 


    text = font.render(textC, True, (255, 0, 0))  # Render Text
    rerender_text()
    screen.blit(text, (mx, my))  # display text
    display.flip()
    clock.tick(60)

quit()

相关问题 更多 >

    热门问题