Hmm… First of all, I fear that you’ve significantly overcomplicated this implementation; a simpler approach might give you less trouble. ^^;
That said, I think that I see the problem. If I’m reading your code correctly:
You first load a highlight and highlight state from pickle, calling them HL and and HLstate respectively.
You then go on to define the new highlights and highlight states for the current iteration, calling them each HL and HLstate - thus replacing each previous reference held by HL and HLstate, starting with the ones that you loaded.
If there are any new highlights at all, then by the time that you reach the code that removes the old highlight you are actually telling it to remove the most recent highlight.
As things stand, the simplest solution might be to rename the versions that you’re loading from pickle - call them “HLold” and “HLstateOld”, perhaps - and then remove those.
However, if I may suggest:
Should there ever be more than one highlight?
If so, then I note that you seem to reload only the first from the pickle file; any others are presumably missed and thus never removed.
If, however, there should never be more than one highlight, then I recommend simply keeping a single OnscreenImage for that highlight. When there is no highlight, hide it (HL.hide()), and when a highlight should be present, show it (HL.show()), first placing in the appropriate position.
This would also allow you to get rid of the pickling involved in your current implementation, which I fear is a significant element of the aforementioned overcomplication.