сообщение об ошибке справки pygame "pygame.error: Текст имеет нулевую ширину" - PullRequest
1 голос
/ 14 февраля 2020

Хорошо, это мой код, и я получаю ошибку: это

, и мне интересно, можете ли вы увидеть любые проблемы с моим кодом. Это как-то связано с выходом Pygame перед выходом из игры. Спасибо, Алекс. В коде есть и другие внешние вещи, но вам нужно просто просмотреть его, если вы можете.

import pygame 
import random 
import time 
pygame.init() 
pygame.font.init()
pygame.mixer.init()
width = 1920 
height = 1080
black = (0,0,0) 
white = (255,255,255)
red = (255,0,0) 
green = (0,255,0)
light_blue = (0,0,255)
blue = (0,0,200) 
grey = (200,200,200)
dark_grey = (220,220,220)
greenBlue = (25,252,180)
menucolours = (0,0,255)
rollover_greenBlue = (190,50,200)
rollover_menucolours = (190,50,200)
buttonSound = pygame.mixer.Sound("button_click_s.wav")
clock = pygame.time.Clock()
background = pygame.image.load('background.jpg')
window = pygame.display.set_mode((width,height))
window.blit(background, (0,0))
pygame.display.update()


font =  pygame.font.Font('FFFFORWA.TTF',20) 
smallText =  pygame.font.Font('FFFFORWA.TTF',20) 


win = pygame.display.set_mode((1920,1080))
outline=True
def text_objects(text, font, colour = None):
    if colour == None:
        textSurf = font.render(text, True, black)
    else:
        textSurf = font.render(text, True, colour)
    return textSurf, textSurf.get_rect()
def button(x,y,width,height,ac,ic,msg, act=None, msgColour=None, font = None): 
    global List 
    mouse = pygame.mouse.get_pos() 
    click = pygame.mouse.get_pressed() 
    if x+width > mouse[0] > x and y+height > mouse[1] > y: 
        pygame.draw.rect(window, ac, (x,y,width,height))
        if click[0] == 1 and act != None: 
            buttonSound.play()
            if act == 'rule': 
                function.rules()
            elif act == 'new':
                function.game()
            elif act == 'end':
                function.end() 
            elif act == 'menu':
                function.menu()
            elif act == 'play1':
                List = 0 
                function.place()
            elif act == 'play2':
                List = 1 
                function.place()
            elif act == 'play3':
                List = 2 
                function.place() 
            elif act == 'play4':
                List = 3 
                function.place()
            elif act == 'play5':
                List = 4 
                function.place() 
    else: 
        pygame.draw.rect(window, ic, (x,y,width,height))      
    if msgColour == None:
        textSurf, textRect = text_objects(msg, smallText, dark_grey)
    else:
        textSurf, textRect = text_objects(msg, smallText, msgColour)
    textRect.center = ((x+(width/2)), (y+(height/2)))
    window.blit(textSurf, textRect)

