如何使用Pygame创建文本输入框?

我想在Python中从用户那里获取一些文本输入,并在文本框中显示他们正在输入的内容,然后当他们按Enter时,它将存储在字符串中。

我到处都看过,但是什么也找不到。我正在使用Pygame

回答:

您可以将rect定义为输入框的区域。如果发生pygame.MOUSEBUTTONDOWN事件,请使用rectcolliderect方法input_box检查它是否与冲突,event.pos然后通过将active变量设置为来激活它True

如果该框处于活动状态,则可以键入一些内容,Pygame将生成pygame.KEYDOWN事件,该事件具有unicode可以简单地添加到字符串中的属性,例如text

+= event.unicode。如果用户按下Enter键,则可以对text字符串进行操作(在示例中,我只是打印该字符串)并将其重置为''

import pygame as pg

def main():

screen = pg.display.set_mode((640, 480))

font = pg.font.Font(None, 32)

clock = pg.time.Clock()

input_box = pg.Rect(100, 100, 140, 32)

color_inactive = pg.Color('lightskyblue3')

color_active = pg.Color('dodgerblue2')

color = color_inactive

active = False

text = ''

done = False

while not done:

for event in pg.event.get():

if event.type == pg.QUIT:

done = True

if event.type == pg.MOUSEBUTTONDOWN:

# If the user clicked on the input_box rect.

if input_box.collidepoint(event.pos):

# Toggle the active variable.

active = not active

else:

active = False

# Change the current color of the input box.

color = color_active if active else color_inactive

if event.type == pg.KEYDOWN:

if active:

if event.key == pg.K_RETURN:

print(text)

text = ''

elif event.key == pg.K_BACKSPACE:

text = text[:-1]

else:

text += event.unicode

screen.fill((30, 30, 30))

# Render the current text.

txt_surface = font.render(text, True, color)

# Resize the box if the text is too long.

width = max(200, txt_surface.get_width()+10)

input_box.w = width

# Blit the text.

screen.blit(txt_surface, (input_box.x+5, input_box.y+5))

# Blit the input_box rect.

pg.draw.rect(screen, color, input_box, 2)

pg.display.flip()

clock.tick(30)

if __name__ == '__main__':

pg.init()

main()

pg.quit()


这是一个面向对象的变体,使您可以轻松创建多个输入框:

import pygame as pg

pg.init()

screen = pg.display.set_mode((640, 480))

COLOR_INACTIVE = pg.Color('lightskyblue3')

COLOR_ACTIVE = pg.Color('dodgerblue2')

FONT = pg.font.Font(None, 32)

class InputBox:

def __init__(self, x, y, w, h, text=''):

self.rect = pg.Rect(x, y, w, h)

self.color = COLOR_INACTIVE

self.text = text

self.txt_surface = FONT.render(text, True, self.color)

self.active = False

def handle_event(self, event):

if event.type == pg.MOUSEBUTTONDOWN:

# If the user clicked on the input_box rect.

if self.rect.collidepoint(event.pos):

# Toggle the active variable.

self.active = not self.active

else:

self.active = False

# Change the current color of the input box.

self.color = COLOR_ACTIVE if self.active else COLOR_INACTIVE

if event.type == pg.KEYDOWN:

if self.active:

if event.key == pg.K_RETURN:

print(self.text)

self.text = ''

elif event.key == pg.K_BACKSPACE:

self.text = self.text[:-1]

else:

self.text += event.unicode

# Re-render the text.

self.txt_surface = FONT.render(self.text, True, self.color)

def update(self):

# Resize the box if the text is too long.

width = max(200, self.txt_surface.get_width()+10)

self.rect.w = width

def draw(self, screen):

# Blit the text.

screen.blit(self.txt_surface, (self.rect.x+5, self.rect.y+5))

# Blit the rect.

pg.draw.rect(screen, self.color, self.rect, 2)

def main():

clock = pg.time.Clock()

input_box1 = InputBox(100, 100, 140, 32)

input_box2 = InputBox(100, 300, 140, 32)

input_boxes = [input_box1, input_box2]

done = False

while not done:

for event in pg.event.get():

if event.type == pg.QUIT:

done = True

for box in input_boxes:

box.handle_event(event)

for box in input_boxes:

box.update()

screen.fill((30, 30, 30))

for box in input_boxes:

box.draw(screen)

pg.display.flip()

clock.tick(30)

if __name__ == '__main__':

main()

pg.quit()


也有第三方模块可用,例如pygame_textinput。

以上是 如何使用Pygame创建文本输入框? 的全部内容, 来源链接: utcz.com/qa/419007.html

回到顶部