import wx
from copy import deepcopy

class MainFrame(wx.Frame):
    def __init__(self, parent):
        wx.Frame.__init__(self, id=-1, parent=parent, size=wx.Size(600, 500),
                          title='Test')

        self.minimized = False

        self.panel = wx.Panel(self, id=-1, pos=(200, 300))
        self.button = wx.Button(self.panel, id=-1, label='button',
                                 pos=wx.Point(20, 56), size=wx.Size(87, 28))
        self.button.Bind(wx.EVT_BUTTON, self.OnButton, id=-1)

        self.Bind(wx.EVT_ICONIZE, self.OnMinimize)

        self.subframes = []

        for f in range(0, 3):
            self.subframes.append(MyFrame(self, title=f'frame{f+1}', name=f'frame{f+1}'))
            self.subframes[f].Bind(wx.EVT_CLOSE, self.OnClose)
            self.subframes[f].Bind(wx.EVT_SET_FOCUS, self.OnSetFocus)

        self.orderList = []
        self.forbidFlag = False

    def OnMinimize(self, event):
        if self.IsIconized():
            self.forbidFlag = True
            print(f'minimized: {self.orderList}')
            for f in self.orderList:
                frame = self.subframes[f - 1]
                frame.Hide()
        else:
            print(f' restored: {self.orderList}')
            fList = deepcopy(self.orderList)
            for f in fList:
                frame = self.subframes[f - 1]
                frame.Iconize(False)
                frame.Show()
                frame.Raise()
                print(frame.Label)
            self.forbidFlag = False

    def OnButton(self, event):
        for f in self.subframes:
            f.Show()

        event.Skip()

    def OnClose(self, event):
        self._delete_orderlist_item(event, 'is closed')
        event.Skip()

    def OnSetFocus(self, event):
        if self.forbidFlag:
            return

        num = self._delete_orderlist_item(event, 'has focus')
        self.orderList.append(num)

    def _delete_orderlist_item(self, event, msg):
        num = int(event.EventObject.Name[-1])
        if num in self.orderList:
            index = self.orderList.index(num)
            del self.orderList[index]
        print(f'frame {num} {msg}')
        return num


class MyFrame(wx.Frame):
    def __init__(self, parent, title, name):
        style = wx.SYSTEM_MENU | wx.CAPTION | wx.CLOSE_BOX | \
                wx.MINIMIZE_BOX | wx.FRAME_NO_TASKBAR | wx.FRAME_FLOAT_ON_PARENT
        wx.Frame.__init__(self, id=-1, parent=parent, size=wx.Size(300, 200),
                          title=title, style=style, name=name)

if __name__ == '__main__':
    app = wx.App()
    frame = MainFrame(None)
    frame.Show()
    app.MainLoop()