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:我在这段代码中也试过这么做,但我有错误。格林纳斯杰德:我并没有试图隐藏另一个问题中提到的框架。我尝试了乔兰·比斯利回答中的第二个建议。进展如何?答案有用吗?嗯,第二种方法,用你的编辑表示,是一种不好的方法。这样做可能是有原因的,但总的来说是要避免的。我第一个答案中的方法似乎更吸引人。