Pergunta

Estou tentando usar o foco de um controle de lista de verificação para fornecer informações ao usuário para ajudá-lo em sua seleção.Posso self.list.GetFocus em um evento de item de verificação, mas não consigo obter o foco fora de um item de verificação.Meu objetivo é fazer com que o usuário percorra a lista e, à medida que o foco da lista muda, ele envia mensagens com as informações da barra de status da linha em foco para que o usuário seja informado.A seleção OnCheckItem é usada para acionar outra ação.Alguém pode me dar alguma direção?Obrigado

Aqui está o código que estou usando:

    #!/usr/bin/env python
    # encoding: ISO-8859-1
    """
    Simple Checkbox List Control.py

    """

    import wx
    import wx.lib.mixins.listctrl as listmix
    from wx.lib.pubsub import Publisher


    listhdr=('File', 'Info','Data')
    listdata=(  ( "file00","info00","data0"),
                ( "file01","info01","data1"),
                ( "file02","info02","data2"),
                ( "file03","info03","data3"),
                ( "file04","info04","data4"),
                ( "file05","info05","data5"))

    #=======================================================================
    #           CheckListControl Panel Class
    #=======================================================================

    class TestListCtrl(wx.ListCtrl, listmix.CheckListCtrlMixin, listmix.ListCtrlAutoWidthMixin):
        def __init__(self, *args, **kwargs):
            wx.ListCtrl.__init__(self, *args, **kwargs)
            # Initialize ListCtrl Widge
            listmix.CheckListCtrlMixin.__init__(self)
            listmix.ListCtrlAutoWidthMixin.__init__(self)
            self.setResizeColumn(3)

            self.checked = -1 # class container variable for the checked item index
            self.rowindex=[] # class container variable for selected row
            self.status={} # Dictionary to keep track of the checklist state
            #print self.GetFocus()
        def OnCheckItem(self, index, flag):
            self.msg1=''
            self.msg2=''
            if flag==True:
                #msg=str('Checked Item '+str(index))
                #The following insures only one checked item is checked at a time
                if self.checked==-1:
                    self.checked=index
                    self.msg1='Checked box %i '%(self.checked)
                else:
                    self.CheckItem( self.checked, False)
                    self.checked=index
                    self.msg1=' Checked box %i '%(self.checked)
            if flag==False:
                self.msg2=str('Unchecked Item '+str(index))
                #The following addresses checked item that was unchecked
                self.checked=-1
            self.status[index]=flag # set dictionary to current state of any changed item
            #print 'status ',self.status
            #msg='Check list Status: '+str(self.status)
            msg=self.msg2+self.msg1
            #print msg
            Publisher().sendMessage(('change_statusbar'), msg) # Communication with Main Frame
            print msg
            self.Refresh() # this just to insure the displayed list is current

    #=======================================================================
    #           CheckList Panel Class
    #=======================================================================            
    class CheckListPanel(wx.Panel):
        def __init__(self, parent):
            wx.Panel.__init__(self, parent, -1)
            self.SetBackgroundColour('blue')
            # Define CheckBoxList Layout
            self.list = TestListCtrl(self, style=wx.LC_REPORT) # Instantiate the checklist control
            self.list.InsertColumn(0, "File",width=100)
            self.list.InsertColumn(1, "Info")
            self.list.InsertColumn(2, "Data")
            self.list.Arrange()
            # Populate the List Table
            for entry in listdata:
                #self.list.Append([str(i), "", "It's the %d item" % (i)])   # this is from the source file template 
                self.list.Append(entry) # construct the table entries

            # add CheckListPanel widgets to vertical sizer
            self.sizer = wx.BoxSizer(wx.VERTICAL)
            self.sizer.Add(self.list,1, flag=wx.EXPAND | wx.ALL, border=5)  
            self.SetSizerAndFit(self.sizer) 

    #===========================================================================================================================
    #           Main Frame 
    #===========================================================================================================================
    class MainWindow(wx.Frame):
        def __init__(self, parent):
            wx.Frame.__init__(self, parent, -1, 'Panel with CheckBox List Control-Mixins Example', size=(700, 600))
            self.sb=self.CreateStatusBar()
            self.sb.SetStatusText("Check an Item")
            Publisher().subscribe(self.change_statusbar, 'change_statusbar')
            self.panel = wx.Panel(self)
            self.list = CheckListPanel(self.panel)

            # now add widgets to FramePanel
            self.sizer = wx.BoxSizer(wx.VERTICAL) # create Sizer
            self.sizer.Add(self.list,1, flag=wx.EXPAND | wx.ALL, border=5)
            self.panel.SetSizer(self.sizer) # 

            self.Show()

        # Set the methods to receive PubSub transfers
        def change_statusbar(self, msg):
            self.msg=msg
            self.SetStatusText(msg.data)        

    app = wx.App(False)
    win = MainWindow(None)
    app.MainLoop()
Foi útil?

Solução

Bem, talvez eu tenha descoberto. O código a seguir, quando adicionado à classe CheckListPanel, permitirá que o item selecionado seja identificado.Acho que o controle de lista deve ser instanciado antes que você possa usar o método GetSelectedItem(), pois requer um wx.ID para vincular o evento.Eu adicionei isso depois de preencher a lista definindo o dimensionador do painel

            # bind selected event to selected row
    wx.EVT_LIST_ITEM_SELECTED(self,self.list.GetId(), self.OnSelectItem)


def OnSelectItem(self, index):
    print 'Selected item index=',self.list.GetFocusedItem()
    msg='Selected item index='+str(self.list.GetFocusedItem())
    Publisher().sendMessage(('change_statusbar'), msg) # Communication with Main Frame
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top