Как связать событие с флажком в просмотре списка объектов в wxpython
Я использую objectlistview в wxpython, и я очень доволен этим до сих пор. Я не могу найти способ добавить событие к флажку в моем списке объектов. На данный момент у меня есть обходной путь, пользователь должен нажать на кнопку, а затем что-то происходит с проверенной строкой. Но я бы хотел, чтобы это произошло, когда пользователь установит флажок. Это должен переключить график в моем сюжете.
Второй вопрос, который у меня есть, - как снять флажки после того, как пользователь нажал кнопку (это если нет способа решить мой первый вопрос).
Мой код (я просто скопировал необходимые строки, потому что моя программа очень большая)
self.tempmeasurements = ObjectListView(self, wx.ID_ANY, style=wx.LC_REPORT | wx.SUNKEN_BORDER)
self.tempmeasurements.SetColumns(microanalysis_options.TempMeasColumndefs)
self.tempmeasurements.CreateCheckStateColumn(0)
self.addbutton = wx.Button(self, wx.ID_ANY, "Add to plot")
self.rembutton = wx.Button(self, wx.ID_ANY,'Remove from plot')
self.Bind(wx.EVT_BUTTON, self.on_toggle_plotlist, self.addbutton)
self.Bind(wx.EVT_BUTTON, self.on_remove_from_plot,self.rembutton)
def on_toggle_plotlist(self, event):
objectsAddPlotList = self.tempmeasurements.GetCheckedObjects()
pub.sendMessage('MA_ADD_TO_PLOT', Container(origin=self, data=objectsAddPlotList)) #to microanalyse controller
self.tempmeasurements.SetCheckState(objectsAddPlotList,False)
def on_remove_from_plot(self,event):
objectsAddPlotList = self.tempmeasurements.GetCheckedObjects()
pub.sendMessage('MA_REM_FROM_PLOT', Container(origin=self, data=objectsAddPlotList)) # to microanalyse controller
Строка self.tempmeasurements.SetCheckState(objectsAddPlotList,False), которую я пытался использовать, чтобы снять флажки после того, как пользователь нажал кнопку.
Вот как выглядит список:
1 ответ
Главное, чтобы импортировать OLVEvent
а затем свяжите свой ObjectListView
экземпляр для OLVEvent.EVT_ITEM_CHECKED
,
Я пошел дальше и создал простой пример:
import wx
from ObjectListView import ObjectListView, ColumnDefn, OLVEvent
class Results(object):
""""""
def __init__(self, tin, zip_code, plus4, name, address):
"""Constructor"""
self.tin = tin
self.zip_code = zip_code
self.plus4 = plus4
self.name = name
self.address = address
class MyPanel(wx.Panel):
""""""
def __init__(self, parent):
"""Constructor"""
wx.Panel.__init__(self, parent=parent)
mainSizer = wx.BoxSizer(wx.VERTICAL)
self.test_data = [Results("123456789", "50158", "0065", "Patti Jones",
"111 Centennial Drive"),
Results("978561236", "90056", "7890", "Brian Wilson",
"555 Torque Maui"),
Results("456897852", "70014", "6545", "Mike Love",
"304 Cali Bvld")
]
self.results_olv = ObjectListView(self,
style=wx.LC_REPORT|wx.SUNKEN_BORDER)
self.results_olv.Bind(OLVEvent.EVT_ITEM_CHECKED, self.on_item_checked)
self.set_results()
mainSizer.Add(self.results_olv, 1, wx.EXPAND|wx.ALL, 5)
self.SetSizer(mainSizer)
def on_item_checked(self, event):
obj = self.results_olv.GetSelectedObject()
checked = 'Checked' if self.results_olv.IsChecked(obj) else 'Unchecked'
print('{} row is {}'.format(obj.name, checked))
def set_results(self):
""""""
self.results_olv.SetColumns([
ColumnDefn("TIN", "left", 100, "tin"),
ColumnDefn("Zip", "left", 75, "zip_code"),
ColumnDefn("+4", "left", 50, "plus4"),
ColumnDefn("Name", "left", 150, "name"),
ColumnDefn("Address", "left", 200, "address")
])
self.results_olv.CreateCheckStateColumn()
self.results_olv.SetObjects(self.test_data)
class MainFrame(wx.Frame):
""""""
def __init__(self):
"""Constructor"""
title = "OLV Checkbox Tutorial"
wx.Frame.__init__(self, parent=None, title=title,
size=(600, 400))
panel = MyPanel(self)
if __name__ == "__main__":
app = wx.App(False)
frame = MainFrame()
frame.Show()
app.MainLoop()