Python Forum
Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Help with pygame tutorial
#1
I'm trying to make a pygame window where I can enter and edit text. I'm following a tutorial as a base for my code but I'm getting an the following error:

Error:
File "c:\Users\djwil\Documents\python\python crash course\Projects\Alien invasion\print.py", line 39, in Print text += event.unicode AttributeError: 'Event' object has no attribute 'unicode'


this is my code:

import pygame
from pygame.locals import *
import time

class Print:
    """Draw text to the screen."""
    # text is editable with the keyboard
    
    # options for font and background colour
    BLACK = (0, 0, 0)
    RED = (255, 0, 0)
    GREEN = (0, 255, 0)
    BLUE = (0, 0, 255)
    GRAY = (200, 200, 200)

    pygame.init()
    screen = pygame.display.set_mode((640, 240)) 
    # creates a screen 640 x 240 pixels in size

    sysfont = pygame.font.get_default_font()
    print('system font :', sysfont)
    text = 'This text is editable'
    font = pygame.font.SysFont(None, 24)
    img = font.render(text, True, RED)
    rect = img.get_rect()
    

    running = True
    background = GRAY
    while running:
        for event in pygame.event.get():
            if event.type == QUIT:
                running = False
        if event.type == KEYDOWN:
            if event.key == K_BACKSPACE:
                if len(text)>0: # if length of text is > 0
                    text = text[:-1] # delete the last letter in the string
        else:
            text += event.unicode
            # else add the letter to the end of the string
        img = font.render(text, True, RED)
        rect.size=img.get_size()
        cursor.topleft = rect.topright

        screen.fill(background)
        screen.blit(img, (20, 20))
        pygame.display.update()

    pygame.quit()
Reply
#2
this may or may not be the problem, but event is a python class name, and you may be getting the error because you are overriding it. Bad practice at any rate.

Try using another name, like game_event or something similar
Reply
#3
My code is now:

import pygame
from pygame.locals import *
import time

class Print:
    """Draw text to the screen."""
    # text is editable with the keyboard
    
    # options for font and background colour
    BLACK = (0, 0, 0)
    RED = (255, 0, 0)
    GREEN = (0, 255, 0)
    BLUE = (0, 0, 255)
    GRAY = (200, 200, 200)

    pygame.init()
    screen = pygame.display.set_mode((640, 240)) 
    # creates a screen 640 x 240 pixels in size

    sysfont = pygame.font.get_default_font()
    print('system font :', sysfont)
    text = 'This text is editable'
    font = pygame.font.SysFont(None, 24)
    img = font.render(text, True, RED)
    rect = img.get_rect()
    

    running = True
    background = GRAY
    while running:
        for event in pygame.event.get():
            if event.type == QUIT:
                running = False
        if event.type == KEYDOWN:
            if event.key == K_BACKSPACE:
                if len(text)>0: # if length of text is > 0
                    text = text[:-1] # delete the last letter in the string
        else:
            text += event.unicode
            # else add the letter to the end of the string
        img = font.render(text, True, RED)
        rect.size=img.get_size()
        cursor.topleft = rect.topright

        screen.fill(background)
        screen.blit(img, (20, 20))
        pygame.display.update()

    pygame.quit()
and I'm still getting this error:

Error:
File "c:\Users\djwil\Documents\python\python crash course\Projects\Alien invasion\print.py", line 39, in Print text += game_event.unicode AttributeError: 'Event' object has no attribute 'unicode' PS C:\Users\djwil\Documents\python\learning python>
Reply
#4
you didn't change the name!
Reply
#5
Sorry I copied my previous code over. The code is currently:

import pygame
from pygame.locals import *
import time

class Print:
    """Draw text to the screen."""
    # text is editable with the keyboard
    
    # options for font and background colour
    BLACK = (0, 0, 0)
    RED = (255, 0, 0)
    GREEN = (0, 255, 0)
    BLUE = (0, 0, 255)
    GRAY = (200, 200, 200)

    pygame.init()
    screen = pygame.display.set_mode((640, 240)) 
    # creates a screen 640 x 240 pixels in size

    sysfont = pygame.font.get_default_font()
    print('system font :', sysfont)
    text = 'This text is editable'
    font = pygame.font.SysFont(None, 24)
    img = font.render(text, True, RED)
    rect = img.get_rect()
    

    running = True
    background = GRAY
    while running:
        for game_event in pygame.event.get():
            if game_event.type == QUIT:
                running = False
        if game_event.type == KEYDOWN:
            if game_event.key == K_BACKSPACE:
                if len(text)>0: # if length of text is > 0
                    text = text[:-1] # delete the last letter in the string
        else:
            text += game_event.unicode
            # else add the letter to the end of the string
        img = font.render(text, True, RED)
        rect.size=img.get_size()
        cursor.topleft = rect.topright

        screen.fill(background)
        screen.blit(img, (20, 20))
        pygame.display.update()

    pygame.quit()
This matches up with the error in my previous post
Reply
#6
You need to make sure you are indenting correctly. As this is the entire issue.

from this:

    while running:
        for game_event in pygame.event.get():
            if game_event.type == QUIT:
                running = False
        if game_event.type == KEYDOWN:
            if game_event.key == K_BACKSPACE:
                if len(text)>0: # if length of text is > 0
                    text = text[:-1] # delete the last letter in the string
        else:
            text += game_event.unicode
            # else add the letter to the end of the string
        img = font.render(text, True, RED)
        rect.size=img.get_size()
        cursor.topleft = rect.topright
 
        screen.fill(background)
        screen.blit(img, (20, 20))
        pygame.display.update()
to this:

    while running:
        for game_event in pygame.event.get():
            if game_event.type == QUIT:
                running = False
            if game_event.type == KEYDOWN:
                if game_event.key == K_BACKSPACE:
                    if len(text)>0: # if length of text is > 0
                        text = text[:-1] # delete the last letter in the string
                else:
                    text += game_event.unicode
                    # else add the letter to the end of the string
            img = font.render(text, True, RED)
            rect.size=img.get_size()
            cursor.topleft = rect.topright
     
            screen.fill(background)
            screen.blit(img, (20, 20))
            pygame.display.update()
Here is an example of a working textbox for comparison:
Recommended Tutorials:
Reply
#7
I think the indentation should be like this

while running:
    for game_event in pygame.event.get():
        if game_event.type == QUIT:
            running = False
        if game_event.type == KEYDOWN:
            if game_event.key == K_BACKSPACE:
                if len(text)>0: # if length of text is > 0
                    text = text[:-1] # delete the last letter in the string
            else:
                text += game_event.unicode
                # else add the letter to the end of the string

    img = font.render(text, True, RED)
    rect.size=img.get_size()
    cursor.topleft = rect.topright
      
    screen.fill(background)
    screen.blit(img, (20, 20))
    pygame.display.update()
Reply
#8
MK_CodingSpace,

Your post is verbatim of what Metulburr posted 2 hours prior to your post.
Please read all posts prior to submitting a new one.

Thank You
Reply
#9
Larz60+,

If you look more closely, you will find it's different Big Grin

(Dec-20-2020, 08:58 PM)Larz60+ Wrote: MK_CodingSpace,

Your post is verbatim of what Metulburr posted 2 hours prior to your post.
Please read all posts prior to submitting a new one.

Thank You
Reply
#10
OK
Reply


Forum Jump:

User Panel Messages

Announcements
Announcement #1 8/1/2020
Announcement #2 8/2/2020
Announcement #3 8/6/2020