Life Drawing Sessions plugin - version 0.9.1 (alpha) - update May 8th '20

I was working on it two days straight :smiley: I used it once already outside of testing and while I thought that progress bar is essential, it actually really isn’t, especially after a few times when you start to get how much time 30s actually is.

I thought it would be nice to, first of all, give something to people that don’t mind one or two little issues or limited (compared to plans) functionality, and maybe get someone test it, too, or share some nice ideas how to improve it.

Basic functionality

How does it work:

  1. Open a new image. Just to be safe, don’t open anything else. Choose your brush; you won’t have time later.
  2. Go to Settings → Dockers → Life Drawing Session.
  3. Press Start button on the bottom of the docker.
  4. Choose a folder with images that you want to use for references.
  5. Choose the time that one reference will be shown on the screen, or one of the class modes
  6. Choose how many images you want to work on.
  7. Press OK.
  8. Draw.
  9. After all images, a new layer will appear with all your drawings.


  • randomized selection of images
  • it will create a group (later: locked and invisible) with your drawing layer and your reference image layer, later you can come back to it, fix it up, spend more time, whatever you want
  • you can/need to use your own images folder
  • it might seem weird at first when something just “takes away” your layer you were painting on, but worry not, it’s not lost. And you should get used to it pretty quickly. Please, if Krita looks like it’s doing something, stop painting and let it do it :stuck_out_tongue: (I haven’t had any issues but who knows).

Known issues

  • the showcase layer at the end is only one row; it should just fill up the canvas nicely
  • it doesn’t filter the files; it will consider just any file an image file, so make sure you use a folder with just png or jpeg images!

Planned for the future:

  • progress bar
  • pause and play
  • saved configurations (can be exchanged with other users)
  • showing max time on the canvas
  • nicer naming of layers
  • create a new image
  • showcase layer more centered


  • Don’t touch Layers docker. The script is taking care of it, I don’t think I made it changes-proof.
  • Or, better, don’t touch anything, just draw (and erase), at least in the quick sessions
  • Make sure you use it on a new image. Changes made by a python script cannot be undone!
  • Don’t open/switch to another image during the lesson (later you’ll be able to pause, but first I need to implement it…).
  • There is same developer’s warning happening all the time when I use it, but it’s fine and I’m gonna get rid of it before 1.0, hopefully.


IMPORTANT You need to download Krita Plus version, 20 April 2020 or newer.
Windows: Krita_Stable_Windows_Build [Jenkins] (take the .zip version, not -setup.exe)
Linux appimage: Krita_Stable_Appimage_Build [Jenkins]
It can also be the beta version (especially if you’re on Mac): First Beta of Krita 4.3.0 Released | Krita
Krita 4.2.9 will freeze when you paint and the timer goes out (I will try to debug it, it might be a problem in my script). Krita Plus older than 20 April 2020 will crash.

Repository (code):

DOWNLOAD: and then use Tools → Scripts → Import Python Plugin…


look great looking forward for the other features

1 Like

Changelog 0.9 -> 0.9.1

  • It’s in a docker now!
    • I guess easier to start the class… but it’s more for the future: pause, play etc.
  • Remembered settings:
    • images number
    • reference images location (directory)
    • (timing/mode isn’t remembered yet)
  • Added a Manual
  • Added class modes, too:
    • 10 min: 8x30s, 3x1min, 1x3min
    • 30 min: 10x30s, 5x1min, 2x5min, 1x10min

Also my sketches from the last class I took:

(This is 30min class - I still cannot figure out those 30s ones :slight_smile: )

Also list of features I plan before 1.0 or 2.0 versions is here (for anyone interested):

For 1.0 the only ones missing are:

  • better showcase layer (positioning, scaling; I need to figure out a good packing algorithm :wink: )
  • default directory should be Pictures
  • better naming of layers
    so it’s pretty close :slight_smile:

Awesome plugin! i’ll have to give it a try some time :slight_smile:

Good job on the sketches, too. Those 30s poses really are hard to do, i usually avoid them altogether.

1 Like

It works great the problem is if you are drawing while the picture is changing Krita hang and crash
May be with the progress bar we could stop drawing soon enouth for the process to work correctly.
Keep doing the good job

1 Like

@Lechat_Fute make sure you’re using either the beta version (4.3.0 beta, link in the main post) or Krita Plus version (link also in the post). Krita 4.2.9 unfortunately might crash I think, and since it’s already released I couldn’t fix it in Krita code. I fixed it for future versions that I described above :slight_smile:

Thanks that did it

1 Like

@tiar looking at your drawings haw do you get your final display to align on 2 row, on my display they stay on one line and the more picture i draw the smaler they get with a waste of empty space on the bottom

Yes, that’s something that I haven’t implemented properly yet and I’m eager to fix, actually. For the display above I just took that resulting layer, selected the second half, moved them below and scaled up.

In future versions it will calculate it better, but I need to think about a good algorithm first. I have some ideas.

1 Like

Yes keep doing the wonderful job.
I am surprised the few people reacting because this an excellent tool to use for warm up

1 Like

I did do a quick test last week and it seems pretty cool so far! :+1:

First time I tried though, I hastily pointed it at my photo folder - but that contains raw files along with the jpegs. So, it kept bringing up a conversion window, and I kept trying to close it… which caused me to end up in an eternal loop of doom… :upside_down_face:

1 Like

Ohh poor thing! :slight_smile:

(I need to make rules for the files, I guess. I don’t reopen them first, so it’s entirely possible for Krita to try to open text files etc… I might just at first just make sure only .png and .jpg/.jpeg files are considered).

1 Like

@tiar I dont know if you are still developping this plugin but for your information i noticed that it is crashing Krita if using the canevas only mode. at the end when compiling the different drawings it seems to be trouble with the size of the canevas.
It is too bad because it is more confortable in canevas only mode.
I use your plug in regularely for warming up and I love it

Looks like a great idea, would love to see a video demo, too ADD to read the thread carefully right now :sweat_smile:

1 Like

@tiar ,I got aware about this wonderful plug-in yesterday only.
I have installed it in KRITA 5 beta 2 without any trouble and the whole process is working out quite smoothly.
Only one problem I am facing here,which is :
Not all reference images are same in dimension,so it is obvious that when they will get opened via this plug in, will set on the canvas in different manner and that’s quite okay.
But the problem is ,doesn’t matter how bigger I am making the canvas area,the imported ref image is adjusting itself to fill most of the canvas area (specially when the canvas and ref image orientation is similar)!!
So in such cases I am hardly getting any reasonable area left open to draw !!

Now I am trying to learn, is this normal ? or I am making any technical mistake here ? or it is behaving this way,because it was not updated for Krita 5 use ?
Can you provide any tip here ?
By the way,thanks again for developing such a wonderful plug in :slight_smile: !

1 Like

I was mostly using it for horizontal canvas with vertical ref images. In the future, I planned to have an option for vertical canvas for horizontal ref images, but for now it mostly works for tye first case. It always takes up exactly 1/2 of the canvas on theleft side.

1 Like

Yes, it is working well in that way.
but problem starts when the canvas and reference area orientation are same.
So that means for now or even in near future,I have to pick or modify the reference images in vertical format first and then use horizontal canvas area for drawing.

Let’s see how I can manage to create such a workflow,without creating too much effort behind modifying the reference images.
Thanks for the input :slight_smile: .

@Tiar Sadely finding that your plugin is not working anymore. The last version of Krita handeling your plugin was 4.4.8, since then it start to bug in different ways. Here is the history. I hope you will find time in the futur to fix the problem.

Krita 4.4.8


working OK
Reference image height of the canevas or 1/2 of the canevas width on the left side
Structure of the layer working OK

Krita 5.0.0


Stop working OK
Reference image height of the canevas but 1/2 of the canevas width on the left side not working anymore
Structure of the layer seems working OK

Since Krita 5.0.2 and up


Unusable, not building the layer structure and script error

Python 3.8.1: C:\Users\Daniel\Desktop\krita-x64-5.0.2\bin\krita.exe
Sat Aug 20 12:20:00 2022

A problem occurred in a Python script. Here is the sequence of
function calls leading up to the error, in the order they occurred.

C:\Users\Daniel\AppData\Roaming\krita\pykrita\life_drawing_session\ in _timeout(self=<life_drawing_session.life_drawing_session_timer.LifeDrawingSessionTimer object>)
84 self.imageId += 1 # to make it from 1
85 if len(self.timersInstructionsList) == 0:
86 self.layersManager.createFinishingItem()
87 self.layersManager.waitForDone()
88 return
self = <life_drawing_session.life_drawing_session_timer.LifeDrawingSessionTimer object>
self.layersManager = <life_drawing_session.life_drawing_session_layers_manager.LifeDrawingSessionLayersManager object>
self.layersManager.createFinishingItem = >

