We often include a progressCallback option in the Logic constructor that defaults to a noop (e.g. like lambda x: None). That way the logic code can operate with no GUI, e.g. in batch mode, but when the Widget provides a function that does GUI operations the user gets feedback.
You basically have a method in the Widget class that “knows” about the GUI that gets passed into the logic where there is no access to the GUI by default. That way the logic class can be used as needed with different UI feedback or none at all.