Hmm, that’s because a texture that’s applied to a parent node will also propagate to a child node. You can disable this if you use an override value with setTexture, ie. setTexture(texture, 1).
I think decal=True will only work if the text and the frame of the same OnscreenText object are fighting. In this case, you could try self.text.setDepthOffset(1).
In that case, the better way to eliminate z-fighting is probably to just give it a very slight positional offset so that it’s just a tiny bit in front of the other card. Depth offsets are known not to show reliable behaviour between graphics cards.