Qual evento pode acionar GetFocus de um controle wx.Checklist?
-
12-12-2019 - |
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()
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