Как связать событие с флажком в просмотре списка объектов в 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()
Другие вопросы по тегам