Checkbox wxPython:当我关闭框架时,复选框如何记住我的选择
我有两帧,第二帧有一些复选框。关闭第二帧时,如何保留所选内容 下面是一个示例代码Checkbox wxPython:当我关闭框架时,复选框如何记住我的选择,checkbox,wxpython,Checkbox,Wxpython,我有两帧,第二帧有一些复选框。关闭第二帧时,如何保留所选内容 下面是一个示例代码 import wx class MainFrame(wx.Frame): def __init__(self): wx.Frame.__init__(self, None, wx.ID_ANY, "Test",size=(300,200)) self.Btn = wx.Button(self, label="New",pos=(10,10),size=(30,30))
import wx
class MainFrame(wx.Frame):
def __init__(self):
wx.Frame.__init__(self, None, wx.ID_ANY, "Test",size=(300,200))
self.Btn = wx.Button(self, label="New",pos=(10,10),size=(30,30))
self.Bind(wx.EVT_BUTTON, self.new, self.Btn)
def new(self, event):
newFrame().Show()
class newFrame(wx.Frame):
def __init__(self):
wx.Frame.__init__(self, None, wx.ID_ANY, "Test 2",size=(300,200))
self.ch0 = wx.CheckBox(self, -1,"Choice 1",pos=(10,10))
self.Bind(wx.EVT_CHECKBOX, self.OnCB0, self.ch0)
self.ch1 = wx.CheckBox(self, -1,"Choise 2",pos=(10,30))
self.Bind(wx.EVT_CHECKBOX, self.OnCB1, self.ch1)
self.ch2 = wx.CheckBox(self, -1,"Choise 3",pos=(10,50))
self.Bind(wx.EVT_CHECKBOX, self.OnCB2, self.ch2)
def OnCB0(self, event):
if self.ch0.IsChecked():
print "Checked 1"
else:
print "UnChecked 1"
def OnCB1(self, event):
if self.ch1.IsChecked():
print "Checked 2"
else:
print "UnChecked 2"
def OnCB2(self, event):
if self.ch2.IsChecked():
print "Checked 3"
else:
print "UnChecked 3"
if __name__ == '__main__':
app = wx.App(False)
app.frame = MainFrame()
app.frame.Show()
app.MainLoop()
我曾在这里发表过类似的帖子:
但它不起作用
#####编辑####
我做了一些改变,但仍然不能像我所希望的那样工作。现在,当我再次打开第二帧时,它只包含一个选项,即我检查的最后一个选项。我怎样才能让它包含多个选择
import wx
hold = None
class MainFrame(wx.Frame):
def __init__(self):
wx.Frame.__init__(self, None, wx.ID_ANY, "Test",size=(300,200))
self.Btn = wx.Button(self, label="New",pos=(10,10),size=(30,30))
self.Bind(wx.EVT_BUTTON, self.new, self.Btn)
def new(self, event):
newFrame().Show()
class newFrame(wx.Frame):
def __init__(self):
wx.Frame.__init__(self, None, wx.ID_ANY, "Test 2",size=(300,200))
self.ch0 = wx.CheckBox(self, -1,"Choice 1",pos=(10,10))
self.Bind(wx.EVT_CHECKBOX, self.OnCB0, id=self.ch0.GetId())
self.ch1 = wx.CheckBox(self, -1,"Choise 2",pos=(10,30))
self.Bind(wx.EVT_CHECKBOX, self.OnCB1, id=self.ch1.GetId())
self.ch2 = wx.CheckBox(self, -1,"Choise 3",pos=(10,50))
self.Bind(wx.EVT_CHECKBOX, self.OnCB2, id=self.ch2.GetId())
global hold
if hold is not None:
getattr(self,"ch"+str(int(hold[1])-1)).SetValue(True)
def OnCB0(self, event):
global hold
hold = 'd1/'
if self.ch0.IsChecked():
print "Checked 1"
else:
print "UnChecked 1"
def OnCB1(self, event):
global hold
hold = 'd2/'
if self.ch1.IsChecked():
print "Checked 2"
else:
print "UnChecked 2"
def OnCB2(self, event):
global hold
hold = 'd3/'
if self.ch2.IsChecked():
print "Checked 3"
else:
print "UnChecked 3"
if __name__ == '__main__':
app = wx.App(False)
app.frame = MainFrame()
app.frame.Show()
app.MainLoop()
正如Joran在您指出的问题中所描述的,您不需要每次都破坏新帧并重新创建它。然后它将能够记住所检查的内容。请注意,默认情况下,单击窗口管理器的“关闭”按钮(“x”)会破坏框架
import wx
class MainFrame(wx.Frame):
def __init__(self):
wx.Frame.__init__(self, None, wx.ID_ANY, "Test",size=(300,200))
self.Btn = wx.Button(self, label="New",pos=(10,10),size=(30,30))
self.Bind(wx.EVT_BUTTON, self.show_newFrame, self.Btn)
# create the newFrame instance, keep it around.
self.new_frame = newFrame()
def show_newFrame(self, event):
self.new_frame.Show()
class newFrame(wx.Frame):
def __init__(self):
wx.Frame.__init__(self, None, wx.ID_ANY, "Test 2",size=(300,200))
self.ch0 = wx.CheckBox(self, -1,"Choice 1",pos=(10,10))
self.Bind(wx.EVT_CHECKBOX, self.OnCB0, self.ch0)
self.ch1 = wx.CheckBox(self, -1,"Choise 2",pos=(10,30))
self.Bind(wx.EVT_CHECKBOX, self.OnCB1, self.ch1)
self.ch2 = wx.CheckBox(self, -1,"Choise 3",pos=(10,50))
self.Bind(wx.EVT_CHECKBOX, self.OnCB2, self.ch2)
self.Bind(wx.EVT_CLOSE, self.onClose)
# hide ourself on close, don't destroy
def onClose(self, event):
self.Hide()
def OnCB0(self, event):
if self.ch0.IsChecked():
print "Checked 1"
else:
print "UnChecked 1"
def OnCB1(self, event):
if self.ch1.IsChecked():
print "Checked 2"
else:
print "UnChecked 2"
def OnCB2(self, event):
if self.ch2.IsChecked():
print "Checked 3"
else:
print "UnChecked 3"
if __name__ == '__main__':
app = wx.App(False)
app.frame = MainFrame()
app.frame.Show()
app.MainLoop()
第二个版本不起作用的原因是,您仅使用一个变量来尝试保存三个复选框的状态 显然,名为“hold”的变量只能包含一个要保留的复选框名称——按照代码的工作方式,它会保存最后按下的复选框的名称 如果你坚持这样做,你将不得不这样做:
import wx
hold = [None, None, None]
class MainFrame(wx.Frame):
def __init__(self):
wx.Frame.__init__(self, None, wx.ID_ANY, "Test",size=(300,200))
self.Btn = wx.Button(self, label="New",pos=(10,10),size=(30,30))
self.Bind(wx.EVT_BUTTON, self.new, self.Btn)
def new(self, event):
newFrame().Show()
class newFrame(wx.Frame):
def __init__(self):
wx.Frame.__init__(self, None, wx.ID_ANY, "Test 2",size=(300,200))
self.ch0 = wx.CheckBox(self, -1,"Choice 1",pos=(10,10))
self.Bind(wx.EVT_CHECKBOX, self.OnCB0, id=self.ch0.GetId())
self.ch1 = wx.CheckBox(self, -1,"Choise 2",pos=(10,30))
self.Bind(wx.EVT_CHECKBOX, self.OnCB1, id=self.ch1.GetId())
self.ch2 = wx.CheckBox(self, -1,"Choise 3",pos=(10,50))
self.Bind(wx.EVT_CHECKBOX, self.OnCB2, id=self.ch2.GetId())
global hold
for hold_item in hold:
if hold_item:
getattr(self,"ch"+str(int(hold_item[1])-1)).SetValue(True)
def OnCB0(self, event):
global hold
if self.ch0.IsChecked():
print "Checked 1"
hold[0] = 'd1/'
else:
print "UnChecked 1"
hold[0] = None
def OnCB1(self, event):
global hold
if self.ch1.IsChecked():
print "Checked 2"
hold[1] = 'd2/'
else:
print "UnChecked 2"
hold[1] = None
def OnCB2(self, event):
global hold
if self.ch2.IsChecked():
print "Checked 3"
hold[2] = 'd3/'
else:
print "UnChecked 3"
hold[2] = None
if __name__ == '__main__':
app = wx.App(False)
app.frame = MainFrame()
app.frame.Show()
app.MainLoop()
然而,这是不可取的,因为:
你能不能比“它没有工作”更具体一点?我想你需要分享一些代码来说明你是如何“关闭第二帧”的。在你发布的另一个问题中,建议不要关闭它,而是隐藏它。tom10:我在这段代码中也试过这么做,但我有错误。格林纳斯杰德:我并没有试图隐藏另一个问题中提到的框架。我尝试了乔兰·比斯利回答中的第二个建议。进展如何?答案有用吗?嗯,第二种方法,用你的编辑表示,是一种不好的方法。这样做可能是有原因的,但总的来说是要避免的。我第一个答案中的方法似乎更吸引人。