As opposed to trying to fit multiple icons into the same ico file, you can take a single icon of max resolution size for Windows (96x96x256) and build it directly into the EXE when compiled, then reference the EXE for the icon. Windows will automatically downscale an icon from an executable, but wont if it's a standalone .ico file (which is why it requires multiple sizes in the same file).
Change setup.py to have:
setup(windows=[
{
"script": "guiminer.py",
"icon_resources": [(0, "guiminer.ico")]
}
],
Then, in guiminer.py, in your frame subclass add:
if os.path.exists("guiminer.exe"):
self.SetIcon(wx.Icon("guiminer.exe",wx.BITMAP_TYPE_ICO))
Windows should handle it natively after that, as long as the icon is in position 0.