我一直在试图弄清楚如何将数据与选中的复选框事件相关联。问题是我的数据被困在一个5键深的字典里(dict {dict {dict {dict {}}}}})。我已经尝试爬过父母,并获得他们的标签,因为他们是从钥匙创建,但没有多少运气,因为我如何嵌套笔记本电脑。该代码看起来如下:wx.Checkbox - 使用复选框关联数据
#!/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())])
不看你的代码:你不能派生一个MyCheckBox类并添加一些关键属性?您仍然需要一些数据结构来检索关联的CheckBox。 – any1
我很想尽量避免,但我想这似乎是唯一的选择,任何人都可以拿出atm – madtowneast