Search code examples
pythonwxpython

Dynamically Disable Checkbox in wxpython


So I have a wxpython app where I would like to disable a checkbox widget when another checkbox is changed to false by the user. I currently use following code to set these two checkboxes to true.

self.parentCheckbox.SetValue(True)
self.childCheckbox.SetValue(True)

Now I want to disable the childCheckbox since it's no longer relevant if the user makes the parentCheckbox false. I was hoping the following code would do this but it doesn't seem to be doing anything.

if self.parentCheckbox.GetValue() == False:
    self.childCheckbox.Disabled()    

Solution

  • It's rough and ready but it shows how it can be done without pubsub.

    import wx
    
    class MyFrame(wx.Frame):
        def __init__(self):
            wx.Frame.__init__(self, None, -1, "My Frame", size=(3000, 3000))
            self.panel = wx.Panel(self,-1)
            self.a = wx.CheckBox(self.panel, -1, "Apples", (20,100), (160,-1))
            self.b = wx.CheckBox(self.panel, -1, "Mango", (20,150), (160,-1))
            self.c = wx.CheckBox(self.panel, -1, "Banana", (20,200), (160,-1))
            self.d = wx.CheckBox(self.panel, -1, "Orange", (20,250), (160,-1))
            button=wx.Button(self.panel,label="Child",pos=(800, 400), size = (50,50))
            self.Bind(wx.EVT_BUTTON, self.newwindow, button)
            self.a.SetValue(True)
    
        def newwindow(self, event):
            secondWindow = window2(parent=self)
            secondWindow.Show()
    
    
    class window2(wx.Frame):
        def __init__(self,parent):
            wx.Frame.__init__(self,parent, -1,'Window2', size=(1000,700))
            self.parent = parent
            self.panel=wx.Panel(self, -1)
            self.chk = wx.CheckBox(self.panel, -1, "Apples", (20,100), (160,-1))
            self.Bind(wx.EVT_CHECKBOX, self.Check)
            self.SetBackgroundColour(wx.Colour(100,100,100))
            self.Centre()
            self.Show()
    
    def Check(self,event):
        if self.chk.IsChecked() == True:
            self.parent.a.SetValue(False)
            self.parent.a.Disable()
        else:
            self.parent.a.SetValue(True)
            self.parent.a.Enable()
        self.parent.Update()
    
    app = wx.App()
    frame = MyFrame()
    frame.Show(True)
    app.MainLoop()