[英]How am I supposed to use wxFormBuilder Python GUI code in my applications?
我正在嘗試為Windows中的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()
當我從終端運行它時不會顯示任何錯誤...
我應該如何在應用程序中使用它?
我在這里找到了本教程,但我聽不懂。
我也試圖在腳本的末尾添加該代碼:
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代碼很好,問題是我不知道如何初始化它並添加一些功能。
有人可以幫我嗎?
您遇到的問題是“ init”功能/方法。 它接受創建MainFrame對象時必須指定的兩個參數(self和parent)。
def __init__( self, parent ):
......
self是自動指定的(您沒有明確指定它)
parent設置為None(您明確將其指定為None)
請參見下面的屏幕快照和wxFormBuilder-關於“用於制作GUI的GUI”的Python教程
您只需要在程序底部添加以下內容:
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()
我使用以下方法進行了成功嘗試:
#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()
但我實際上不知道它為什么起作用..請仍然需要一些解釋.. :-)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.