Hi again,
I’m not the most knowledgable at Ubuntu Core, I have used it, and it’s still snaps at heart, but I’m hoping there might be someone else who seeing this can help you out more directly, but I thought I’d bump this for you a little whilst I’m here 
With that in mind, my current thoughts are you have both ubuntu-frame and mir-kiosk, which as I understand them, conceptually are the same thing in the stack, albeit ubuntu-frame being the newer of the two.
My general thoughts here are that by having the two, it might be creating a situation where the snap connections don’t work as expected.
E.G., your application snap will define wayland and x11 plugs. In a classic system, these connect to the implicit system slot, because X11/Wayland aren’t provided by snaps.
In Ubuntu Core though, there should be a direct & explicit connection between your application and the GUI snap, because you have two, maybe this isn’t working? It wouldn’t be clear which one should be preferred over the other, and usually connections are 1:1, not always, but these would be. Since you have 2 potential snaps to slot to, I can’t predict how the connections would work here.
Could you let us see the snap connections nwd-python-kiosk output so we can look at where your two plugs are slotting (and ultimately make sure that they infact are). Ideally, I’d suggest you should ensure these are both pointing at Ubuntu Frame and potentially consider removing Mir Kiosk, the assumption for most production systems would likely be one or the other but not both.
Outside this, the direct logical conclusion of the original error message:
Gtk-WARNING **: 15:54:05.165: cannot open display:
Is probably trying to print $WAYLAND_DISPLAY or $DISPLAY, and showing as blank, because they’ve not been set. Once the connections are in place, it’s worth establishing why these are blank. I’m not sure what the modern practise is for setting these in Core (on non-core systems, let the extensions do it for you or in classic it’s not even a thing that needs to be considered), but at the basic level, the variable should exist because in Wayland, it’ll be the name of a Unix Socket for the Wayland connection itself (as a relative path). Without it you’ll have no socket to connect to and would experience what you’re seeing.