首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有复选框的wx.Checkbox -Associate数据

带有复选框的wx.Checkbox -Associate数据
EN

Stack Overflow用户
提问于 2011-11-05 08:23:05
回答 2查看 1.2K关注 0票数 0

我一直在尝试弄清楚如何将数据与复选框被选中的事件相关联。问题是我的数据卡在一个5键的深度字典中(dict{})。我尝试过爬行父母和获取他们的标签,因为他们是由键创建的,但没有太多的运气,因为我嵌套的笔记本。代码如下所示:

代码语言:javascript
复制
#!/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]的值,而不必遍历所有的键?

提前感谢一堆

解决方案:

代码语言:javascript
复制
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())])
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-11-07 23:31:29

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

代码语言:javascript
复制
checkbox = event.GetEventObject()

然后,您可以使用其常规方法(即checkbox.GetId()或checkbox.GetName()或checkbox.GetLabel())提取触发事件的复选框的名称或id。一旦您有了该信息,您就可以将该信息传递给您的字典。

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

票数 2
EN

Stack Overflow用户

发布于 2011-11-08 08:17:25

您可以做的是在绑定事件时使用您可以使用的信息。为此,您可以使用partial from functools

代码语言:javascript
复制
from functools import partial

def OnTimer(self, event, label):
    pass

然后使用partial绑定事件,如下所示:

代码语言:javascript
复制
    wx.EVT_CHECKBOX(self, self.cb.GetId(), partial(self.OnTimer, label=ssslabel)

您有许多不同的键可用,所以您只需在OnTimer函数中使用**kwargs,然后遍历这些键:

代码语言:javascript
复制
def OnTimer(self, event, **kwargs):
    for key, value in kwargs.items():
        pass

使用此方法,您可以将为控件创建绑定时可用的任何内容传递给将处理要绑定到的事件的代码。这对于动态创建具有绑定的控件时尤其有用。

您也可以完全按照Mike说的做,并从传递给OnTimer处理程序的事件变量中使用GetEventObject()或EventObject。这将完全满足您在内部的要求;

代码语言:javascript
复制
chboxvaldict[label][slabel][sslabel][ssslabel]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8017223

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档