nonlocal declaration not allowed at module level , почему вызывается данная ошибка

Не знаю почему , но выводиться данная ошибка , если я уберу nonlocal pos , то программа просто не будет понимать что такое pos ( P.S : global pos , в данном случай не работает )

import pygame
import sys  
 
sc = pygame.display.set_mode((600,400) , pygame.RESIZABLE)

pygame.display.set_caption("Game")
FPS = pygame.time.Clock()
Blue = (0,0,255)
White = (255,255,255)

x = 300
y = 200  

speed = 5   
Running = True
move = 0

flStartDraw = False   
sp = None
sc.fill(White)
pygame.display.update()


**текст, выделенный жирным шрифтом**
while Running:

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit() 
        if event.type == pygame.MOUSEBUTTONDOWN and event.button == 1:
            flStartDraw = True    
            sp = event.pos
        if event.type == pygame.MOUSEMOTION:
            if flStartDraw:
                nonlocal pos
                pos = event.pos
                width = pos[0] - sp[0]
                height = pos[1] - sp[1]

                sc.fill(White)
                pygame.draw.rect(sc, Blue , (sp[0] , sp[1],width,height))
                pygame.display.update()

            if pos[0] - sp[0] <= 0:
                width = sp[0] - pos[0]
                height = pos[1] - sp[1]
                pygame.draw.rect(sc, Blue , (pos[0] , sp[1] , width , height))
        if event.type == pygame.MOUSEBUTTONUP and event.type == 1:
            flStartDraw = False    
    FPS.tick(60)

Ответы (2 шт):

Автор решения: Сергей

Оператор nonlocal пытается вывести переменную pos в глобальную область видимости, что ему не разрешено по документации. См. https://docs.python.org/3/reference/simple_stmts.html#nonlocal Попробуй global.

→ Ссылка
Автор решения: CrazyElf

nonlocal pos тут вообще не нужно. У вас проблема в другом - в том, что переменная pos ничем не инициализирована в самом начале. Я бы предложил её инициализировать None, так же, как вы делаете с переменной sp:

sp = None
pos = None # <- добавлено

И далее прежде чем использовать значение pos проверяйте сначала, что там не None:

            if pos != None and pos[0] - sp[0] <= 0:
               ^^^^^^^^^^^^^^^ вот эта проверка добавлена в if

Сейчас у вас при движении мыши управление попадает в этот if когда переменная pos вообще не задана, там ничего нет. Инициализация pos каким-то значением происходит только после нажатия кнопки мыши.

→ Ссылка