0
self.testParameters = self.testParameterListCtrl(self, -1, style=wx.LC_REPORT      |wx.LC_HRULES | wx.LC_VRULES | wx.LC_SINGLE_SEL)
self.testParameters.InsertColumn(0, "Parameter", wx.LIST_FORMAT_CENTER, -1)
self.testParameters.InsertColumn(1, "Value", wx.LIST_FORMAT_CENTER, -1)
self.testParameters.Bind(wx.EVT_LIST_END_LABEL_EDIT, self.onModifyTestParameter )

for parameter, value in self.keywordArgs.iteritems():
        self.testParameters.InsertStringItem(index, parameter, 0)
        self.testParameters.SetStringItem(index, 1, str(value))
        if parameter in self.workloadTests.values():
            self.testParameters.SetStringItem(index, 1, self.testWorkload.GetValue())
        # Cell Colors
        if (index % 2): 
            self.testParameters.SetItemBackgroundColour(index, self.listBGColor_1)
        else:
            self.testParameters.SetItemBackgroundColour(index, self.listBGColor_2)
        index += 1

このコードでは、「0」インデックス「パラメーター」を編集不可の listCtrl として無効にし、「1」インデックス「値」を編集可能な listCtrl として無効にします。

4

2 に答える 2

0

sを使用wx.ListCtrlすることは、ほとんど常に苦痛です。ObjectListView代わりに使用することをお勧めします

一般的な使用法

セル編集

例:

#!python3
import wx
from ObjectListView import ObjectListView, ColumnDefn

random_objects = [
    {"parameter": "Test", "value": "1"},
    {"parameter": "Test2", "value": "2"}
]


class MainFrame(wx.Frame):
    def __init__(self):
        super(MainFrame, self).__init__(parent=None, title="OLV Test")
        panel = MainPanel(self)
        self.Show()


class MainPanel(wx.Panel):
    def __init__(self, parent):
        super(MainPanel, self).__init__(parent)

        self.olv = ObjectListView(parent=self, style=wx.LC_REPORT | wx.BORDER_SUNKEN, sortable=True,
                                  useAlternateBackColors=False, cellEditMode=ObjectListView.CELLEDIT_DOUBLECLICK)
        self.olv.SetColumns([
            ColumnDefn(title="Parameter", valueGetter="parameter", isSpaceFilling=True, isEditable=False),
            ColumnDefn(title="Value", valueGetter="value", isSpaceFilling=True)
        ])

        get_button = wx.Button(self, label="Print objects")

        top_sizer = wx.BoxSizer(wx.VERTICAL)  # Root sizer
        olv_sizer = wx.BoxSizer(wx.VERTICAL)  # For the ObjectListView
        button_sizer = wx.BoxSizer(wx.HORIZONTAL)

        olv_sizer.Add(self.olv, 1, wx.LEFT | wx.RIGHT | wx.EXPAND | wx.ALIGN_TOP, 5)
        button_sizer.Add(get_button, 0, wx.ALL | wx.ALIGN_LEFT, 5)

        top_sizer.Add(olv_sizer, 1, wx.ALL | wx.EXPAND, 5)
        top_sizer.Add(button_sizer, 0, wx.ALL | wx.EXPAND, 5)

        self.SetSizerAndFit(top_sizer)
        self.Bind(wx.EVT_BUTTON, handler=self.get_objects, source=get_button)

        self.olv.SetObjects(random_objects)

    def get_objects(self, event):
        for item in self.olv.GetObjects():
            print("Parameter: {param}".format(param=item['parameter']))
            print("Value: {val}".format(val=item['value']))


if __name__ == "__main__":
    wx_app = wx.App()
    frame = MainFrame()
    wx_app.MainLoop()

ユーザーがリストを編集すると、値もrandom_objects更新されるため、必要に応じて代わりに実際に使用できself.olv.GetObjects()ます。

于 2016-04-28T04:42:25.450 に答える
0

から EditableListCtrl を使用してこれを行うことができます

import wx.lib.mixins.listctrl as listmix

ミックスイン用のクラスを作成する

class EditableListCtrl(wx.ListCtrl, listmix.TextEditMixin):
    # TextEditMixin allows any column to be edited other than those specifically vetoed
    def __init__(self, parent, ID=wx.ID_ANY, pos=wx.DefaultPosition,
                 size=wx.DefaultSize, style=0):
        """Constructor"""
        wx.ListCtrl.__init__(self, parent, ID, pos, size, style)
        listmix.TextEditMixin.__init__(self)

listctrl を編集可能として定義する

self.listCtrl = EditableListCtrl(my_panel1, -1, style=wx.LC_REPORT|wx.LC_SINGLE_SEL|wx.LC_VRULES, size=(1145,285))

次に、特定のアイテムの拒否をバインドします。self.listCtrl.Bind(wx.EVT_LIST_BEGIN_LABEL_EDIT, self.OnVetoItems)

拒否機能を定義する

def OnVetoItems(self, event): 
    if event.m_itemIndex == 0:
        event.Veto()
        return

注 列はevent.m_col、listctrl の列の番号を使用してチェックすることもできます。

于 2016-03-13T16:18:52.160 に答える