Проблема в том, что когда 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()