2015-07-13 98 views
0

我想要创建一个图形用户界面在Windows我的Python程序,我有点糊涂了ATM ..我应该如何在我的应用程序中使用wxFormBuilder Python GUI代码?

我已经创建使用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() 

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

how am i supposed to use it with my application?

我找到这个教程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代码是好的,问题是我不知道如何初始化它并添加一些功能。

有人可以帮我解决这个问题吗?

回答

0

我有一个sucessfull尝试使用:

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

但实际上我不知道为什么它的工作.. 还是需要一些解释,请.. :-)

2

您遇到的问题用“init”函数/方法。它接受两个参数(自我&父级),您在创建MainFrame对象时必须指定它。

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

被自动指定(你没有明确指定的话)

设为None(你明确指定为无)

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

enter image description here

+0

在哪里截图? –

+0

图片在:http://i.stack.imgur.com/F3jhO.png –

+0

现在显示。它只是一个长方形的白色盒子 –

1

你只需要添加以下到您的程序的底部:

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

这告诉Python来要做的就是创建wx.App类的一个实例。 False参数告诉wxPython它不应该将stdout重定向到一个新窗口。接下来,我们创建您的班级的一个实例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() 
相关问题