首页 > 解决方案 > Enable a button in the parent wx.Frame

问题描述

I need help to enable a button in the parent wx.Frame, here i have an example of two classed first class mainFrame has two buttons first one m_buttonlogin to launch the second wx.Frame class instance loginFrame and another disabled button. what i need to do is upon successful login in the child Frame the disabled button turns enabled in the main frame.

# -*- coding: utf-8 -*- 

###########################################################################
## Python code generated with wxFormBuilder (version Jun 17 2015)
## http://www.wxformbuilder.org/
##
## PLEASE DO "NOT" EDIT THIS FILE!
###########################################################################

import wx
import wx.xrc

###########################################################################
## Class mainFrame
###########################################################################

class mainFrame ( wx.Frame ):

    def __init__( self, parent ):
        wx.Frame.__init__ ( self, parent, id = wx.ID_ANY, title = wx.EmptyString, pos = wx.DefaultPosition, size = wx.Size( 500,300 ), style = wx.DEFAULT_FRAME_STYLE|wx.TAB_TRAVERSAL )

        self.SetSizeHintsSz( wx.DefaultSize, wx.DefaultSize )

        bSizer1 = wx.BoxSizer( wx.VERTICAL )

        self.m_buttonlogin = wx.Button( self, wx.ID_ANY, u"Login", wx.DefaultPosition, wx.DefaultSize, 0 )
        bSizer1.Add( self.m_buttonlogin, 0, wx.ALL, 5 )

        self.m_buttondisabled = wx.Button( self, wx.ID_ANY, u"Dsiabled", wx.DefaultPosition, wx.DefaultSize, 0 )
        self.m_buttondisabled.Enable( False )

        bSizer1.Add( self.m_buttondisabled, 0, wx.ALL, 5 )


        self.SetSizer( bSizer1 )
        self.Layout()

        self.Centre( wx.BOTH )

        # Connect Events
        self.m_buttonlogin.Bind( wx.EVT_BUTTON, self.OnLogin )

    def __del__( self ):
        pass


    # Virtual event handlers, overide them in your derived class
    def OnLogin( self, event ):
        loginFrame.Show(self)
        event.Skip()


###########################################################################
## Class loginFrame
###########################################################################

class loginFrame ( wx.Frame ):

    def __init__( self, parent ):
        wx.Frame.__init__ ( self, parent, id = wx.ID_ANY, title = wx.EmptyString, pos = wx.DefaultPosition, size = wx.Size( 500,300 ), style = wx.DEFAULT_FRAME_STYLE|wx.TAB_TRAVERSAL )

        self.SetSizeHintsSz( wx.DefaultSize, wx.DefaultSize )

        bSizer2 = wx.BoxSizer( wx.VERTICAL )

        self.m_textCtrlusername = wx.TextCtrl( self, wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.DefaultSize, 0 )
        bSizer2.Add( self.m_textCtrlusername, 0, wx.ALL, 5 )

        self.m_textCtrlpassword = wx.TextCtrl( self, wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.DefaultSize, 0 )
        bSizer2.Add( self.m_textCtrlpassword, 0, wx.ALL, 5 )

        self.m_buttonOK = wx.Button( self, wx.ID_ANY, u"OK", wx.DefaultPosition, wx.DefaultSize, 0 )
        bSizer2.Add( self.m_buttonOK, 0, wx.ALL, 5 )


        self.SetSizer( bSizer2 )
        self.Layout()

        self.Centre( wx.BOTH )

        # Connect Events
        self.m_buttonOK.Bind( wx.EVT_BUTTON, self.OnOK )

    def __del__( self ):
        pass


    # Virtual event handlers, overide them in your derived class
    def OnOK( self, event ):
        # Enable "m_buttondisabled" button in the mainFrame
        event.Skip()

Thanks.

标签: pythonpython-2.7wxpython

解决方案


An simple way to achieve this is to make use of the parent attribute in the loginFrame.

import wx
import wx.xrc

###########################################################################
## Class mainFrame
###########################################################################

class mainFrame ( wx.Frame ):

    def __init__( self, parent ):
        wx.Frame.__init__ ( self, parent, id = wx.ID_ANY, title = wx.EmptyString, pos = wx.DefaultPosition, size = wx.Size( 500,300 ), style = wx.DEFAULT_FRAME_STYLE|wx.TAB_TRAVERSAL )

        self.SetSizeHints( wx.DefaultSize, wx.DefaultSize )

        bSizer1 = wx.BoxSizer( wx.VERTICAL )

        self.m_buttonlogin = wx.Button( self, wx.ID_ANY, u"Login", wx.DefaultPosition, wx.DefaultSize, 0 )
        bSizer1.Add( self.m_buttonlogin, 0, wx.ALL, 5 )

        self.m_buttondisabled = wx.Button( self, wx.ID_ANY, u"Disabled", wx.DefaultPosition, wx.DefaultSize, 0 )
        self.m_buttondisabled.Enable( False )

        bSizer1.Add( self.m_buttondisabled, 0, wx.ALL, 5 )


        self.SetSizer( bSizer1 )
        self.Layout()

        self.Centre( wx.BOTH )

        # Connect Events
        self.m_buttonlogin.Bind( wx.EVT_BUTTON, self.OnLogin )

    def __del__( self ):
        pass


    # Virtual event handlers, overide them in your derived class
    def OnLogin( self, event ):
        loginFrame(self).Show()
        event.Skip()


###########################################################################
## Class loginFrame
###########################################################################

class loginFrame ( wx.Frame ):

    def __init__( self, parent ):
        wx.Frame.__init__ ( self, parent, id = wx.ID_ANY, title = wx.EmptyString, pos = wx.DefaultPosition, size = wx.Size( 500,300 ), style = wx.DEFAULT_FRAME_STYLE|wx.TAB_TRAVERSAL )

        self.parent = parent
        self.SetSizeHints( wx.DefaultSize, wx.DefaultSize )

        bSizer2 = wx.BoxSizer( wx.VERTICAL )

        self.m_textCtrlusername = wx.TextCtrl( self, wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.DefaultSize, 0 )
        bSizer2.Add( self.m_textCtrlusername, 0, wx.ALL, 5 )

        self.m_textCtrlpassword = wx.TextCtrl( self, wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.DefaultSize, 0 )
        bSizer2.Add( self.m_textCtrlpassword, 0, wx.ALL, 5 )

        self.m_buttonOK = wx.Button( self, wx.ID_ANY, u"OK", wx.DefaultPosition, wx.DefaultSize, 0 )
        bSizer2.Add( self.m_buttonOK, 0, wx.ALL, 5 )


        self.SetSizer( bSizer2 )
        self.Layout()

        self.Centre( wx.BOTH )

        # Connect Events
        self.m_buttonOK.Bind( wx.EVT_BUTTON, self.OnOK )

    def __del__( self ):
        pass


    # Virtual event handlers, overide them in your derived class
    def OnOK( self, event ):
        # Enable "m_buttondisabled" button in the mainFrame
        self.parent.m_buttondisabled.Enable( True )
        self.parent.m_buttonlogin.Enable( False)
        event.Skip()

app = wx.App()
frame = mainFrame(None)
frame.Show()
app.MainLoop()

enter image description here


推荐阅读