I am a beginner with python, and prompted by my previous question, I was trying to set viewport shading to Solid and View Only Render to True with python. (The goal being to get the script in that answer to work entirely from python without any need for interaction with the GUI)

however, simply typing show_only_render= True or viewport_shade= 'SOLID' in the console results in nothing happening.

From what I can understand from a lot of searching, is that the cursor needs to be in the 3D view for that object to be active.

It is suggested here to loop through all the areas to do this.

I tried doing this and setting the view to camera, shading to solid, and view only render to true.

However, what actually happens is that the view is set to camera, and the image is rendered without changing view only render to True.

Modified version of the script originally written by Adhi in my previous question, with changes suggested by Aldrik in the answer below:

import bpy
import sys                      # read argument from sys.argv
from bpy.app.handlers import persistent

def do_render_opengl(dummy):
    for area in bpy.context.screen.areas:
      if area.type == 'VIEW_3D':
        area.spaces[0].region_3d.view_perspective = 'CAMERA'
      #if area.type == 'SpaceView3D' :
      area.spaces[0].show_only_render = True
      area.spaces[0].viewport_shade = 'SOLID'
    bpy.ops.render.opengl(animation=False, write_still=True, view_context=True)


I have changed the script with Aldrik's improvements, but when I run it with blender -P gl_render.py example.blend, It returns:

File "/home/gandalf3/Blender/Opengl_render.py", line 11, in do_render_opengl
    area.spaces[0].show_only_render = True
AttributeError: 'SpaceInfo' object has no attribute 'show_only_render'

It seems that it's still not in the right context?

  • $\begingroup$ There's an example of changing viewport shading in: Is it possible to change viewport draw mode when navigating?. $\endgroup$
    – Aldrik
    Commented Aug 26, 2013 at 23:18
  • 1
    $\begingroup$ @gandalf3: The two lines below commented conditional must be indented (within first if area.type's block). Their current state made them executed for every area type, not what you intended. $\endgroup$
    – Adhi
    Commented Aug 27, 2013 at 1:52
  • $\begingroup$ @Adhi ah, thanks. I didn't realize that VIEW_3D is SpaceView3D.. it works now :) $\endgroup$
    – gandalf3
    Commented Aug 27, 2013 at 2:29

1 Answer 1


show_only_render and viewport_shade are attributes of the SpaceView3D. So for your usage example you'd make the following change:

-      if area.type == 'SpaceView3D' :
-        show_only_render = True
-        viewport_shade = 'SOLID'
+        area.spaces[0].show_only_render = True
+        area.spaces[0].viewport_shade = 'SOLID'
  • 1
    $\begingroup$ I'd use spaces.active just to make sure, but it'd be good too if first item in any collection is always the active one. $\endgroup$
    – Adhi
    Commented Aug 26, 2013 at 23:37
  • $\begingroup$ @Adhi Docs say it is so. ;) $\endgroup$
    – Aldrik
    Commented Aug 27, 2013 at 0:00
  • $\begingroup$ @Aldrik though this may be the implementation it's still (IMO) semantically better to use spaces.active because that's what you logically care about - the internal representation isn't really important. It also makes it more clear what you're doing (e.g., any reader of the code would be momentarily distracted exactly as was Adhi) and thus more maintainable. $\endgroup$
    – wchargin
    Commented Oct 24, 2013 at 4:15

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .