Actuator - Automate Sequences of Actions : Krita Plugin [paid]

​Actuator, is a plugin with a flying docker that you can customize with any action you want.
You can create a sequence of actions to speed up your workflow.
There is no limit on the number of actions you can chain in a sequence.
Plugin version: v0.2

The plugin was designed for Krita 4.4.8 and was tested on Windows 10. However, given that plugin is Python-based it should work on other platforms too. The plugin goes with a small guide on how to use all the features.

Available on itchio: Actuator - Automate Sequences of Actions : Krita Plugin by Yet Another Painter
Available on Gumroad: Actuator - Automate Sequences of Actions : Krita Plugin

The video with me explaining how the plugin works:

Using action can easily lead to problems. Because krita has many types of layers. Not all actions can be used. And when that happens, krita crashes … I guess this is one of the reasons for limiting “task sets docker”. It would be nice to add a simple decision (for example, only for paint layers)
Another thing is that I’m not sure if there is a problem with nodes. I’ve worked on a simple action script in 4.x that had something like “activate previous layer”. It worked fine in 4.0, but after 5.0, even if I activated the previous layer, it would still operate on the original layer. This may be a change in the nodes, but I haven’t looked into it and hope it doesn’t have an effect on this plugin.
Where are all these definitions saved? I don’t want plugin updates to lose my settings. It would be nice if it could be shared with others as something like a resource
For the interface, I’d like to add a separator like the one in the “toolbar”.
Finally, not everything I want has an icon. I’d like to define which ones appear in docker and others in tools/yap. or have shortcuts or something like that.

1 Like

Thanks for feedback! I will incorporate these (at least most crucial) in next update.

I won’t lie, I had plans to make a plugin sortta like this after I finished what I was doing. This is very depressing.



You can always build your own version…

Does people starting to create new text/code editor are depressed because another already exists? No :slight_smile:
Does people starting to create new incredible software are depressed because another already exists? No :slight_smile:

For users, having more than one possible choice for a tool is always a good thing.
There’s many possibility in implementation of a such tool: from a code point of view AND from user point of view (use different interface, use different possibilities - conditional actions for example - or many things can be implemented)

Then, just look this as an additional motivation to do something that fit your own vision of stuff :wink:



Does it include the lch of pigment.o? I’ve been finding lch more and more in line with my expectations lately

Photobash Images. But please be on topic I don’t want to derail the thread. I will probably do another kind of plugin just don’t know what yet.

I just actually tested it. I thought it used the action from the “action dictionary”, but it’s actually a bit different. Action is translated and even includes actions from other plugins (very good). This also leads to a problem: I cannot search, no matter Chinese or English. When I press enter, the error appears.

Python 3.8.1: C:\GAMES\STEAM\steamapps\common\Krita\krita\bin\krita.exe
Fri Nov 12 14:17:38 2021

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\123\AppData\Roaming\krita\pykrita\actuator\ in handle_add_action(self=<actuator.plugin.AddOrEditSequence object>)
  291         chosen_action = self.actions_list_dialog.chosen_action
  292         if len(self.sequence['actions']) == 0 and self.button_icon.icon().isNull():
  293             icon = Krita.instance().action(chosen_action['name']).icon()
  295             if not icon.isNull():
