Почему переменные не определены в одной и той же функции, но в разных операторах if / else нелокальны друг для друга? - PullRequest
0 голосов
/ 27 апреля 2018

В этой функции я пытаюсь определить переменную, также определенную в этой функции, но в разных операторах if. Я получаю

UnboundLocalError: local variable 'num' referenced before assignment

Всякий раз, когда я запускаю свою функцию. Вот код ниже:

def draw():
        global show_image

        win.fill([255,255,255])

        pygame.draw.rect(win, [0,0,0], (760, 250, 264 , 200), 1)




        if 1024 >= cursor[0] >= 760 and 450 >= cursor[1] >= 250:
            pygame.draw.rect(win, [128,128,128], (761, 251, 262 , 198))
            if click[0]:
                num = random.randint(0,17)
                show_image = True

        if show_image == True:
            win.blit(images[num], (0,0))
            win.blit(font.render(captions[num], True, [0,190,0]), (660,
550))

        win.blit(button_text, (780,270))


        pygame.display.update()

Почему это происходит?

Ответы [ 2 ]

0 голосов
/ 27 апреля 2018

Проблема в том, что когда show_image имеет значение true, но 1024 >= cursor[0] >= 760 and 450 >= cursor[1] >= 250 удовлетворяется, то win.blit(images[num], 0, 0) исполняется ПЕРЕД определением num (потому что num определяется в первом операторе if). Чтобы исправить это, нужно объявить num вне функции, а затем выполнить global num внутри функции if.

Исправленный код:

num = random.randint(0, 17)
def draw():
    global show_image
    global num
    win.fill([255,255,255])
    pygame.draw.rect(win, [0,0,0], (760, 250, 264 , 200), 1)
    if 1024 >= cursor[0] >= 760 and 450 >= cursor[1] >= 250:
        pygame.draw.rect(win, [128,128,128], (761, 251, 262 , 198))
        if click[0]:
            num = random.randint(0,17)
            show_image = True
    if show_image == True:
        win.blit(images[num], (0,0))
        win.blit(font.render(captions[num], True, [0,190,0]), (660,550))
    win.blit(button_text, (780,270))
    pygame.display.update()
0 голосов
/ 27 апреля 2018

Если глобальная переменная show_image равна True, когда функция вызывается, но курсор находится за пределами, определенных вашим первым оператором if (или в границах, но click[0] равно False), тогда num никогда не будет определен, поэтому при выполнении оператора if show_image == True: он пытается использовать num до того, как num когда-либо будет присвоено значение.

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