If I were to convert this part to MVC I would have to bind button events for each FilterPanel instance in my controller (and not in filterPanel)
Not necessary! The philosophy and practice of MVC does not imply that “views” are elementary widgets; your FilterPanel may well be considered / implemented as a "rich / composite" widget that generates its own "events" of a higher level (directed to the controller) and is updated accordingly. Thus, this composite widget can have handlers for lower-level “events” and synthesize higher-level events from them by sending them to the controller; the controller does not need to know or care about each button, etc., namely, events with a higher abstraction that it receives, such as "the user wants to select a directory for target X" or "the user wants to enter text for target Y", - and answer them, telling what to do.
The key point is that the view does not make "semantic" decisions based on the events that it processes, and never sends any command to the model - the controller is an indispensable "intermediary" for all such interactions.
For an analogy, keep in mind that the lowest GUI level has very low level events, such as “left mouse button down” and “left mouse button up” - “button panel widget” responds directly to them, changing the appearance of the button (“visual” solution rather than “strategic”), and ultimately, if and when necessary, an event with a higher abstraction is synthesized, such as “button click” (when a mouse button is clicked without an intermediate mouse movement, invalid, for example click hypothesis). The latter is then sent to any higher level to “respond” to button presses.
Likewise, your rich / composite widgets can accept such events and synthesize higher abstractions that the controller should respond to. (The same abstract event can be triggered by pressing a button, selecting a menu, certain keystrokes ... the controller does not care about these "visual" lower-level considerations, that the work of the view / widget and the view / widget does not contain hard " strategic "decisions and actions for such user interactions that the task of the controller).
Separation of problems helps with problems such as testing and application flexibility; this is not unheard of, because such advantages can be bought at a price when there is still some alternative code where everything is hardcoded ... but if you choose MVC, you mean that the price is worth the price.
wx may not be an ideal basis for implementing this, but you can subclass wx.Event - or you can use a separate event system, such as pydispatcher, for events with higher abstraction that flow between the individual subsystems to separate the controller from a specific choice GUI I usually use Qt, whose signal / slot model, IMNSHO, expands / scales better than regular GUI event systems. But this is a different choice and a different problem.