获取listctrl中的复选框状态

时间:2017-11-14 08:13:08

标签: python python-3.x wxpython wxwidgets

我试图找出如何在ultimatelistctrl中获取每个复选框的状态。我还需要能够检查或取消选中所有方框。

这是我在这个项目中的第二次尝试,第一次没有使用任何形式的listctrl,虽然功能很强,但却非常难看。我尝试在新版本上使用相同的绑定技术,但它们似乎不适用于此处。 任何帮助表示感谢,谢谢。

正确或错误,因为这是一个新版本,我已经开始了一个新的线程。这是前一个: Previous question/answer

import sys
import wx
import wx.lib.agw.ultimatelistctrl as ULC


class MyFrame(wx.Frame):

    def __init__(self, parent):
        wx.Frame.__init__(self, parent, -1, "Checkbox grid based on UltimateListCtrl Demo", size=(600,300))
        agwStyle = (ULC.ULC_HAS_VARIABLE_ROW_HEIGHT | wx.LC_REPORT | wx.LC_VRULES | wx.LC_HRULES | wx.LC_SINGLE_SEL)
        self.mylist = mylist = ULC.UltimateListCtrl(self, wx.ID_ANY, agwStyle=agwStyle)

        mylist.InsertColumn(0,"", width=100)

        for col in range(1,25):
            col_num=str(col-1)
            if col==0:col_num=""
            mylist.InsertColumn(col,col_num, width=20)


        self.checkboxes = {}
        self.boxes=[]

        for day in range(7):
            days=["Monday", "Sunday", "Saturday", "Friday", "Thursday", "Wednesday", "Tuesday"]
            index = mylist.InsertStringItem(1, "" + days[day])
            mylist.SetStringItem(index, 1, "")


        for boxes in range(1,25):
            for index in range(7):
                mylist.SetStringItem(index, boxes, "")
                checkBox = wx.CheckBox(mylist, wx.ID_ANY, "", wx.DefaultPosition, wx.DefaultSize, 0)
                self.checkboxes[checkBox.GetId()] = index
                mylist.SetItemWindow(index, boxes, checkBox)
                self.boxes.append(self.checkboxes)                

        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(mylist, 1, wx.EXPAND)
        self.SetSizer(sizer)




app = wx.App()  
frame = MyFrame(None)
app.SetTopWindow(frame)
frame.Show()
app.MainLoop()

1 个答案:

答案 0 :(得分:0)

您添加的dict项目不是CheckBox而您的days搞砸了。

import sys
import wx
import wx.lib.agw.ultimatelistctrl as ULC


class MyFrame(wx.Frame):

    def __init__(self, parent):
        wx.Frame.__init__(self, parent, -1, "Checkbox grid based on UltimateListCtrl Demo", size=(600,300))
        agwStyle = (ULC.ULC_HAS_VARIABLE_ROW_HEIGHT | wx.LC_REPORT | wx.LC_VRULES | wx.LC_HRULES | wx.LC_SINGLE_SEL)
        self.mylist = mylist = ULC.UltimateListCtrl(self, wx.ID_ANY, agwStyle=agwStyle)

        mylist.InsertColumn(0,"", width=100)

        for col in range(1,25):
            col_num=str(col-1)
            if col==0:col_num=""
            mylist.InsertColumn(col,col_num, width=20)


        self.checkboxes = {}
        self.boxes=[]

        for day in range(7):
#            days=["Monday", "Sunday", "Saturday", "Friday", "Thursday", "Wednesday", "Tuesday"]
            days=['Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','Sunday']
            mylist.InsertStringItem(day, str(days[day]))
            #index = mylist.InsertStringItem(1, "" + days[day])
            #mylist.SetStringItem(index, 1, "")


        for boxes in range(1,25):
            for index in range(7):
                day = days[index]
                hour = boxes-1
                name_of_checkbox = "{day}_{hour}".format(day=day, hour=hour)
                mylist.SetStringItem(index, boxes, "")
                self.checkBox = wx.CheckBox(mylist, wx.ID_ANY, "", wx.DefaultPosition, wx.DefaultSize, 0,name=name_of_checkbox)
                #self.checkBox.SetValue(True) #Use this to check all boxes
                self.checkboxes[self.checkBox.GetId()] = index
                mylist.SetItemWindow(index, boxes, self.checkBox)
                self.boxes.append(self.checkBox)

        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(mylist, 1, wx.EXPAND)
        button = wx.Button(self,-1,"Retrieve Data")
        sizer.Add(button)
        self.Bind(wx.EVT_CHECKBOX, self.OnChecked)
        self.Bind(wx.EVT_BUTTON, self.OnGetData)
        self.SetSizer(sizer)

    def OnChecked(self,event):
        clicked = event.GetEventObject()
        print (clicked.GetName())
        print (event.IsChecked())

    def OnGetData(self,event):
        day_dict = {}
        day_list = []
        for i in self.boxes:
            if i.IsChecked():
                n = i.GetName()
                day_dict[n]="Checked"
                day_list.append((n,"Checked"))
        print (day_dict)
        print (day_list)



app = wx.App()
frame = MyFrame(None)
app.SetTopWindow(frame)
frame.Show()
app.MainLoop()

enter image description here

输出:

Monday_0
True
Tuesday_1
True
Wednesday_2
True
Thursday_3
True
Friday_4
True
Saturday_5
True
Sunday_6
True
Saturday_7
True
Friday_8
True
Thursday_9
True
Wednesday_10
True
Tuesday_12
True
Tuesday_11
True
Tuesday_12
False
Monday_12
True
{'Thursday_3': 'Checked', 'Tuesday_1': 'Checked', 'Saturday_7': 'Checked', 'Monday_12': 'Checked', 'Friday_8': 'Checked', 'Thursday_9': 'Checked', 'Wednesday_10': 'Checked', 'Saturday_5': 'Checked', 'Tuesday_11': 'Checked', 'Friday_4': 'Checked', 'Wednesday_2': 'Checked', 'Sunday_6': 'Checked', 'Monday_0': 'Checked'}

[('Monday_0', 'Checked'), ('Tuesday_1', 'Checked'), ('Wednesday_2', 'Checked'), ('Thursday_3', 'Checked'), ('Friday_4', 'Checked'), ('Saturday_5', 'Checked'), ('Sunday_6', 'Checked'), ('Saturday_7', 'Checked'), ('Friday_8', 'Checked'), ('Thursday_9', 'Checked'), ('Wednesday_10', 'Checked'), ('Tuesday_11', 'Checked'), ('Monday_12', 'Checked')]