这部分内容主要介绍如何调试自动生成的python代码,在windows系统上显示出来,同时使代码简洁,易于维护。
1、 拷贝noname.py代码到myWin.py
2、新建mainWin.py文件,用于在windows python3调试环境下,显示设计的GUI界面。
import wx
\# 导入mywin.py中内容
import mywin
\# 创建mainWin类并传入mywin.MyFrame1
class mainWin(mywin.MyFrame1):
\# 实现Button控件的响应函数showMessage
def showMessage(self, event):
self.m_textCtrl1.Clear()
self.m_textCtrl1.SetValue('hello world')
if __name__ == '__main__':
\# 下面是使用wxPython的固定用法
app = wx.App()
main_win = mainWin(None)
main_win.Show()
app.MainLoop()
windows10 下面,powershell里面调试效果如下:
3、根据python UI代码重构原则,对myWin.py代码进行重构
重构前:
# -*- 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 MyFrame1
###########################################################################
class MyFrame1 ( 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 )
bSizer2 = wx.BoxSizer( wx.VERTICAL )
self.m_staticText1 = wx.StaticText( self, wx.ID_ANY, u"用户名", wx.DefaultPosition, wx.DefaultSize, 0 )
self.m_staticText1.Wrap( -1 )
bSizer2.Add( self.m_staticText1, 0, wx.ALL, 5 )
self.m_textCtrl1 = wx.TextCtrl( self, wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.DefaultSize, 0 )
bSizer2.Add( self.m_textCtrl1, 0, wx.ALL, 5 )
self.m_staticText2 = wx.StaticText( self, wx.ID_ANY, u"密码", wx.DefaultPosition, wx.DefaultSize, 0 )
self.m_staticText2.Wrap( -1 )
bSizer2.Add( self.m_staticText2, 0, wx.ALL, 5 )
self.m_textCtrl2 = wx.TextCtrl( self, wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.DefaultSize, 0 )
bSizer2.Add( self.m_textCtrl2, 0, wx.ALL, 5 )
self.m_staticText3 = wx.StaticText( self, wx.ID_ANY, u"确认密码", wx.DefaultPosition, wx.DefaultSize, 0 )
self.m_staticText3.Wrap( -1 )
bSizer2.Add( self.m_staticText3, 0, wx.ALL, 5 )
self.m_textCtrl3 = wx.TextCtrl( self, wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.DefaultSize, 0 )
bSizer2.Add( self.m_textCtrl3, 0, wx.ALL, 5 )
self.SetSizer( bSizer2 )
self.Layout()
self.Centre( wx.BOTH )
def __del__( self ):
pass
重构原则:
不要重复:
你应该避免有多个相同功能的段。
当这个功能需要改变时,这维护起来很头疼。
一次做一件事情:
一个方法应该并且只做一件事情。
各自的事件应该在各自的方法中。
方法应该保持短小。
嵌套的层数要少:
尽量使嵌套代码不多于2或3层。
对于一个单独的方法,深的嵌套也是一个好的选择。
避免字面意义上的字符串和数字:
字面意义上的字符串和数字应使其出现在代码中的次数最小化。
一个好的方法是,把它们从你的代码的主要部分中分离出来,并存储于一个列表或字典中。
思考:
既然是调试注册界面,后面必定要增加注册成功后跳转到别的界面的场景(如多Frame场景),所以这里将class MyFrame1改成class RegisterFrame。还要增加一个guiManager.py文件,用于管理注册成功后的界面跳转功能。下篇文章介绍多界面跳转。这里只介绍重构wxFormBuilder自动生成python界面代码。
myWin.py重构后:
# -*- 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
DEFAULT_REGISTER_LIST = [u"用户名",u"密码",u"确认密码"]
###########################################################################
## Class RegisterFrame
###########################################################################
class RegisterFrame( wx.Frame ):
def __init__( self, parent, id = -1, UpdateUI=None):
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.UpdateUI = UpdateUI
self.InitUI()
def InitUI(self):
self.SetSizeHints( wx.DefaultSize, wx.DefaultSize )
self.BoxSizer1Init()
self.SetSizer( self.bSizer1 )
self.Layout()
self.Centre( wx.BOTH )
def staticTextInit(self,name):
self.m_staticText = wx.StaticText(self, wx.ID_ANY, name, wx.DefaultPosition, wx.DefaultSize, 0 )
self.m_staticText.Wrap( -1 )
return self.m_staticText
def textCtrlInit(self):
self.m_textCtrl = wx.TextCtrl(self,wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.DefaultSize, 0 )
return self.m_textCtrl
def BoxSizer1Init(self):
self.m_staticText1 = self.staticTextInit(DEFAULT_REGISTER_LIST[0])
self.m_staticText2 = self.staticTextInit(DEFAULT_REGISTER_LIST[1])
self.m_staticText3 = self.staticTextInit(DEFAULT_REGISTER_LIST[2])
self.m_textCtrl1 = self.textCtrlInit()
self.m_textCtrl2 = self.textCtrlInit()
self.m_textCtrl3 = self.textCtrlInit()
self.bSizer1 = wx.BoxSizer( wx.VERTICAL )
self.bSizer1.Add( self.m_staticText1, 0, wx.ALL, 5 )
self.bSizer1.Add( self.m_textCtrl1, 0, wx.ALL, 5 )
self.bSizer1.Add( self.m_staticText2, 0, wx.ALL, 5 )
self.bSizer1.Add( self.m_textCtrl2, 0, wx.ALL, 5 )
self.bSizer1.Add( self.m_staticText3, 0, wx.ALL, 5 )
self.bSizer1.Add( self.m_textCtrl3, 0, wx.ALL, 5 )
def __del__( self ):
pass
重构后代码调试:
重构前后代码对比可以清楚看出,重构GUI界面代码带来的好处。