Simple pygame input box with cursor and character count - Printable Version +- Python Forum (https://python-forum.io) +-- Forum: General (https://python-forum.io/forum-1.html) +--- Forum: Code sharing (https://python-forum.io/forum-5.html) +--- Thread: Simple pygame input box with cursor and character count (/thread-40960.html) |
Simple pygame input box with cursor and character count - menator01 - Oct-20-2023 # Do the imports import pygame from time import time # Initiate pygame pygame.init() # Create the screen surface and window caption size = (1024, 720) screen = pygame.display.set_mode(size) pygame.display.set_caption('Pygame tester') # Set variable for clock clock = pygame.time.Clock() # Set frames per secong fps = 60 font = pygame.font.Font(None, 32) class TextBox: ''' TextBox class will create an input box to enter text Also provides a header text for the box ''' def __init__(self, header_text): # Create our header self.head_surface = font.render(header_text, True, 'black') # Create input box self.rect = pygame.Rect(200, 110, 200, 35) # Set a text variable self.text = '' # Create a text surface self.text_surface = font.render(self.text, True, 'black') # Get the text rect self.text_rect = self.text_surface.get_rect() # Create a cursor self.cursor = pygame.Rect(self.text_rect.topright, (3, self.text_rect.height)) # Counter self.count_text = pygame.Rect(200, 50, 200, 35) self.count_text_surface = font.render('Character Count:', True, 'black') def draw(self, screen): # Draw everthing to the screen screen.blit(self.count_text_surface, (50, 80)) screen.blit(self.head_surface, (50, self.rect.y+8)) pygame.draw.rect(screen, 'gray85', self.rect) screen.blit(self.text_surface, (self.rect.x+5, self.rect.y+6)) pygame.draw.rect(screen, 'black', self.rect, 1) # Give the cursor a blinking effect if time() % 1 > 0.5: text_rect = self.text_surface.get_rect(topleft=(self.rect.x+5, self.rect.y+6)) self.cursor.midleft = text_rect.midright pygame.draw.rect(screen, 'black', self.cursor) def add(self, text): # Add text to the input box self.text += text def delete(self): # Remove text from input box self.text = self.text[:-1] def update(self): # Update everything self.text_surface = font.render(self.text, True, 'black') width = max(200, self.text_surface.get_width()+10) self.rect.w = width self.count_text_surface = font.render(f'Character Count: ({len(self.text)}). Limit = 50', True, 'black') def myevents(self, event): # Check pygame events for a key press if event.type == pygame.KEYDOWN: # If the backspace is pressed remove text # Else add the text if event.key == pygame.K_BACKSPACE: if len(self.text) > 0: self.delete() else: # Allow only letters, numbers and space in the input box if event.unicode.isalnum() or event.key == pygame.K_SPACE: # Limiting only to thre letters if len(self.text) >= 50: self.delete() # Add to input box self.add(event.unicode) # Create the input box textbox = TextBox('Enter Text:') # Set pygame loop variable running = True # Start the loop while running: # Get pygame events event = pygame.event.poll() textbox.myevents(event) # Exit pygame if event.type == pygame.QUIT: running = False # Update the input box textbox.update() screen.fill('white') # Draw the text box and header textbox.draw(screen) # Update surface pygame.display.flip() # Set clock speed clock.tick(fps) pygame.quit() |