No matter how tired you are, once you say no you must mean it. So go and remove the child and listen to the tantrum. I tell Liebling "I am not apologising for stopping you: I told you not to do it. You should listen to me. We have to do this now because XYZ/It is dangerous because XYZ."
I had a tantrum all the way home because I refused to let Liebling drive the car home. He played at driving for 15 minutes before I told him he had to go in his seat so we could go home because I needed to make dinner now. I had a tantrum earlier because he isn't allowed to explore where I can't see when I'm not following him: we were out with PiL, SiL, Niece and Nephew. So I couldn't just run off randomly all the time, he had to stay with us sometimes. BUT having said that, those were the first tantrums in about 3 weeks.
I do shout at DS sometimes when I'm cross. But I do apologise for shouting. Not for telling him no - for shouting. And I always ask him to apologise. Especially for hurting me. He says "sorry" and gives me a hug.
DS generally does as he is told to avoid the Lecture, I think. I gave him a 20-minute lecture a couple of weeks back as I pushed him home because he didn't look before going on the road - the BUSY main road with loads of cars on it. I was very cross he forgot all the road safety training we had done. He now stops and says "cars coming?" about 99% of the time now! I don't time out, I hold still and lecture. It really works. And my lectures are looooooong! They always end with "I love you" though - it's important that he knows his behaviour is sub-standard but he is still loved.
Bookmarks