C:\Users\Daniel\AppData\Roaming\krita\pykrita\life_drawing_session\ in createFinishingItem(self=<life_drawing_session.life_drawing_session_layers_manager.LifeDrawingSessionLayersManager object>)
36 self._hideCurrentPaintingLayer(doc)
37 nodesList = self._getListOfRelevantNodes(doc)
38 self._createShowcaseLayer(doc, nodesList)
39 doc.waitForDone()
40 doc.refreshProjection()
self = <life_drawing_session.life_drawing_session_layers_manager.LifeDrawingSessionLayersManager object>
self._createShowcaseLayer = >
doc = <PyKrita.krita.Document object>
nodesList = []

C:\Users\Daniel\AppData\Roaming\krita\pykrita\life_drawing_session\ in _createShowcaseLayer(self=<life_drawing_session.life_drawing_session_layers_manager.LifeDrawingSessionLayersManager object>, doc=<PyKrita.krita.Document object>, nodesList=[])
156 margin = 1.1
158 rowsNum, columnsNum, scaleNum = self._findCorrectScaleForShowcase(len(copies), width, height, doc.width(), doc.height())
160 if scaleNum == 0:
rowsNum undefined
columnsNum undefined
scaleNum undefined
self = <life_drawing_session.life_drawing_session_layers_manager.LifeDrawingSessionLayersManager object>
self._findCorrectScaleForShowcase = >
builtinlen =
copies = []
width = 0
height = 0
doc = <PyKrita.krita.Document object>
doc.width =
doc.height =

C:\Users\Daniel\AppData\Roaming\krita\pykrita\life_drawing_session\ in _findCorrectScaleForShowcase(self=<life_drawing_session.life_drawing_session_layers_manager.LifeDrawingSessionLayersManager object>, nodesCount=0, wmax=0, hmax=0, w=3508, h=1754)
228 def _findCorrectScaleForShowcase(self, nodesCount, wmax, hmax, w, h):
229 ratioOri = wmax/hmax
230 ratio = w/h
231 # how many rows: very naive implementation
ratioOri undefined
wmax = 0
hmax = 0
ZeroDivisionError: division by zero
cause = None
class = <class ‘ZeroDivisionError’>
context = None
delattr = <method-wrapper ‘delattr’ of ZeroDivisionError object>
dict = {}
dir =
doc = ‘Second argument to a division or modulo operation was zero.’
eq = <method-wrapper ‘eq’ of ZeroDivisionError object>
format =
ge = <method-wrapper ‘ge’ of ZeroDivisionError object>
getattribute = <method-wrapper ‘getattribute’ of ZeroDivisionError object>
gt = <method-wrapper ‘gt’ of ZeroDivisionError object>
hash = <method-wrapper ‘hash’ of ZeroDivisionError object>
init = <method-wrapper ‘init’ of ZeroDivisionError object>
init_subclass =
le = <method-wrapper ‘le’ of ZeroDivisionError object>
lt = <method-wrapper ‘lt’ of ZeroDivisionError object>
ne = <method-wrapper ‘ne’ of ZeroDivisionError object>
new =
reduce =
reduce_ex =
repr = <method-wrapper ‘repr’ of ZeroDivisionError object>
setattr = <method-wrapper ‘setattr’ of ZeroDivisionError object>
setstate =
sizeof =
str = <method-wrapper ‘str’ of ZeroDivisionError object>
subclasshook =
suppress_context = False
traceback =
args = (‘division by zero’,)
with_traceback =

The above is a description of an error in a Python program. Here is
the original traceback:

Traceback (most recent call last):
File “C:\Users\Daniel\AppData\Roaming\krita\pykrita\life_drawing_session\”, line 86, in _timeout
File “C:\Users\Daniel\AppData\Roaming\krita\pykrita\life_drawing_session\”, line 38, in createFinishingItem
self._createShowcaseLayer(doc, nodesList)
File “C:\Users\Daniel\AppData\Roaming\krita\pykrita\life_drawing_session\”, line 158, in _createShowcaseLayer
rowsNum, columnsNum, scaleNum = self._findCorrectScaleForShowcase(len(copies), width, height, doc.width(), doc.height())
File “C:\Users\Daniel\AppData\Roaming\krita\pykrita\life_drawing_session\”, line 229, in _findCorrectScaleForShowcase
ratioOri = wmax/hmax
ZeroDivisionError: division by zero