Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在父wx.Frame中启用按钮_Python_Python 2.7_Wxpython - Fatal编程技术网

Python 在父wx.Frame中启用按钮

Python 在父wx.Frame中启用按钮,python,python-2.7,wxpython,Python,Python 2.7,Wxpython,我需要帮助来启用父wx.Frame中的一个按钮,这里我有一个两类的示例:第一类大型机有两个按钮第一类m_buttonlogin启动第二个wx.Frame类实例loginFrame 和另一个禁用的按钮。 我需要做的是在成功登录子框架后,禁用的按钮在主框架中变为启用 # -*- coding: utf-8 -*- ########################################################################### ## Python code g

我需要帮助来启用父wx.Frame中的一个按钮,这里我有一个两类的示例:第一类大型机有两个按钮第一类m_buttonlogin启动第二个wx.Frame类实例loginFrame 和另一个禁用的按钮。 我需要做的是在成功登录子框架后,禁用的按钮在主框架中变为启用

# -*- 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()

谢谢。

解决这个问题有几种方法。最简单的方法之一就是将您的登录框制作成一个对话框,这样您就可以轻松地以模式显示它。然后添加一个类实例属性,您可以使用该属性确定是否按下了
OK
按钮。在这种情况下,我将使用
self.ok
作为我的属性

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 ):
        login = loginDialog(self)
        dlg = loginDialog(self)
        dlg.ShowModal()

        if dlg.ok:
            self.m_buttondisabled.Enable(True)

        event.Skip()


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

class loginDialog( wx.Dialog ):

    def __init__( self, parent ):
        wx.Dialog.__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.ok = False

        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

    def MakeModal(self, modal=True):
        if modal and not hasattr(self, '_disabler'):
            self._disabler = wx.WindowDisabler(self)
        if not modal and hasattr(self, '_disabler'):
            del self._disabler

        self.Show()


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

if __name__ == '__main__':
    app = wx.App(False)
    frame = mainFrame(None)
    frame.Show()
    app.MainLoop()
通过这样做,我可以检查对话框实例的
ok
属性是否为
True
False
,并通过启用(或不启用)按钮进行相应操作

另一种选择是使用wxPython的内置pubsub模块:


实现这一点的一个简单方法是使用
loginFrame
中的
parent
属性

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()

你好,迈克,谢谢你的代码和逻辑工作的pubsub参考。但对于pubsub来说,它对我不起作用,我认为这是一个版本问题。您使用的是哪个版本的wxPython?我可以举一个简单的例子