Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/Nearoo/pygame-text-input
a small module that enables you to input text with your keyboard using pygame
https://github.com/Nearoo/pygame-text-input
font input keyboard-input pygame text
Last synced: 13 days ago
JSON representation
a small module that enables you to input text with your keyboard using pygame
- Host: GitHub
- URL: https://github.com/Nearoo/pygame-text-input
- Owner: Nearoo
- License: mit
- Created: 2016-11-10T20:11:15.000Z (about 8 years ago)
- Default Branch: master
- Last Pushed: 2023-08-08T19:26:27.000Z (over 1 year ago)
- Last Synced: 2024-10-08T12:23:50.608Z (about 1 month ago)
- Topics: font, input, keyboard-input, pygame, text
- Language: Python
- Homepage:
- Size: 67.4 KB
- Stars: 140
- Watchers: 8
- Forks: 64
- Open Issues: 4
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# Pygame Text Input Module
This module provides two utility classes that simplify entering text using pygame. The classes are:
* `TextInputVisualizer` which can be used to both manage and draw text input. Simply pass all events returned by `pygame.event.get()` to it every frame, and blit its `surface` attribute on the screen.
* `TextInputManager` that can be used to just manage inputted text, with no visual aspect. Used by `TextInputVisualizer` behind the scenes.![Example of module in use](https://i.imgur.com/h7a64Y2.gif)
# Installation
Simplest way is using pypi:
```
python3 -m pip install pygame-textinput
```# Usage
## `TextInputVisualizer`
### Example
All arguments to the constructor are optional. Once constructed, call `update` every frame with all pygame events as an argument, then blit it's `surface` field to the screen, like so:
```python
import pygame_textinput
import pygame
pygame.init()# Create TextInput-object
textinput = pygame_textinput.TextInputVisualizer()screen = pygame.display.set_mode((1000, 200))
clock = pygame.time.Clock()while True:
screen.fill((225, 225, 225))events = pygame.event.get()
# Feed it with events every frame
textinput.update(events)
# Blit its surface onto the screen
screen.blit(textinput.surface, (10, 10))for event in events:
if event.type == pygame.QUIT:
exit()pygame.display.update()
clock.tick(30)
```## Arguments:
All arguments are optional.
Argument | Description
---|---
manager | The `TextInputManager` used to manage the input
font_object | The `pygame.font.Font` object used for rendering
antialias | whether to render the font antialiased or not
font_color | color of font rendered
cursor_blink_interval | The interval of the cursor blinking, in ms
cursor_width | The width of the cursor, in pixels
cursor_color | The color of the cursor## Fields
All arguments above are also fields that can be accessed and modified on the fly, e.g. like this:
```python
textinput.cursor_width = 12
textinput.value = "Hello, World!"
print(textinput.font_color)
```Field | Description
--- | ---
value | (string) The text entered so far
surface | The `pygame.Surface` object with entered text & cursor on it and a transparent background. **Cannot be set.**
cursor_visible | (bool) wether the cursor is currently visible or not. Flips every `cursor_interval` ms as long as `update` is called continuously.## Methods
Method | Description
--- | ---
update(events) | Call this method every frame for as long as input should be processed and `cursor_visible` should be updated.### Notes on the newer version:
* You have to watch for "return" presses by the user yourself, e.g. like this:```python
for event in events:
...
if event.type == pygame.KEYDOWN and event.key == pygame.K_RETURN:
print("Oooweee")
```* Contrary to the old version, key-stroke repeats are not manually introduced anymore, since they can now be enabled within `pygame` directly:
```python
pygame.key.set_repeat(200, 25) # press every 50 ms after waiting 200 ms
```This new version has also been optimized such that you can **modify any fields on the fly** and the actual surface will only re-render if you access it using `textinput.surface` - and only if you actually modified any values.
# `TextInputManager`
If you prefer to draw the text on the screen yourself, you can use `TextInputManager` to only manage the string that has been typed so far.
Like `TextInputVisualizer`, you feed its `update` method all events received by `pygame.event.get()` which you want it to process. `TextInputVisualizer` does this for you inside its `update` method if you pass it a `TextInputManager`.
## Arguments:
Argument | Description
---|---
initial | The initial value (text)
validator | A function taking a `string` and returning a `bool`. Every time an input modifies the value, this function is called with the modified value as an argument; if the function returns `True`, the input is accepted, otherwise the input is ignored.So say you want to only allow input to up to 5 letters, you could do that with
```python
manager = TextInputManager(validator=lambda input: len(input) <= 5)
```## Fields
Field | Description
---|---
value | The inserted value so far. When change, `cursor_pos` is kept as far as possible.
cursor_pos | The position of the cursor. `0` is before the first character, `len(manager.value)` the position after the last. Values outside this range are clamped.# More Examples
## Most features
```python
import pygame
import pygame.locals as plpygame.init()
# No arguments needed to get started
textinput = TextInputVisualizer()# But more customization possible: Pass your own font object
font = pygame.font.SysFont("Consolas", 55)
# Create own manager with custom input validator
manager = TextInputManager(validator = lambda input: len(input) <= 5)
# Pass these to constructor
textinput_custom = TextInputVisualizer(manager=manager, font_object=font)
# Customize much more
textinput_custom.cursor_width = 4
textinput_custom.cursor_blink_interval = 400 # blinking interval in ms
textinput_custom.antialias = False
textinput_custom.font_color = (0, 85, 170)screen = pygame.display.set_mode((1000, 200))
clock = pygame.time.Clock()# Pygame now allows natively to enable key repeat:
pygame.key.set_repeat(200, 25)while True:
screen.fill((225, 225, 225))events = pygame.event.get()
# Feed it with events every frame
textinput.update(events)
textinput_custom.update(events)# Get its surface to blit onto the screen
screen.blit(textinput.surface, (10, 10))
screen.blit(textinput_custom.surface, (10, 50))# Modify attributes on the fly - the surface is only rerendered when .surface is accessed & if values changed
textinput_custom.font_color = [(c+10)%255 for c in textinput_custom.font_color]# Check if user is exiting or pressed return
for event in events:
if event.type == pygame.QUIT:
exit()if event.type == pygame.KEYDOWN and event.key == pygame.K_RETURN:
print(f"User pressed enter! Input so far: {textinput.value}")pygame.display.update()
clock.tick(30)
```