Wxpython 复选框-将数据与复选框关联

Wxpython 复选框-将数据与复选框关联,wxpython,Wxpython,我一直在试图找出如何将数据与选中复选框的事件相关联。问题是我的数据卡在一个5键深的字典(dict{dict{dict{dict{}})中。我试过爬遍父母的电脑,从他们的键盘上得到他们的标签,但由于我是如何嵌套笔记本的,所以运气不太好。代码如下所示: #!/usr/bin/env python import os import sys import datetime import numpy as np from readmonifile import MonitorFile from sortm

我一直在试图找出如何将数据与选中复选框的事件相关联。问题是我的数据卡在一个5键深的字典(dict{dict{dict{dict{}})中。我试过爬遍父母的电脑,从他们的键盘上得到他们的标签,但由于我是如何嵌套笔记本的,所以运气不太好。代码如下所示:

#!/usr/bin/env python
import os
import sys
import datetime
import numpy as np
from readmonifile import MonitorFile
from sortmonifile import sort
import wx

class NestedPanelOne(wx.Panel):
    #----------------------------------------------------------------------
    # First notebook that creates the tab to select the component number
    #----------------------------------------------------------------------
    def __init__(self, parent, label, data):

        wx.Panel.__init__(self, parent=parent, id=wx.ID_ANY)

        sizer = wx.BoxSizer(wx.VERTICAL)

        #Loop creating the tabs according to the component name
        nestedNotebook = wx.Notebook(self, wx.ID_ANY)
        for slabel in sorted(data[label].keys()):
            tab = NestedPanelTwo(nestedNotebook, label, slabel, data)
            nestedNotebook.AddPage(tab,slabel)


        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(nestedNotebook, 1, wx.ALL|wx.EXPAND, 5)
        self.SetSizer(sizer)

class NestedPanelTwo(wx.Panel):
    #------------------------------------------------------------------------------
    # Second notebook that creates the tab to select the main monitoring variables 
    #------------------------------------------------------------------------------
    def __init__(self, parent, label, slabel, data):

        wx.Panel.__init__(self, parent=parent, id=wx.ID_ANY)

        sizer = wx.BoxSizer(wx.VERTICAL)

        nestedNotebook = wx.Notebook(self, wx.ID_ANY)

        for sslabel in sorted(data[label][slabel].keys()):
            tab = NestedPanelThree(nestedNotebook, label, slabel, sslabel, data)
            nestedNotebook.AddPage(tab, sslabel)

        sizer.Add(nestedNotebook, 1, wx.ALL|wx.EXPAND, 5)
        self.SetSizer(sizer)

    def GetPage(self):
        return nestedNotebook.GetPage()

class NestedPanelThree(wx.Panel):
    #-------------------------------------------------------------------------------
    # Third notebook that creates checkboxes to select the monitoring sub-variables
    #-------------------------------------------------------------------------------
    def __init__(self, parent, label, slabel, sslabel, data):


        wx.Panel.__init__(self, parent=parent, id=wx.ID_ANY)

        self.labels=[]
        self.chbox=[]

        if label not in chboxdict.keys():
            chboxdict[label]={}
            chboxvaldict[label]={}
        if slabel not in chboxdict[label].keys():
            chboxdict[label][slabel]={}
            chboxvaldict[label][slabel]={}
        if sslabel not in chboxdict[label][slabel].keys():
            chboxdict[label][slabel][sslabel]={}
            chboxvaldict[label][slabel][sslabel]={}

        for ssslabel in sorted(data[label][slabel][sslabel].keys()):
            self.cb=wx.CheckBox(self, -1, ssslabel)
            chboxdict[label][slabel][sslabel][ssslabel]=self.cb
            chboxvaldict[label][slabel][sslabel][ssslabel]=self.cb.GetValue()
            wx.EVT_CHECKBOX(self, self.cb.GetId(), self.OnTimer)
            self.chbox.append(self.cb)
            self.labels.append(ssslabel)


        gridSizer = wx.GridSizer(np.shape(list(set(self.labels)))[0],3, 5, 5)

        gridSizer.AddMany(self.chbox)

        self.SetSizer(gridSizer)



    def OnTimer(self, event):

        #print "OnTimer Update..."                                                                                                  

        # before we get data, do we have to bother?                                                                                 
        isVisible = self.IsShown()
        child = self
        parent = self.GetParent()
        while(parent!=None and not parent.IsTopLevel()):

            if(parent.IsShown() and isinstance(parent, wx.BookCtrlBase)):
                if(parent.IsShown()):
                    selectionPage = parent.GetPage(parent.GetSelection())
                    pageselected = parent.GetParent().GetPage()
                    print selectionPage, pageselected, 'test2'
                if(selectionPage!=child):                                                                                            
                    isVisible=False
                    break
            else:
                if(not parent.IsShown()):
                    isVisible=False
                    break


            child = parent
            parent = parent.GetParent()

    def ShowParents(self, event):
        if self.cb.GetValue():
            print label, slabel, sslabel, self.cb.GetLabel()
        else:
            print 'Please select'

########################################################################
class NestedNotebook(wx.Notebook):
    #---------------------------------------------------------------------------------
    # Main notebook creating tabs for the monitored components
    #---------------------------------------------------------------------------------
    def __init__(self, parent, data):
        wx.Notebook.__init__(self, parent, id=wx.ID_ANY, style=
                             wx.BK_DEFAULT
                            )

        for label in sorted(data.keys()):
            tab = NestedPanelOne(self,label, data)
            self.AddPage(tab, label)

########################################################################
class mainFrame(wx.Frame):
    #----------------------------------------------------------------------
    # Putting it all together
    #----------------------------------------------------------------------
    def __init__(self,data):

        wx.Frame.__init__(self, None, wx.ID_ANY,
                          "pDAQ monitoring plotting tool",
                          size=(800,400)
                          )

        panel = wx.Panel(self)
        notebook = NestedNotebook(panel, data)
        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(notebook, 1, wx.ALL|wx.EXPAND, 5)
        panel.SetSizer(sizer)
        self.Layout()

        #Menu Bar to be added later
        '''
        menubar = wx.MenuBar()
        file = wx.Menu()
        file.Append(1, '&Quit', 'Exit Tool')
        menubar.Append(file, '&File')
        self.SetMenuBar(menubar)
        self.Bind(wx.EVT_MENU, self.OnClose, id=1)
        '''
        self.Show()
#----------------------------------------------------------------------
if __name__ == "__main__":

    if len(sys.argv) == 1:
        raise SystemExit("Please specify a file to process")

    for f in sys.argv[1:]:
        data=sort.sorting(f)


    print 'test'
    chboxdict={}
    chboxvaldict={}
    app = wx.PySimpleApp()
    frame = mainFrame(data)
    app.MainLoop()
    print 'testend'
NestedPanelThree
类是我将复选框与数据关联起来并尝试爬过面板的地方

是否有一种方法将复选框与数据相关联,以便在选中复选框时,检索用于创建该复选框的键?或者有没有一种方法可以更新
chboxvaldict[label][slabel][sslabel][ssslabel]
的值,而不必遍历所有键

先谢谢你

解决方案:

class NestedPanelThree(wx.Panel):
    ###
    # Third notebook that creates checkboxes to select the monitoring sub-variables
    ###
    def __init__(self, parent, label, slabel, sslabel, data):


        wx.Panel.__init__(self, parent=parent, id=wx.ID_ANY)

        self.chbox=[]

        for ssslabel in sorted(data[label][slabel][sslabel].keys()):
            self.cb=wx.CheckBox(self, -1, ssslabel)
            chboxdict[str(self.cb.GetId())]=[label,slabel,sslabel,ssslabel]
            wx.EVT_CHECKBOX(self, self.cb.GetId(), self.OnClick)
            self.chbox.append(self.cb)

        gs = wx.GridSizer(0,3)

        gs.AddMany(self.chbox)

        self.SetSizer(gs)

    def OnClick(self, event):
        if chboxdict[str(event.GetEventObject().GetId())] not in clicked:
            clicked.append(chboxdict[str(event.GetEventObject().GetId())])
        else:
            clicked.remove(chboxdict[str(event.GetEventObject().GetId())])

在事件处理程序中,可以执行以下操作:

checkbox = event.GetEventObject()
    wx.EVT_CHECKBOX(self, self.cb.GetId(), partial(self.OnTimer, label=ssslabel)
然后,您可以使用触发事件的复选框的常规方法(即checkbox.GetId()或checkbox.GetName()或checkbox.GetLabel())提取该复选框的名称或id,一旦获得了该名称或id,您就可以将该信息传递到字典


您也可以像其他人提到的那样派生一个类,只需添加某种数据结构来保存它。

在事件处理程序中,您可以执行以下操作:

checkbox = event.GetEventObject()
    wx.EVT_CHECKBOX(self, self.cb.GetId(), partial(self.OnTimer, label=ssslabel)
然后,您可以使用触发事件的复选框的常规方法(即checkbox.GetId()或checkbox.GetName()或checkbox.GetLabel())提取该复选框的名称或id,一旦获得了该名称或id,您就可以将该信息传递到字典


您也可以像另一个人提到的那样派生一个类,只需添加某种数据结构来保存它。

您可以做的是在绑定事件时使用您可用的信息。要做到这一点,您可以使用

然后,您将使用类似以下内容的partial绑定事件:

checkbox = event.GetEventObject()
    wx.EVT_CHECKBOX(self, self.cb.GetId(), partial(self.OnTimer, label=ssslabel)
您有很多不同的键可用,因此您可以在OnTimer函数中使用**kwargs,然后迭代:

def OnTimer(self, event, **kwargs):
    for key, value in kwargs.items():
        pass
使用此方法,可以将创建控件绑定时可用的任何内容传递给将处理绑定到的事件的代码。这对于动态创建带有绑定的控件尤其有用

您也可以完全按照Mike所说的做,从传递给OnTimer处理程序的事件变量中使用GetEventObject()或EventObject。这会给你你想要的东西

chboxvaldict[label][slabel][sslabel][ssslabel]

您可以做的是在绑定事件时使用可用的信息。要做到这一点,您可以使用

然后,您将使用类似以下内容的partial绑定事件:

checkbox = event.GetEventObject()
    wx.EVT_CHECKBOX(self, self.cb.GetId(), partial(self.OnTimer, label=ssslabel)
您有很多不同的键可用,因此您可以在OnTimer函数中使用**kwargs,然后迭代:

def OnTimer(self, event, **kwargs):
    for key, value in kwargs.items():
        pass
使用此方法,可以将创建控件绑定时可用的任何内容传递给将处理绑定到的事件的代码。这对于动态创建带有绑定的控件尤其有用

您也可以完全按照Mike所说的做,从传递给OnTimer处理程序的事件变量中使用GetEventObject()或EventObject。这会给你你想要的东西

chboxvaldict[label][slabel][sslabel][ssslabel]

不检查代码:难道您不能派生一个
MyCheckBox
类并添加一些关键属性吗?您仍然需要一些数据结构来检索关联的复选框。我有点试图避免这种情况,但我想这似乎是任何人都可以想出的唯一选项,而无需查看您的代码:难道您不能派生一个
MyCheckBox
类并添加一些关键属性吗?您仍然需要一些数据结构来检索相关的复选框。我有点试图避免这种情况,但我想这似乎是任何人都能想到的唯一选择