【问题标题】:How am I supposed to use wxFormBuilder Python GUI code in my applications?我应该如何在我的应用程序中使用 wxFormBuilder Python GUI 代码?
【发布时间】:2015-07-13 12:58:36
【问题描述】:

我正在尝试在 Windows 中为我的 Python 程序创建一个 GUI,我有点困惑 atm..

我使用 wxFormBuilder 创建了 GUI,它看起来像这样:

# -*- 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 = u"Editor_SPED_LP", pos = wx.DefaultPosition, size = wx.Size( 320,255 ), style = wx.DEFAULT_FRAME_STYLE|wx.TAB_TRAVERSAL )

        self.SetSizeHintsSz( wx.Size( 320,255 ), wx.Size( 320,255 ) )

        bSizer1 = wx.BoxSizer( wx.VERTICAL )

        self.m_textCtrl2 = wx.TextCtrl( self, wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.DefaultSize, 0 )
        bSizer1.Add( self.m_textCtrl2, 0, wx.ALL|wx.EXPAND, 5 )

        self.m_btn_abrirArq = wx.Button( self, wx.ID_ANY, u"Abrir arquivo...", wx.DefaultPosition, wx.DefaultSize, 0 )
        bSizer1.Add( self.m_btn_abrirArq, 0, wx.ALL, 5 )

        self.m_btn_editarTxt = wx.Button( self, wx.ID_ANY, u"Editar .txt", wx.DefaultPosition, wx.DefaultSize, 0 )
        bSizer1.Add( self.m_btn_editarTxt, 0, wx.ALL, 5 )

        self.m_gauge1 = wx.Gauge( self, wx.ID_ANY, 100, wx.DefaultPosition, wx.DefaultSize, wx.GA_HORIZONTAL )
        self.m_gauge1.SetValue( 0 ) 
        bSizer1.Add( self.m_gauge1, 0, wx.ALL, 5 )

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

        self.m_staticText2 = wx.StaticText( self, wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.DefaultSize, 0 )
        self.m_staticText2.Wrap( -1 )
        bSizer1.Add( self.m_staticText2, 0, wx.ALL, 5 )

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


        self.SetSizer( bSizer1 )
        self.Layout()

        self.Centre( wx.BOTH )

        # Connect Events
        self.m_btn_abrirArq.Bind( wx.EVT_BUTTON, self.abrirArquivo )
        self.m_btn_editarTxt.Bind( wx.EVT_BUTTON, self.editarTxt )
        self.m_btn_ajuda.Bind( wx.EVT_BUTTON, self.janelaAjuda )
        self.m_btn_sair.Bind( wx.EVT_BUTTON, self.sair )

    def __del__( self ):
        pass


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

    def editarTxt( self, event ):
        event.Skip()

    def janelaAjuda( self, event ):
        event.Skip()

    def sair( self, event ):
        event.Skip()

当我从终端运行它时,它不会显示任何错误...

我应该如何在我的应用程序中使用它?

我找到了这个教程here,但是我看不懂..

我还尝试在脚本末尾添加该代码:

 if __name__ == "__main__":
        app = wx.App(False)
        frame = MainFrame()
        frame.Show()
        app.MainLoop()

得到了这个错误:

File "gui.py", line 80, in <module>
    frame = MainFrame(seld,parent)
NameError: name 'self' is not defined

所以..看起来gui代码很好,问题是我不知道如何初始化它并添加一些功能..

有人可以帮我吗?

