If this is the wrong place to post this, please advise better place. Otherwise, I have created the following python program and it works. Running on XP. I think I am now at that stage of learning python where I'm not quit a newbie and I am not really knowlegable. I know just enough to be dangerous and can really screw things up.
Any suggestion on improving would be greatly appreciated. However my real question is I would like to run this program under a GUI interface and have the GUI have a start button to start this process running and the messages in the program placed in a multiline text field which when the stop button is pressed the text field would be copied to a logfile and the program exited. Below this program is the skeleton of the python gui program using wxPython (the gui program also works). I have a metal block on merging the two programs. I think part of the problem is the first is not really using object except for the database access and the gui is all object. Second, I'am getting all wrapped up with variable, object, etc scope issues. ** FIRST PROGRAM ** """This program is an attempt to modularize the lmsface program. I also will try to document the logic of the program""" import os import glob import time import re import shutil from win32com.client import Dispatch from ADOConstants import * def cvtfiles(): """ cvtfiles is the driving routine for converting and/or changing the V1sta quote flat file being sent by QuotePro to Unique. The function gets a list of the files in the FTP directory path and opens each file one at a time and copies the data (with any necessary changes or additions to the output directory where V1sta's interface program picks it up and converts it into the V1sta's SQL quote files. Individual functions are called to process different segments of the flat file record.""" global novehflag novehflag = False global ofile list1 = glob.glob('*.dat') for f1 in list1: if f1.lower().startswith("unq"): if f1.lower().rfind("void") < 0: print f1 + " is being processed now." input1 = open(cfdir + f1, 'r') output = open(ctdir + f1, 'w+') ifile = input1.readline() output.write(wrkpol(ifile)) output.write(wrkdrv(ifile,1406,6)) output.write(wrkveh(ifile,1784,6)) if novehflag == True: input1.close() output.close() shutil.copy2(cfdir + f1,cfdir + 'voided\\' + f1) os.remove(cfdir + f1) os.remove(ctdir + f1) novehflag = False else: output.write(wrkmisc(ifile,2582)) output.write(wrkviol(ifile,2774,16)) output.write(wrkaccid(ifile,3270,16)) output.write(wrkmisc2(ifile,3638)) output.write(wrkcov(ifile,3666,6)) output.write(wrklp(ifile,4314,7)) output.write(wrkai(ifile,4909,6)) output.write(wrkmisc3(ifile,5707)) output.close() input1.close() shutil.copy2(cfdir + f1,cfdir + 'processed\\' + f1) os.remove(cfdir + f1) print f1 + " has been processed." else: shutil.copy2(cfdir + f1,cfdir + 'voided\\' + f1) os.remove(cfdir + f1) print f1 + " is a VOIDED Quote from QuotePro." else: pass def wrkpol(ifile): """ wrkpol functions converts the policy information segment. Currently the only changes made to the policy segment is to change Current-Carrier-Type to 0 if it contains a 0 or 1 or change Current-Carrier-Type to 1 if it contains a 2""" polwrk = '' polwrk = polwrk + ifile[0:577] polwrk = polwrk + ' ' polwrk = polwrk + ifile[588:653] if ifile[653:654] in ['0','1']: polwrk = polwrk + '0' else: polwrk = polwrk + '1' polwrk = polwrk + ifile[654:974] maxcnt = 6 cnt = 0 strstart = 974 while cnt < maxcnt: if ifile[strstart + 41:strstart + 52] == ' ': polwrk = polwrk + ifile[strstart:strstart + 72] else: polwrk = polwrk + ifile[strstart:strstart + 41] polwrk = polwrk + ' ' polwrk = polwrk + ifile[strstart + 52:strstart + 72] strstart += 72 cnt += 1 return polwrk def wrkdrv(ifile,strstart,maxcnt): """ wrkdrv function at this point just moves the data as is. The driver segment is an occurs 6""" cnt = 0 drvwrk = '' while cnt < maxcnt: if ifile[strstart + 23:strstart + 31] <> ' ': drvwrk = drvwrk + ifile[strstart:strstart + 63] else: drvwrk = drvwrk + ifile[strstart:strstart + 63] strstart += 63 cnt += 1 return drvwrk def wrkveh(ifile,strstart,maxcnt): """ wrkveh function does an SQL record lookup to try an select the correct vehicle in the V1sta make and model files. If the correct model is found I move V1sta's make model and body descriptions to the flat file. Currently, I hard code a 1 for vehicle use. The drive segment is an occurs 6""" global novehflag cnt = 0 vehwrk = '' while cnt < maxcnt: if ifile[strstart:strstart + 10] == ' ': if cnt == 0: print 'No vehicle on quote' novehflag = True vehwrk = vehwrk + ifile[strstart:strstart + 133] else: vehwrk = vehwrk + ifile[strstart:strstart + 133] else: vmake = ifile[strstart:strstart + 10] vyear = ifile[strstart + 98:strstart + 102] vvin4_8 = ifile[strstart +53:strstart + 58] vmodel = '' vbody = '' oParmYear.Value = vyear oParmMake.Value = vmake (oRS, result) = oCmd.Execute() while not oRS.EOF: wvin = oRS.Fields.Item("VO_VIN_NO").Value.replace('*','.') wvin.replace('*','.') wvin = wvin[0:5] r1 = re.compile(wvin) if r1.match(vvin4_8): vmake = oRS.Fields.Item("VA_MK_DESCRIP").Value vmodel = oRS.Fields.Item("VO_MODEL").Value vbody = oRS.Fields.Item("VO_DESCRIPTION").Value vmodelid = oRS.Fields.Item("VO_MODEL_ID").Value print 'DRC model ' + vmake + ' ' + vyear + ' ' + vmodel + \ ' ' + vmodelid vehwrk = vehwrk + vmake + vmodel + vbody break else: oRS.MoveNext() else: vehwrk = vehwrk + ifile[strstart:strstart + 50] print 'DRC model NOT FOUND' vehwrk = vehwrk + ifile[strstart + 50:strstart + 107] vehwrk = vehwrk + '1' vehwrk = vehwrk + ifile[strstart + 108:strstart + 133] strstart += 133 cnt += 1 return vehwrk def wrkmisc(ifile,strstart): """ wrkmisc function was a simplistic way to take care of misc vehicle data which was not formated correctly in the flate file to begin with.""" return ifile[2582:2774] def wrkviol(ifile,strstart,maxcnt): """ wrkviol function is an occurs 6 and is a straight move of the data""" cnt = 0 violwrk = '' while cnt < maxcnt: if ifile[strstart:strstart + 1] <> ' ': violwrk = violwrk + ifile[strstart:strstart + 31] else: violwrk = violwrk + ifile[strstart:strstart + 31] strstart += 31 cnt += 1 return violwrk def wrkaccid(ifile,strstart,maxcnt): """ wrkaccid function is an occurs 6 and is a straight move of the data""" cnt = 0 accdwrk = '' while cnt < maxcnt: if ifile[strstart:strstart + 7] <> ' ': accdwrk = accdwrk + ifile[strstart:strstart + 23] else: accdwrk = accdwrk + ifile[strstart:strstart + 23] strstart += 23 cnt += 1 return accdwrk def wrkmisc2(ifile,strstart): """ wrkmisc2 function is again code to pickup data that probably should have been placed somewhere else but just got tacked on here""" return ifile[3638:3666] def wrkcov(ifile,strstart,maxcnt): """ wrkcov function moves the coverage data on any coverage segment which has towing or rental premium it files in the coverage fields for towing and rental coverage. This is also an occurs 6 field""" cnt = 0 covwrk = '' while cnt < maxcnt: if ifile[strstart + 17:strstart + 19] <> ' ': covwrk = covwrk + ifile[strstart:strstart + 8] if ifile[strstart + 92:strstart + 100] == '0 ': covwrk = covwrk + ifile[strstart + 8:strstart + 12] else: covwrk = covwrk + '50 ' if ifile[strstart + 100:strstart + 108] == '0 ': covwrk = covwrk + ifile[strstart + 12:strstart + 16] else: covwrk = covwrk + '20 ' covwrk = covwrk + ifile[strstart + 16:strstart + 108] else: covwrk = covwrk + ifile[strstart:strstart + 108] strstart += 108 cnt += 1 return covwrk def wrklp(ifile,strstart,maxcnt): """ wrklp function moves the loss payee data with no changes. It is an occurs 7. I am not sure if QuotePro messed up on the occurs which should be a 6 and V1sta just went with the flow or what. In addition there are 3 other field that SHOULD have gone in this segment but are in the Additional Insured segment which are LP-ZIP-CODE-1, LP-ZIP-CODE-2, AND LP-CANCEL-DATE.""" cnt = 0 lpwrk = '' while cnt < maxcnt: if ifile[strstart:strstart] <> ' ': lpwrk = lpwrk + ifile[strstart:strstart + 85] else: lpwrk = lpwrk + ifile[strstart:strstart + 85] strstart += 85 cnt += 1 return lpwrk def wrkai(ifile,strstart,maxcnt): """ wrkai function moves the additional insured information as well as the three loss payee fields mentioned in the wrklp function, go figure. This is an occurs 6""" cnt = 0 aiwrk = '' while cnt < maxcnt: if ifile[strstart:strstart] <> ' ': aiwrk = aiwrk + ifile[strstart:strstart + 133] else: aiwrk = aiwrk + ifile[strstart:strstart + 133] strstart += 133 cnt += 1 return aiwrk def wrkmisc3(ifile,strstart): """ wrkmisc3 just moves the remaining part of the file unchanged""" return ifile[5707:6435] # The following code creates a connection object, # assigns the connection string, opens the # connection object, and then verifies a good # connection. oConn = Dispatch('ADODB.Connection') oConn.ConnectionString = "Provider=SQLOLEDB.1;" +\ "Data Source=uicesv05;" +\ "uid=aiis;" +\ "pwd=aiis;" +\ "database=auto_mo_001" oConn.Open() if oConn.State == adStateOpen: print "Database connection SUCCEEDED" else: print "Database connection FAILED" # The following code creates a command object, # assigns the command to the connection object, # sets the query, creates the parameters objects to # be passed to the command object and requests the # query to be prepared (compiled by the SQL system). oCmd = Dispatch('ADODB.Command') oCmd.ActiveConnection = oConn oCmd.CommandType = adCmdText oCmd.CommandText = """\ SELECT VA_MK_YEAR,VA_MK_DESCRIP,VO_VIN_NO,VO_MODEL,VO_BODY, VO_DESCRIPTION,VO_MODEL_ID FROM D014800 INNER JOIN D014900 ON VA_MK_NUMBER_VER = VO_MAKE_NO AND VA_MK_YEAR = VO_YEAR WHERE VA_MK_YEAR = ? AND VA_MK_DESCRIP = ? """ vyear = '' vmake = '' oParmYear = oCmd.CreateParameter(vyear,adChar,adParamInput) oParmYear.Size = 4 oParmMake = oCmd.CreateParameter(vmake,adChar,adParamInput) oParmMake.Size = 10 oCmd.Parameters.Append(oParmYear) oCmd.Parameters.Append(oParmMake) oCmd.Prepared = True # The following code saves the current working directory # and creates a copy from directory variable and a copy # to directory variable. We then change the working dir. # to the copy from dir. # # The copy from dir. is the FTP library that the raters # send the files to. The copy to dir. is where program # send the changed file to where it is then picked up by # DRC's interface program and entered into the V1sta # system. currdir = os.getcwd() cfdir = currdir + '\\quotepro\\' ctdir = currdir + '\\unique\\' os.chdir(cfdir) # Next comes what is an infinite loop YES on purpose for # right now. I intend to eventually replace this code with # a gui window (as soon as I figure out how). Basicly, the # way the loop wooks is that it will continue looping # through the copy from dir (cfdir) looking for files. # As long as it finds files it will process the files # and then move them to the copy to dir. (ctdir). If no # files are found the program goes into sleep mode for a # short time (currently 15 sec) and then looks in the dir # again. while True: cvtfiles() # If no files are found in the FTP directory the program goes # to sleep for 15 seconds time.sleep(15) # Closes the SQL record set object oRS.Close() oRS = None # Closes the SQL connection if oConn.State == adStateOpen: oConn.Close() oConn = None ** GUI PROGRAM ** """This program is an attempt to modularize the lmsface program. I also will try to document the logic of the program""" import wx import os ID_ABOUT = 101 ID_OPEN = 102 ID_BUTTON1 = 110 ID_BUTTON2 = 120 ID_EXIT = 200 class MainWindow(wx.Frame): def __init__(self, parent, ID, title): self.dirname = '' wx.Frame.__init__(self, parent, wx.ID_ANY, title, style = wx.DEFAULT_FRAME_STYLE|wx.NO_FULL_REPAINT_ON_RESIZE) self.control = wx.TextCtrl(self, 1, style = wx.TE_MULTILINE) self.CreateStatusBar() filemenu = wx.Menu() filemenu.Append(ID_OPEN, '&Open', ' Open a file to edit') filemenu.AppendSeparator() filemenu.Append(ID_ABOUT, '&About', ' Information about this program') filemenu.AppendSeparator() filemenu.Append(ID_EXIT, 'E&xit', 'Terminate the program') menuBar = wx.MenuBar() menuBar.Append(filemenu, '&File') self.SetMenuBar(menuBar) wx.EVT_MENU(self, ID_ABOUT, self.OnAbout) wx.EVT_MENU(self, ID_EXIT, self.OnExit) wx.EVT_MENU(self, ID_OPEN, self.OnOpen) self.button1 = wx.Button(self, ID_BUTTON1, '&Start') self.button2 = wx.Button(self, ID_BUTTON2, '&Stop') wx.EVT_BUTTON(self, ID_BUTTON1, self.OnStart) wx.EVT_BUTTON(self, ID_BUTTON2, self.OnStop) self.sizer2 = wx.BoxSizer(wx.HORIZONTAL) self.sizer2.Add(self.button1, 1, wx.EXPAND) self.sizer2.Add(self.button2, 1, wx.EXPAND) self.sizer = wx.BoxSizer(wx.VERTICAL) self.sizer.Add(self.control, 1, wx.EXPAND) self.sizer.Add(self.sizer2, 0, wx.EXPAND) self.SetSizer(self.sizer) self.SetAutoLayout(1) self.sizer.Fit(self) self.Show(1) def OnAbout(self, e): d = wx.MessageDialog(self, 'A sample editor \n' ' in wxPython',"About Sample Editor", wx.OK) d.ShowModal() d.Destroy() def OnExit(self, e): self.Close(True) def OnOpen(self,e): """ Open a file """ self.dirname = '' dlg = wx.FileDialog(self, "Choose a file", self.dirname, "", "*.*", wx.OPEN) if dlg.ShowModal() == wx.ID_OK: self.filename = dlg.GetFilename() self.dirname = dlg.GetDirectory() f = open(os.path.join(self.dirname,self.filename),'r') self.control.SetValue(f.read()) f.close() dlg.Destroy def OnStart(self, e): self.control.AppendText('Start Button Pressed\n') def OnStop(self, e): self.control.AppendText('Stop Button Pressed\n') class myApp(wx.App): def OnInit(self): frame = MainWindow(None, -1, "QuotePro/V1sta Interface") frame.Show(True) self.SetTopWindow(frame) return True app = myApp() app.MainLoop() -- http://mail.python.org/mailman/listinfo/python-list