wxPython делает панель недоступной через вкладку

Я построил графический интерфейс с помощью wx.glade. Часть этого интерфейса представляет собой раздел для ввода паролей, а затем нажмите кнопку, чтобы подтвердить их. Для создания этого раздела я использовал размер сетки. Не каждая ячейка сетки должна иметь кнопку или поле, поэтому я заполнил их компонентами wx.panel в качестве разделителей.

Что происходит, когда я нажимаю на поля и кнопки tx, все в порядке, но проставки wx.panel также являются частью этого списка вкладок. То, что я хочу сделать, это сделать их без возможности выбора вкладки.

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

2 ответа

Решение

Панели обычно не принимают фокус как таковой, так что это немного странно. Вы можете поймать событие focus и сказать ему, чтобы вместо этого установить фокус на следующий виджет, предполагая, что вы сами отслеживаете порядок табуляции. Или вы можете попробовать отключить панели, что должно иметь тот же эффект.

Может быть, я вас неправильно понимаю, но почему бы просто не использовать проставки? Похоже, что они предназначены именно для этой цели и не принимают вкладки... У wxglade есть кнопка для них, и они оценивают:

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

20x20 - это номинальный размер разделителя в пикселях, но вы можете применить обычный набор флагов для настройки поведения изменения размера.

Другие вопросы по тегам