icon undefined
global Krita = <class 'PyKrita.krita.Krita'>
Krita.instance = <built-in function instance>
).action undefined
chosen_action = None
).icon undefined
TypeError: 'NoneType' object is not subscriptable
    __cause__ = None
    __class__ = <class 'TypeError'>
    __context__ = None
    __delattr__ = <method-wrapper '__delattr__' of TypeError object>
    __dict__ = {}
    __dir__ = <built-in method __dir__ of TypeError object>
    __doc__ = 'Inappropriate argument type.'
    __eq__ = <method-wrapper '__eq__' of TypeError object>
    __format__ = <built-in method __format__ of TypeError object>
    __ge__ = <method-wrapper '__ge__' of TypeError object>
    __getattribute__ = <method-wrapper '__getattribute__' of TypeError object>
    __gt__ = <method-wrapper '__gt__' of TypeError object>
    __hash__ = <method-wrapper '__hash__' of TypeError object>
    __init__ = <method-wrapper '__init__' of TypeError object>
    __init_subclass__ = <built-in method __init_subclass__ of type object>
    __le__ = <method-wrapper '__le__' of TypeError object>
    __lt__ = <method-wrapper '__lt__' of TypeError object>
    __ne__ = <method-wrapper '__ne__' of TypeError object>
    __new__ = <built-in method __new__ of type object>
    __reduce__ = <built-in method __reduce__ of TypeError object>
    __reduce_ex__ = <built-in method __reduce_ex__ of TypeError object>
    __repr__ = <method-wrapper '__repr__' of TypeError object>
    __setattr__ = <method-wrapper '__setattr__' of TypeError object>
    __setstate__ = <built-in method __setstate__ of TypeError object>
    __sizeof__ = <built-in method __sizeof__ of TypeError object>
    __str__ = <method-wrapper '__str__' of TypeError object>
    __subclasshook__ = <built-in method __subclasshook__ of type object>
    __suppress_context__ = False
    __traceback__ = <traceback object>
    args = ("'NoneType' object is not subscriptable",)
    with_traceback = <built-in method with_traceback of TypeError object>

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\123\AppData\Roaming\krita\pykrita\actuator\", line 293, in handle_add_action
    icon = Krita.instance().action(chosen_action['name']).icon()
TypeError: 'NoneType' object is not subscriptable


In addition, “sequence title” requires at least 3 Chinese characters. I hope it can be changed. 2 Chinese characters can solve many titles .I found that English is also three letters. It would be much better if you could change it to three bytes

Will “restart” change? It’s too much trouble to restart every time I set it up

This interface may require a “move up” “move down” button

Many actions do not work (filters, etc.) may be because there are no parameters…
The added parameter I want: fill color for the layer (black white 128gray RGB CMY. It would be better if you can enter a value)

1 Like

Thanks for using the plugin!

Oh. This is really interesting.

I will fix the sequence length name.

Regarding the error, yes. I need to carefully debug that. Thanks for reporting.

Regarding directory. Yes, the pluging actually looks for actions directly from krita itself. And if some other plugins have some actions, Actuator will find them and you can use these actions in your sequence.

1 Like

Regarding restart. Yes, I will fix it in the next update. And the changes will be applied right away.

I also have an idea to store the sequence for purpose of sharing or storing for later. For now sequences are stored in krita configuration which user should not bother looking into.

And as a last little thing, I will also include the ability to add separator.

And the biggest thing (teaser alert) which might appear on next updates, I am thinking about developing some sort of a mechanism to have an information on what actions can be chained one after another and which not.

1 Like

Your videos are tagged as “for kids”, so i can’t watch them later. I have interest to know what is this about. and the possibilities.

Hm. I thought it is an option that unblocks the content for those who under 18.

In short the video tells about plugin and its capabilities.
It goes on what it can do and how to make sequences of actions. There are examples and explanations.

The main feature of the plugin is that you can create sequences of actions to perform a particular task.

For instance: copy layer - desaturate - invert - convert to mask.

So with a plugin instead of clicking buttons to achieve that, you can just make a sequence and use it with one click. And the panel lets you create as many sequences as you want.

Actuator got updated to v0.2 :slight_smile:

Full changelog can be found here: [v0.2] Actuator : Krita plugin new version - Actuator - Automate Sequences of Actions : Krita Plugin by Yet Another Painter

In general, the plugin should be much more convenient to use :slight_smile:


Can I assign custom shortcuts to Actuator sequences?

Hello Mark!

Thanks for choosing Actuator.

This is a feature I am currently working on.



This plugin is very nice. thanks @yetanotherpainter . When I add the commands one after the other, it passes without doing some of them. Could it be because it’s too fast? Do I need to add a time delay between commands? Even if I use separator, it can’t do “paste to active layer”.
maybe you can add a delay feature .(milliseconds)


Yes. There is no way for not to know for sure that action is complete.

The workaround is to add a delay between commands.

Though, i removed this feature in latest update. Seems like i need to revive it again. I will add it in the next update :hugs:

1 Like