【问题讨论】:

    标签: python windows wxpython nameerror wxformbuilder


    【解决方案1】:

    您只需在程序底部添加以下内容:

    if __name__ == '__main__':
        app = wx.App(False)
        frame = MainFrame(parent=None)
        frame.Show()
        app.MainLoop()
    

    这告诉 Python 要做的是创建一个 wx.App 类的实例。 False 参数告诉 wxPython 它不应该将标准输出重定向到新窗口。接下来,我们创建您的类的实例MainFrame,并将其父级设置为None。之后,我们Show 框架。如果我们不这样做,代码仍然可以工作,但你什么也看不到。最后我们调用应用对象的MainLoop函数,这样wxPython就可以真正开始运行和处理事件了。

    这是完整的代码:

    # -*- 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 = u"Editor_SPED_LP", pos = wx.DefaultPosition, size = wx.Size( 320,255 ), style = wx.DEFAULT_FRAME_STYLE|wx.TAB_TRAVERSAL )
    
            self.SetSizeHintsSz( wx.Size( 320,255 ), wx.Size( 320,255 ) )
    
            bSizer1 = wx.BoxSizer( wx.VERTICAL )
    
            self.m_textCtrl2 = wx.TextCtrl( self, wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.DefaultSize, 0 )
            bSizer1.Add( self.m_textCtrl2, 0, wx.ALL|wx.EXPAND, 5 )
    
            self.m_btn_abrirArq = wx.Button( self, wx.ID_ANY, u"Abrir arquivo...", wx.DefaultPosition, wx.DefaultSize, 0 )
            bSizer1.Add( self.m_btn_abrirArq, 0, wx.ALL, 5 )
    
            self.m_btn_editarTxt = wx.Button( self, wx.ID_ANY, u"Editar .txt", wx.DefaultPosition, wx.DefaultSize, 0 )
            bSizer1.Add( self.m_btn_editarTxt, 0, wx.ALL, 5 )
    
            self.m_gauge1 = wx.Gauge( self, wx.ID_ANY, 100, wx.DefaultPosition, wx.DefaultSize, wx.GA_HORIZONTAL )
            self.m_gauge1.SetValue( 0 )
            bSizer1.Add( self.m_gauge1, 0, wx.ALL, 5 )
    
            self.m_btn_ajuda = wx.Button( self, wx.ID_ANY, u"Ajuda", wx.DefaultPosition, wx.DefaultSize, 0 )
            bSizer1.Add( self.m_btn_ajuda, 0, wx.ALL, 5 )
    
            self.m_staticText2 = wx.StaticText( self, wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.DefaultSize, 0 )
            self.m_staticText2.Wrap( -1 )
            bSizer1.Add( self.m_staticText2, 0, wx.ALL, 5 )
    
            self.m_btn_sair = wx.Button( self, wx.ID_ANY, u"Sair", wx.DefaultPosition, wx.DefaultSize, 0 )
            bSizer1.Add( self.m_btn_sair, 0, wx.ALL, 5 )
    
    
            self.SetSizer( bSizer1 )
            self.Layout()
    
            self.Centre( wx.BOTH )
    
            # Connect Events
            self.m_btn_abrirArq.Bind( wx.EVT_BUTTON, self.abrirArquivo )
            self.m_btn_editarTxt.Bind( wx.EVT_BUTTON, self.editarTxt )
            self.m_btn_ajuda.Bind( wx.EVT_BUTTON, self.janelaAjuda )
            self.m_btn_sair.Bind( wx.EVT_BUTTON, self.sair )
    
        def __del__( self ):
            pass
    
    
        # Virtual event handlers, overide them in your derived class
        def abrirArquivo( self, event ):
            event.Skip()
    
        def editarTxt( self, event ):
            event.Skip()
    
        def janelaAjuda( self, event ):
            event.Skip()
    
        def sair( self, event ):
            event.Skip()
    
    if __name__ == '__main__':
        app = wx.App(False)
        frame = MainFrame(parent=None)
        frame.Show()
        app.MainLoop()
    

    【讨论】:

      【解决方案2】:

      您遇到的问题与“init”函数/方法有关。它接受创建 MainFrame 对象时必须指定的两个参数(self 和 parent)。

      def __init__( self, parent ):
           ......
      

      self 是自动指定的(您没有明确指定)

      parent 设置为 None(您明确将其指定为 None)

      请参阅下面的屏幕截图和wxFormBuilder - Tutorial on “A GUI for making GUIs” for Python

      【讨论】:

      • 截图在哪里?
      • 现在正在显示。之前它只是一个长方形的白盒子
      【解决方案3】:

      我成功尝试使用:

      #importing wx files
      import wx
      #import the newly created GUI file
      import gui
      
      
      #inherit from the MainFrame created in wxFormBuilder and create janelaPrincipal
      class janelaPrincipal(gui.MainFrame):
          #constructor
          def __init__(self,parent):
              #initialize parent class
              gui.MainFrame.__init__(self,parent)
      
      
          #what to do when each function button is clicked
      
          def editarTxt(self,event):
              try:
                  #write the editarTxt code inside here
      
              except Exception:
                  print 'error'
      
      
      #mandatory in wx
      #create an app, False stands for not deteriction stdin/stdout
      #refer manual for details
      app = wx.App(False)
      
      #create an object of janelaPrincipal
      frame = janelaPrincipal(None)
      #show the frame
      frame.Show(True)
      #start the applications
      app.MainLoop()
      

      但我实际上不知道它为什么起作用.. 仍然需要一些解释,拜托.. :-)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-08-04
        • 2020-06-20
        • 2010-09-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多