加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

wxpython – 一个框架,多个面板,模块化代码

发布时间:2020-12-20 11:33:37 所属栏目:Python 来源:网络整理
导读:我正在开发一个相当大的GUI项目,因此使用wx python来构建它.我有一个框架,多个具有自己功能的框架和一个导入gui组件以及其他外部函数的主文件.我决定保持gui / wxpython代码不同,以便更好地模块化代码. 我的主要问题是如何在单独的面板中执行这些功能以及如
我正在开发一个相当大的GUI项目,因此使用wx python来构建它.我有一个框架,多个具有自己功能的框架和一个导入gui组件以及其他外部函数的主文件.我决定保持gui / wxpython代码不同,以便更好地模块化代码.

我的主要问题是如何在单独的面板中执行这些功能以及如何使它们从我的主python文件中运行.

下面是我的wxpython代码示例:

import wx

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( 800,600 ),style = wx.DEFAULT_FRAME_STYLE|wx.TAB_TRAVERSAL )

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

        bSizer1 = wx.BoxSizer( wx.VERTICAL )

        self.SetSizer( bSizer1 )
        self.Layout()

        self.panelOne = panel_one(self)
        self.panelTwo = panel_two(self)

        self.panelTwo.Hide()


        self.Centre( wx.BOTH )

    def __del__( self ):
        pass


class panel_one ( wx.Panel ):

    def __init__( self,parent ):
        wx.Panel.__init__ ( self,style = wx.TAB_TRAVERSAL )

        bSizer5 = wx.BoxSizer( wx.VERTICAL )

        self.m_button2 = wx.Button( self,wx.ID_ANY,u"MyButton",wx.DefaultPosition,wx.DefaultSize,0 )
        bSizer5.Add( self.m_button2,wx.ALL,5 )

        self.SetSizer( bSizer5 )
        self.Layout()

        # Connect Events
        self.m_button2.Bind( wx.EVT_BUTTON,self.changeIntroPanel )

    def __del__( self ):
        pass


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



class panel_two ( wx.Panel ):


    def __init__( self,style = wx.TAB_TRAVERSAL )

    ... some code in here ...

    def __del__( self ):
    pass

所以那些是我的gui组件.然后,在我的主文件中,我导入它并运行gui:

import gui

class MainApp(gui.MainFrame):
    def __init__(self,parent):
        gui.MainFrame.__init__(self,parent)

        self.panelOne = Panel1(self)
        self.panelTwo = Panel2(self)
        self.panelTwo.Hide()

class Panel1(gui.panel_one):
    def __init__(self,parent):
        gui.panel_one.__init__(self,parent)

    def changeIntroPanel( self,event ):
            if self.panelOne.IsShown():
                self.SetTitle("Panel Two Showing")
                self.PanelOne.Hide()
                self.PanelTwo.Show()
            else:
                self.SetTitle("Panel One Showing")
                self.PanelOne.Show()
                self.PanelTwo.Hide()
            self.Layout()


class Panel2(gui.panel_two):
    def __init__(self,parent):
        gui.panel_two.__init__(self,parent)

def main():
    app = wx.App()
    window = MainApp(None)
    window.Show(True)
    app.MainLoop()

if __name__ == '__main__':
    main()

正如你所知,我的想法是我想在我的主文件中完成所有实现.我将如何定义我在第一次在panel_one中定义的changeIntroPanel函数的功能?目前,我们的想法是隐藏panelOne并显示panelTwo.

我之前做过类似的事情,但只有一帧.在这种情况下,它是微不足道的,因为所有函数都在MainFrame类中开始.在这种情况下,我发布的代码将完美地工作.

任何帮助表示赞赏.谢谢.

解决方法

def OnInit(self,parent):用于wx.App,你需要def _ _init_ _(self,parent).

关于__init__请检查:Using inheritance in python

关于__init__和OnInit之间的区别,请查看this link

编辑:

gui.py

import wx

class MainFrame ( wx.Frame ):
    def __init__( self,style = wx.DEFAULT_FRAME_STYLE|wx.TAB_TRAVERSAL )
        self.SetSizeHintsSz( wx.DefaultSize,wx.DefaultSize )
        bSizer1 = wx.BoxSizer( wx.VERTICAL )
        self.SetSizer( bSizer1 )
        self.Layout()

        # self.panelOne = panel_one(self)
        # self.panelTwo = panel_two(self)
        # self.panelTwo.Hide()
        self.Centre( wx.BOTH )
    def __del__( self ):
        pass

class panel_one ( wx.Panel ):
    def __init__( self,style = wx.TAB_TRAVERSAL )
        bSizer5 = wx.BoxSizer( wx.VERTICAL )
        self.m_button2 = wx.Button( self,u"panel 1 button",5 )
        self.SetSizer( bSizer5 )
        self.Layout()
        # Connect Events
        self.m_button2.Bind( wx.EVT_BUTTON,self.changeIntroPanel )
    def __del__( self ):
        pass
    # Virtual event handlers,event ):
        event.Skip()

class panel_two ( wx.Panel ):
    def __init__( self,u"panel 2 button ",self.changeIntroPanel )

    def __del__( self ):
        pass
        # Virtual event handlers,event ):
        event.Skip()

mainapp.py

import wx
import gui

class MainApp(gui.MainFrame):
    def __init__(self,parent)
        self.parent = parent

    def changeIntroPanel( self,event ):
        if self.IsShown():
            self.parent.SetTitle("Panel Two Showing")
            self.Hide()
            self.parent.panelTwo.Show()


class Panel2(gui.panel_two):
    def __init__(self,event ):
        if self.IsShown():
            self.parent.SetTitle("Panel One Showing")
            self.parent.panelOne.Show()
            self.Hide()

def main():
    app = wx.App()
    window = MainApp(None)
    window.Show(True)
    app.MainLoop()

if __name__ == '__main__':
    main()

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读