wxPython tamaño mínimo de Marco con un Panel

wxpython 2.8.11.0, python 2.7

Si pongo un Sizer con algunos controles directamente en un Frame como

 import wx app=wx.App() frm = wx.Frame(None, title='title') sizer = wx.BoxSizer(wx.HORIZONTAL) sizer.Add(wx.SpinCtrl(frm)) sizer.Add(wx.SpinCtrl(frm)) frm.SetSizerAndFit(sizer) frm.Show() app.MainLoop() 

El Frame tendrá automáticamente un tamaño mínimo correcto para contener el Sizer y no es posible hacerlo más pequeño. Si hay un Panel en medio (como es necesario para tabular entre controles) esto no funciona, la ventana puede hacerse demasiado pequeña.

 import wx app=wx.App() frm = wx.Frame(None, title='title') pan = wx.Panel(frm) sizer = wx.BoxSizer(wx.HORIZONTAL) sizer.Add(wx.SpinCtrl(pan)) sizer.Add(wx.SpinCtrl(pan)) pan.SetSizerAndFit(sizer) frm.Show() app.MainLoop() 

Además, se frm.Fit() y frm.SetMinSize(frm.GetEffectiveMinSize()) para obtener el mismo comportamiento. Código Completo:

 import wx app=wx.App() frm = wx.Frame(None, title='title') pan = wx.Panel(frm) sizer = wx.BoxSizer(wx.HORIZONTAL) sizer.Add(wx.SpinCtrl(pan)) sizer.Add(wx.SpinCtrl(pan)) pan.SetSizerAndFit(sizer) frm.Fit() frm.SetMinSize(frm.GetEffectiveMinSize()) frm.Show() app.MainLoop() 

Estoy bien con frm.Fit() , pero no me gusta frm.SetMinSize(frm.GetEffectiveMinSize()) . ¿No hay una mejor solución para que el Frame considere automáticamente el tamaño mínimo del Panel como lo hizo antes con el Sizer ? Estoy considerado con lo que sucede si el EffectiveMinSize cambia después de agregar otro control al medidor.

Editar: Al parecer

 panel.SetSizerAndFit(sizer) frm.Fit() frm.SetMinSize(frm.GetEffectiveMinSize()) 

debe ser reemplazado por

 panel.SetSizer(sizer) sizer.SetSizeHints(frm) 

que se ve un poco más limpio. Así que en total esto parece

 import wx app=wx.App() frm = wx.Frame(None, title='title') pan = wx.Panel(frm) sizer = wx.BoxSizer(wx.HORIZONTAL) sizer.Add(wx.SpinCtrl(pan)) sizer.Add(wx.SpinCtrl(pan)) pan.SetSizer(sizer) sizer.SetSizeHints(frm) frm.Show() app.MainLoop() 

¿Es esta la forma preferida de hacer esto?

Si los widgets se agregan más tarde, incluso el primer enfoque con el Sizer directamente en el Frame no funciona correctamente sin intervención, por lo que creo que es una pregunta totalmente diferente.

La forma más elegante (IMHO) se da en la respuesta de phineas. Es un poco ineficiente tener un medidor adicional que de otro modo no se necesita, pero no creo que sea realmente notable.

Algunas personas llaman a SetSizeHints() manualmente, como en su último ejemplo, y esto también funciona y podría ser más claro (siempre que use un medidor adicional, siento la necesidad de dejar un comentario que explique por qué no se debe eliminar).

Desafortunadamente, no hay una mejor manera y no estoy seguro de si podemos agregar una porque necesita hacer algo con todo el panel, el medidor y el marco, y esto significa que no puede hacerlo con una sola llamada de método sin pasando parámetros no relacionados a ella. Es decir, podríamos tener algo como

 panel.SetSizerAndFitParent(sizer, frame); 

pero no está realmente claro si esto sería mejor.

¿Qué hay de introducir un medidor que administre el contenido del marco (por ejemplo, el panel)? Como no incluiste un ejemplo mínimo, todavía no lo he probado.

 frameSizer = wx.BoxSizer(wx.VERTICAL) frameSizer.Add(panel) frm.SetSizerAndFit(frameSizer)