class function():     
    def game(): 
        global win 
        global letters2 
        global Letters 
        global sen1 
        global sen2 
        global sen3 
        global sen4 
        global sen5 
        global sen6 
        global gameLoop 
        global wordLoop 
        global finalLoop 
        global number
        global sen
        global guesses
        words = ['ABOUT','ABOVE','ABUSE','AUDIO','BEGAN','BASIC','JAZZY','FIZZY','PIZZA','JAKEY','JERKY','CHIPS','CHEWS','CHOMP','CLEAN','DRYER','EIGHT','EQUAL','FLANK','STEAK','FLONG','FOOLS','FOOTY','GUARD'] 
        gameLoop = True 
        pygame.display.update() 
        window.blit(background, (0,0))
        word = []
        win = [] 
        randomWord = random.randint(0,13) 
        word.append(words[randomWord]) 
        letters = list(word[0]) 
        Letters = list(word[0])
        letters2 = []
        y = 0 
        for letter in letters: 
            y = y + 1 
        for letter in range(0,y): 
            letter = random.choice(letters) 
            letters.remove(letter) 
            letters2.append(letter) 
        sen = ['_ ' + '_ ' + '_ ' + '_ ' + '_ ', Letters[0] + ' _ ' + '_ ' + '_ ' + '_ ', Letters[0] + ' ' + Letters[1] + ' _ ' + '_ ' + '_ ',
                Letters[0] + ' ' + Letters[1] + ' ' + Letters[2] + ' _ ' + '_ ', Letters[0] + ' ' + Letters[1] + ' ' + Letters[2] + ' '+ Letters[3] + ' _ ',
                Letters[0] + ' ' + Letters[1] + ' ' + Letters[2] + ' '+ Letters[3] + ' ' + Letters[4]]
        gameLoop = True
        number = 0
        guesses = 5
        text.title(sen[number])
        while gameLoop: 
            if len(Letters) == 0: 
                finalLoop = True 
                while finalLoop: 
                    window.blit(background, (0,0))
                    text.title('YOU WIN!') 
                    button(550,500,250,100, rollover_menucolours, menucolours, 'Play Again', 'new', black, smallText) 
                    button(1250,500,250,100, rollover_menucolours, menucolours, 'Main Menu', 'menu', black, smallText) 
                    pygame.display.update()
                    for event in pygame.event.get():
                        if event.type == pygame.QUIT: 
                            pygame.quit() 

            elif guesses == 0:
                finalLoop = True 
                while finalLoop: 
                    window.blit(background, (0,0))
                    text.title('YOU LOSE')
                    button(550,500,250,100, rollover_menucolours, menucolours, 'Play Again', 'new', black, smallText) 
                    button(1250,500,250,100, rollover_menucolours, menucolours, 'Main Menu', 'menu', black, smallText) 
                    pygame.display.update() 

                    for event in pygame.event.get():
                        if event.type == pygame.QUIT: 

                            pygame.quit() 

            button(width/2-220, height/2+50, 50, 50 ,rollover_menucolours, menucolours, letters2[0], 'play1', (black), smallText)
            button(width/2-120, height/2+50, 50, 50, rollover_menucolours, menucolours, letters2[1], 'play2', (black), smallText) 
            button(width/2-20, height/2+50, 50, 50, rollover_menucolours, menucolours, letters2[2], 'play3', (black), smallText) 
            button(width/2+70, height/2+50, 50, 50, rollover_menucolours, menucolours, letters2[3], 'play4', (black), smallText) 
            button(width/2+170, height/2+50, 50, 50, rollover_menucolours, menucolours, letters2[4], 'play5', (black), smallText) 
            pygame.display.update()



            for event in pygame.event.get(): 
                if event.type == pygame.QUIT: 

                    pygame.quit() 
    def menu(): 

        pygame.mixer.music.load("menu_music.mp3")
        pygame.mixer.music.play()
        mainLoop = True 
        clock.tick(1) 
        while mainLoop: 

            window.blit(background, (0,0)) 

            text.title('lettermatcher.edu') 

            button(550, 500, 250, 100, rollover_menucolours, menucolours, 'START', 'new', black, smallText) 
            button(900, 500, 250, 100, rollover_menucolours, menucolours, 'INSTRUCTIONS', 'rule', black, smallText) 
            button(1250, 500, 250, 100, rollover_menucolours, menucolours, 'QUIT', 'end', black, smallText)

            pygame.display.update() 

            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    mainLoop = False 
                    pygame.quit() 
    def rules(): 
        global ruleLoop 
        ruleLoop = True
        while ruleLoop: 
            window.blit(background, (0,0)) 
            text.title('How to Play')
            text.display_message('The program will give you 5 letters', white, -50) 
            text.display_message('You have to click on the letters in order to create the word', white, 0) 
            text.display_message('If you pick the wrong letter five times you lose.', white, 50) 
            button(1550, 800, 250, 100, rollover_menucolours, menucolours, 'Main Menu', 'menu', black) 
            pygame.display.update() 

            for event in pygame.event.get():
                if event.type == pygame.QUIT:

                    pygame.quit()

    def place(): 
        global number
        global guesses
        if len(Letters) == 0:
                window.blit(background, (0,0)) 
                wordLoop = False 
                text.title('YOU WIN') 
                time.sleep(1) 
                ruleLoop = False
        elif letters2[List] == Letters[0]: 
            if len(Letters) == 5: 
                window.blit(background, (0,0))
                number += 1
                text.title(sen[number])
                Letters.remove(Letters[0])
            elif len(Letters) == 4: 
                window.blit(background, (0,0))
                number += 1
                text.title(sen[number])
                Letters.remove(Letters[0])
            elif len(Letters) == 3: 
                window.blit(background, (0,0))
                number += 1
                text.title(sen[number])
                Letters.remove(Letters[0]) 
            elif len(Letters) == 2:
                window.blit(background, (0,0))
                number += 1
                text.title(sen[number])
                Letters.remove(Letters[0])
            elif len(Letters) == 1: 
                window.blit(background, (0,0))
                number += 1
                text.title(sen[number])
                Letters.remove(Letters[0]) 
        elif letters2[List] not in Letters:
            time.sleep(0.1)
        else:
            guesses -= 1
            window.blit(background, (0,0))
            text.title(sen[number])
            gSen = 'Try again. you have ' + str(guesses) + ' left' 
            text.display_message(gSen, red)
            time.sleep(0.1)

    def end(): 
        pygame.quit() 

class text():

    def display_message(text, colour = None,y = None, x = None): 
        screenText = pygame.font.Font('FFFFORWA.ttf',25)
        if colour == None:
            textSurf, textRect = text_objects(text, screenText)
        else:
            textSurf, textRect = text_objects(text, screenText, colour)
        if y != None:
            if x != None:
                textRect.center = ((width/2+x),(height/2+y))
            else:
                textRect.center = ((width/2),(height/2+y))
        else:
            textRect.center = ((width/2),(height/2))
        window.blit(textSurf, textRect)

    def title(text):
        screenText = pygame.font.Font('FFFFORWA.ttf',80)
        textSurf, textRect = text_objects(text, screenText)
        textRect.center = ((960),(200))
        window.blit(textSurf, textRect)


function.menu()

Ответы [ 2 ]

0 голосов
/ 14 февраля 2020

Причиной ошибки является вызов pygame.quit() в end:

def end(): 
   pygame.quit() 

Примечание. pygame.quit() деинициализирует все модули Pygame.

Настоящей проблемой, однако, является дизайн вашего приложения. Каждый раз, когда нажимается кнопка, вы переходите к следующей функции и уровню игры. Вы никогда не возвращаетесь из функции, вы всегда становитесь все глубже и глубже в стеке вызовов.
Событие нажатия кнопки не должно вызывать функцию напрямую. Нажатие кнопки меняет состояние игры. Основное приложение работает в зависимости от состояния игры и рисует сцену в зависимости от текущего состояния игры.

0 голосов
/ 14 февраля 2020

pygame.quit () не закрывает программу, а выводит на экран, поэтому программа продолжает работать, и это создает проблему с display.update (). Вам следует использовать sys.exit(), который полностью закроет программу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...