Pregunta

Construí una GUI usando wx.glade. Parte de esta GUI es una sección para ingresar contraseñas y luego haga clic en un botón para validarlas. Para hacer esta sección, utilicé un Sizer de cuadrícula. No todas las celdas de la cuadrícula necesitaban tener un botón o campo, por lo que los llené con componentes WX.Panel como espaciadores.

Lo que sucede es que, al atravesar los campos y botones TX, todo está bien, pero los espaciadores wx.panel también son parte de esa lista de pestañas. Lo que quiero hacer es hacer que no sean seleccionables.

class MyFrame(wx.Frame):
   def __init__(self, *args, **kwds):
       # begin wxGlade: mainFrame.__init__
       kwds["style"] = wx.DEFAULT_FRAME_STYLE
       wx.Frame.__init__(self, *args, **kwds)
       self.panelLower = wx.Panel(self, -1)
       self.panelUpper = wx.Panel(self, -1)
       self.sizerPassword_staticbox = wx.StaticBox(self.panelLower, -1, "Password Settings")
       self.sizerInstall_staticbox = wx.StaticBox(self.panelLower, -1, "Install Actions")
       self.sizerStatus_staticbox = wx.StaticBox(self.panelUpper, -1, "Status")
       self.mainStatusbar = self.CreateStatusBar(1, 0)

       #Status List
       self.statusListCtrl = wx.ListCtrl(self.panelUpper, -1, style=wx.LC_REPORT|wx.SUNKEN_BORDER)
       self._init_coll_statusListCtrl_Columns(self.statusListCtrl)

       #Password Settings
       self.stInfraSystem = wx.StaticText(self.panelLower, -1, "infra.system")
       self.txInfraSystem = wx.TextCtrl(self.panelLower, -1, "Enter Password")
       self.btnInfraSystem = wx.Button(self.panelLower, -1, "Validate")
       self.stIwpcSystem = wx.StaticText(self.panelLower, -1, "iwpc.system")
       self.txIwpcSystem = wx.TextCtrl(self.panelLower, -1, "Enter Password")
       self.btnIwpcSystem = wx.Button(self.panelLower, -1, "Validate")
       self.stIwpcIwpcdba = wx.StaticText(self.panelLower, -1, "iwpc.iwpcdba")
       self.txIwpcIwpcdba = wx.TextCtrl(self.panelLower, -1, "Enter Password")
       self.btnIwpcIwpcdba = wx.Button(self.panelLower, -1, "Validate")
       self.stLdapOc4jadmin = wx.StaticText(self.panelLower, -1, "ldap.oc4jadmin")
       self.txLdapOc4jadmin = wx.TextCtrl(self.panelLower, -1, "Enter Password")
       self.btnLdapOc4jadmin = wx.Button(self.panelLower, -1, "Validate")
       self.stLdapOrcladmin = wx.StaticText(self.panelLower, -1, "ldap.orcladmin")
       self.txLdapOrcladmin = wx.TextCtrl(self.panelLower, -1, "Enter Password")
       self.btnLdapOrcladmin = wx.Button(self.panelLower, -1, "Validate")
       self.stIasAdmin = wx.StaticText(self.panelLower, -1, "ias_admin")
       self.txIasAdmin = wx.TextCtrl(self.panelLower, -1, "Enter Password")
       self.btnIasAdmin = wx.Button(self.panelLower, -1, "Validate")
       self.stIwpcadmin = wx.StaticText(self.panelLower, -1, "iwpcadmin")
       self.txIwpcadmin = wx.TextCtrl(self.panelLower, -1, "Enter Password")
       self.btnIwpcadmin = wx.Button(self.panelLower, -1, "Validate")
       self.panel_1 = wx.Panel(self.panelLower, -1)
       self.panel_2 = wx.Panel(self.panelLower, -1)
       self.btnValidateAll = wx.Button(self.panelLower, -1, "Validate All")

       #Install Actions
       ##SSp List
       self.olvSSP = ObjectListView(self.panelLower, -1, style=wx.LC_REPORT|wx.SUNKEN_BORDER)
       #olvColumns = ColumnDefn("Available SSPs", "left", 200, valueGetter="name")
       #self.olvSSP.SetColumn(olvColumns)
       self._init_coll_olvSSP_Columns()
       self.olvSSP.CreateCheckStateColumn()

       self.installSpacer0 = wx.Panel(self.panelLower, -1)
       self.installSpacer1 = wx.Panel(self.panelLower, -1)
       self.installSpacer2 = wx.Panel(self.panelLower, -1)
       self.installSpacer3 = wx.Panel(self.panelLower, -1)
       self.installSpacer4 = wx.Panel(self.panelLower, -1)
       self.panel_8 = wx.Panel(self.panelLower, -1)
       self.panel_9 = wx.Panel(self.panelLower, -1)
       self.btnBeginInstall = wx.Button(self.panelLower, -1, "Begin Install")

       self.__set_properties()
       self.__do_layout()

       self.Bind(wx.EVT_BUTTON, self.onBtValidateInfraSystem, self.btnInfraSystem)
       self.Bind(wx.EVT_BUTTON, self.onBtValidateIwpcSystem, self.btnIwpcSystem)
       self.Bind(wx.EVT_BUTTON, self.onBtValidateIwpcIwpcdba, self.btnIwpcIwpcdba)
       self.Bind(wx.EVT_BUTTON, self.onBtValidateLdapOc4jadmin, self.btnLdapOc4jadmin)
       self.Bind(wx.EVT_BUTTON, self.onBtValidateLdapOrcladmin, self.btnLdapOrcladmin)
       self.Bind(wx.EVT_BUTTON, self.onBtValidateIasAdmin, self.btnIasAdmin)
       self.Bind(wx.EVT_BUTTON, self.onBtValidateIwpcadmin, self.btnIwpcadmin)
       self.Bind(wx.EVT_BUTTON, self.onBtValidateAll, self.btnValidateAll)
       self.Bind(wx.EVT_BUTTON, self.onBtBeginInstall, self.btnBeginInstall)
       # end wxGlade

   def _init_coll_statusListCtrl_Columns(self, parent):
       # generated method, don't edit
       parent.InsertColumn(col=0, format=wx.LIST_FORMAT_LEFT,
             heading=u'Timestamp', width=200)
       parent.InsertColumn(col=1, format=wx.LIST_FORMAT_LEFT,
             heading=u'Action', width=200)
       parent.InsertColumn(col=2, format=wx.LIST_FORMAT_LEFT,
             heading=u'Result', width=400)

   def _init_coll_olvSSP_Columns(self, data=None):
       self.olvSSP.SetColumns([
           ColumnDefn("Available SSPs", "left", 200, "name"),
       ]) 

   def __set_properties(self):
       # begin wxGlade: mainFrame.__set_properties
       self.SetTitle("SSP Installer")
       self.mainStatusbar.SetStatusWidths([-1])
       # statusbar fields
       mainStatusbar_fields = ["MyFrame_statusbar"]
       for i in range(len(mainStatusbar_fields)):
           self.mainStatusbar.SetStatusText(mainStatusbar_fields[i], i)
       # end wxGlade

   def __do_layout(self):
       # begin wxGlade: mainFrame.__do_layout
       mainSizer = wx.GridSizer(2, 1, 0, 0)
       sizerLower = wx.GridSizer(1, 2, 0, 0)
       sizerInstall = wx.StaticBoxSizer(self.sizerInstall_staticbox, wx.HORIZONTAL)
       sizerInstallButtons = wx.GridSizer(1, 2, 0, 0)
       sizer_4 = wx.BoxSizer(wx.VERTICAL)
       sizerPassword = wx.StaticBoxSizer(self.sizerPassword_staticbox, wx.HORIZONTAL)
       grid_sizer_1 = wx.GridSizer(8, 3, 0, 0)
       sizerStatus = wx.StaticBoxSizer(self.sizerStatus_staticbox, wx.VERTICAL)
       sizerStatus.Add(self.statusListCtrl, 1, wx.ALL|wx.EXPAND, 2)
       self.panelUpper.SetSizer(sizerStatus)
       mainSizer.Add(self.panelUpper, 1, wx.EXPAND, 0)
       grid_sizer_1.Add(self.stInfraSystem, 0, wx.ALL|wx.ALIGN_RIGHT|wx.ALIGN_CENTER_VERTICAL, 2)
       grid_sizer_1.Add(self.txInfraSystem, 1, wx.ALL|wx.EXPAND|wx.ALIGN_CENTER_VERTICAL, 2)
       grid_sizer_1.Add(self.btnInfraSystem, 0, wx.ALL|wx.ALIGN_CENTER_VERTICAL, 2)
       grid_sizer_1.Add(self.stIwpcSystem, 0, wx.ALL|wx.ALIGN_RIGHT|wx.ALIGN_CENTER_VERTICAL, 2)
       grid_sizer_1.Add(self.txIwpcSystem, 0, wx.ALL|wx.EXPAND|wx.ALIGN_CENTER_VERTICAL, 2)
       grid_sizer_1.Add(self.btnIwpcSystem, 0, wx.ALL|wx.ALIGN_CENTER_VERTICAL, 2)
       grid_sizer_1.Add(self.stIwpcIwpcdba, 0, wx.ALL|wx.ALIGN_RIGHT|wx.ALIGN_CENTER_VERTICAL, 2)
       grid_sizer_1.Add(self.txIwpcIwpcdba, 0, wx.ALL|wx.EXPAND|wx.ALIGN_CENTER_VERTICAL, 2)
       grid_sizer_1.Add(self.btnIwpcIwpcdba, 0, wx.ALL|wx.ALIGN_CENTER_VERTICAL, 2)
       grid_sizer_1.Add(self.stLdapOc4jadmin, 0, wx.ALL|wx.ALIGN_RIGHT|wx.ALIGN_CENTER_VERTICAL, 2)
       grid_sizer_1.Add(self.txLdapOc4jadmin, 0, wx.ALL|wx.EXPAND|wx.ALIGN_CENTER_VERTICAL, 2)
       grid_sizer_1.Add(self.btnLdapOc4jadmin, 0, wx.ALL|wx.ALIGN_CENTER_VERTICAL, 2)
       grid_sizer_1.Add(self.stLdapOrcladmin, 0, wx.ALL|wx.ALIGN_RIGHT|wx.ALIGN_CENTER_VERTICAL, 2)
       grid_sizer_1.Add(self.txLdapOrcladmin, 0, wx.ALL|wx.EXPAND|wx.ALIGN_CENTER_VERTICAL, 2)
       grid_sizer_1.Add(self.btnLdapOrcladmin, 0, wx.ALL|wx.ALIGN_CENTER_VERTICAL, 2)
       grid_sizer_1.Add(self.stIasAdmin, 0, wx.ALL|wx.ALIGN_RIGHT|wx.ALIGN_CENTER_VERTICAL, 2)
       grid_sizer_1.Add(self.txIasAdmin, 0, wx.ALL|wx.EXPAND|wx.ALIGN_CENTER_VERTICAL, 2)
       grid_sizer_1.Add(self.btnIasAdmin, 0, wx.ALL|wx.ALIGN_CENTER_VERTICAL, 2)
       grid_sizer_1.Add(self.stIwpcadmin, 0, wx.ALL|wx.ALIGN_RIGHT|wx.ALIGN_CENTER_VERTICAL, 2)
       grid_sizer_1.Add(self.txIwpcadmin, 0, wx.ALL|wx.EXPAND|wx.ALIGN_CENTER_VERTICAL, 2)
       grid_sizer_1.Add(self.btnIwpcadmin, 0, wx.ALL|wx.ALIGN_CENTER_VERTICAL, 2)
       grid_sizer_1.Add(self.panel_1, 1, wx.EXPAND, 0)
       grid_sizer_1.Add(self.panel_2, 1, wx.EXPAND, 0)
       grid_sizer_1.Add(self.btnValidateAll, 0, wx.ALL|wx.ALIGN_CENTER_VERTICAL, 2)
       sizerPassword.Add(grid_sizer_1, 1, wx.EXPAND, 0)
       sizerLower.Add(sizerPassword, 1, wx.EXPAND, 0)
       sizerInstallButtons.Add(self.olvSSP, 1, wx.ALL|wx.EXPAND, 2)
       sizer_4.Add(self.installSpacer0, 1, wx.EXPAND, 0)
       sizer_4.Add(self.installSpacer1, 1, wx.EXPAND, 0)
       sizer_4.Add(self.installSpacer2, 1, wx.EXPAND, 0)
       sizer_4.Add(self.installSpacer3, 1, wx.EXPAND, 0)
       sizer_4.Add(self.installSpacer4, 1, wx.EXPAND, 0)
       sizer_4.Add(self.panel_8, 1, wx.EXPAND, 0)
       sizer_4.Add(self.panel_9, 1, wx.EXPAND, 0)
       sizer_4.Add(self.btnBeginInstall, 0, wx.ALL|wx.ALIGN_CENTER_VERTICAL|wx.ALIGN_CENTER_HORIZONTAL, 2)
       sizerInstallButtons.Add(sizer_4, 1, wx.EXPAND, 0)
       sizerInstall.Add(sizerInstallButtons, 1, wx.EXPAND, 0)
       sizerLower.Add(sizerInstall, 1, wx.EXPAND, 0)
       self.panelLower.SetSizer(sizerLower)
       mainSizer.Add(self.panelLower, 1, wx.EXPAND, 0)
       self.SetSizer(mainSizer)
       mainSizer.Fit(self)
       self.Layout()
       # end wxGlade
¿Fue útil?

Solución

Los paneles generalmente no aceptan el enfoque per se, por lo que es un poco extraño. Puede ver el evento de enfoque y decirle que se centre en el siguiente widget, suponiendo que realice un seguimiento de la pestaña, ordene usted mismo. O puede intentar deshabilitar los paneles, que deberían tener el mismo efecto.

Otros consejos

Tal vez te estoy malinterpretando, pero ¿por qué no usar un espaciador? Parecen estar diseñados con precisión para este propósito y no aceptarán pestañas ... WXGlade tiene un botón para ellos y evalúan:

sizer.add((20,20) 1, wx.EXPAND, 0)

20x20 es el tamaño nominal del espaciador en píxeles, pero puede aplicar el conjunto habitual de banderas para ajustar el comportamiento de cambio de tamaño.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top