Thanks all - it wasn't so much an opinion question, rather is it possible in the first place. Turns out it's quite simple and I was over-complicating it. I was trying to create instances of the sub-window class, which in turn was inheriting the entire main window class, trying to call it's own mainloop(), etc etc. Very messy.
For people in the same boat - code the subwindow as if it were a stand-alone main window, but use tk.Toplevel() rather than tk.Tk() to 'start' it within init(), then to call (i.e. open) it you don't need to create an instance, just call it as though it were a function (it will call the class constructor and Toplevel() handles most of the rest).
I have used tkinter to make a complex GUI, with the mainwindow as a class, so I can put function defs anywhere, and the other perks of doing it that way. Currently the simpler subwindows are just defined as normal functions within this class, called like a normal function (and using Tk.Toplevel()).
My questions is - does it make sense to also write these subwindows as classes like the main window (or is it even possible?), or does this just end up making a whole mess? So far I can't figure out an elegant way to do it versus just making the subwindows traditional functions rather than classes... but I know in the long run the "class" way of doing it is better for the main window, so if the subwindows get more and more complex, should I somehow do the same approach?
Tkinter subwindows as classes