井位坐标添加到Las文件功能——Tkinter界面开发学习笔记一

 

   以前我写的处理各种油田开发地质方面使用的数据,都是自己写一些小程序,没有界面,不能算是软件,甚至连程序都算不上,只能说是有点小用途的代码而已。这一次,我将全面介绍“带有界面的”、“全Windows式风格的”小软件的开发过程。

    首先,我要说明软件开发的过程。软件需求分析是软件开发的前期工作,是非常重要的一步,可以说至少占据了30%的重要性,然后软件结构的总体设计(软件架构)占据大概35%,或者更多一点,而代码的编写只占到10%,调试可能占20%,而其他方面仅仅占到5%(这些可能还包括了财务分析等内容,其实财务分析一般是做需求分析中可行性分析的一部分)。

    好了,说完基本的过程,我们谈谈这个具体的小软件开发过程,如果你是初学者,你会学到很多东西。

    我们这个小软件功能非常单一,就一项功能,就是把井位坐标加入到las文件中。当然由于功能小,而且只是帮朋友做的,所以没有什么需求分析。在油田研究院,或者采油厂地质所工作的朋友们都知道las曲线文件,用文本打开后基本上就是下图的样子:

井位坐标添加到Las文件功能——Tkinter界面开发学习笔记一_第1张图片

一般的las 文件中仅仅有井名字(WELL)或者井ID号(UWI),没有坐标,可是有时候在利用las曲线做别的工作的时候,可能需要带有井位坐标(XCRD和YCRD)。很多时候大家都有井位坐标文件,然后从坐标文件中找到坐标,然后打开对应井的las文件,然后把坐标复制粘贴进去,最后结果如下图:

井位坐标添加到Las文件功能——Tkinter界面开发学习笔记一_第2张图片

上图红色区域就是我们从坐标文件中找到然后加入到对应井的las文件中。坐标文件一般大家都有,油田的数据库都能下载到,一般都是文本格式,格式如下图, 其实就是3列,第一列井名,第二列X坐标,第三列Y坐标,当然las文件的文件名也需要是井名字,并且要和坐标文件里的一直,否则就对应不上了。

其实上面所说的就是我们软件要实现的功能,我朋友跟我说上次他自己手动完成了差不多50个文件,差点累死,搞的眼睛都哗哗的流泪

………………………………………………………………………………

  上面说的就算是我们的需求分析(正规的需求分析可不是这样)。下面我们就做一下架构分析,其实就一个功能,根本谈不上什么架构。但是架构还包括界面分析设计,所以我们就分为界面和功能两部分。

    首先看看功能分析:就一个功能写成一个函数,可以被调用就行了。

    其次我们看看界面分析设计:考虑需要导入坐标文件和las文件两种类型,所以至少要有两个地方可以选择这些文件,一个地方是用于选择坐标文件(坐标文件就一个文件),另一个地方用于选择las文件(las文件有很多,因为一口井一个文件),这些文件能够被选择,然后还要有一个运行按钮来调用功能函数。然后加上一个退出按钮就OK了,所以界面的草图看起来应该如下:

井位坐标添加到Las文件功能——Tkinter界面开发学习笔记一_第3张图片

界面中第一个选择按钮用于选择坐标文件,选择坐标文件后,应该在单行文本框中显示选择后的文件路径名称,第二个按钮用于选择las文件,选择后,las文件应该显示在列表中。

最后,功能和界面设计完成后,由于功能单一,所以界面和功能总体设计为一个类,功能作为运行按钮的回调函数即可,当然类里还有一些用于调用的相关函数,比如两个选择按钮的回调函数等,当然这两个选择按钮的回调函数会非常简单啦!

说了这么多,我们就可以开始编码了,在编码之前我们先提示一下,我用python3.1版本试过,不稳定,所以采用的是python2.7版本,不过只要机器上安装了python2.4以上的2.x版本就能运行这个程序。程序代码如下:

 

<textarea cols="50" rows="15" name="code" class="python">#!/usr/local/env python #-*- coding:utf-8 -*- class TopApp: def __init__(self, root): # sone var for return self.crdname = Tkinter.StringVar() self.lasname = Tkinter.StringVar() # a frame for place widgets self.frame = Tkinter.Frame(root) # the programe name label self.labeltitle = Tkinter.Label(self.frame, text="Add coordinate to Las file", font="Arial -16 bold") self.labeltitle.pack() # the first labelframe for selecting coordinate file self.labelcrd = Tkinter.LabelFrame(self.frame, text=" Select coordinates file: ", labelanchor='nw', relief='groove', bd=2) self.labelcrd.pack(anchor='w', ipadx=2, ipady=2, padx=2, pady=2) self.entry = Tkinter.Entry(self.labelcrd, bd=2, width=50, textvariable=self.crdname) self.entry.pack(anchor='w', padx=2, pady=5) self.buttoncrd = Tkinter.Button(self.labelcrd, bd=2, text='Select...', width=10, command=self.COnSelectCrd) self.buttoncrd.pack(after=self.entry, anchor='e', padx=5, pady=2) # the second labelframe for selecting las files self.labellas = Tkinter.LabelFrame(self.frame, text=" Select las files: ",labelanchor='nw', relief='groove', bd=2) self.labellas.pack(anchor='w', ipadx=2, ipady=2, padx=2, pady=2) # a frame for place listbox and scrollbar self.listframe = Tkinter.Frame(self.labellas) self.ysrb = Tkinter.Scrollbar(self.listframe, orient="vertical") self.ysrb.pack(side='right', fill='y') self.dirlist = Tkinter.Listbox(self.listframe, bd=2, width=47, listvariable=self.lasname, yscrollcommand=self.ysrb.set) self.dirlist.pack(anchor='w', padx=2, pady=2) self.ysrb["command"] = self.dirlist.yview self.listframe.pack() #a button for selecting las files self.buttonlas = Tkinter.Button(self.labellas, bd=2, text="Select...", width=10, command=self.COnSelectLas) self.buttonlas.pack(after=self.listframe, anchor='e', padx=5, pady=2) # the button for exiting programe self.buttonexit = Tkinter.Button(self.frame, text="Exit", bd=2, width=10, command=root.quit) self.buttonexit.pack(side='right', padx=5, pady=2) # the button for running programe self.buttonrun = Tkinter.Button(self.frame, text="Run", bd=2, width=10, command=self.COnRun) self.buttonrun.pack(side='right', anchor='e', padx=5, pady=2) self.frame.pack() def COnSelectCrd(self): filename = tkFileDialog.askopenfilename(title="Coordinate file") self.crdname.set(filename) def COnSelectLas(self): filelist = tkFileDialog.askopenfilenames(title="Las files") self.lasname.set(filelist) def getcrd(self, crdfile): # get wellname Dict from coordinate file D = {} coordlist = open(crdfile,'r') for eachline in coordlist: row = eachline.split() D[row[0]] = row[1] + ' ' + row[2] return D def getpath(self, pathnamefile): pathlist = pathnamefile.split('/') pathname = '/'.join(pathlist[0:-1]) newpathname = pathname + "/crdlasfile" if os.path.exists(newpathname): crdpath = newpathname else: os.mkdir(newpathname) crdpath = newpathname return crdpath def getlas(self, lasfile, D, crdpath): # process las file pathlist = lasfile.split('/') extwellname = pathlist[-1] well = extwellname.split('.') wellname = well[0] #return wellname if wellname in D.keys(): crd = D[wellname].split() xcrd = crd[0] ycrd = crd[1] oldlasfile = open(lasfile,'r') resultfilename = crdpath + '/' + wellname + '.las' newlasfile = open(resultfilename, 'w') for aline in oldlasfile: newlasfile.write(aline) if aline[0:3] == "UWI": newlasfile.write("XCRD. " + xcrd + ": /n") newlasfile.write("YCRD. " + ycrd + ": /n") oldlasfile.close() newlasfile.close() else: logname = crdpath + '/log.txt' log = open(logname,'a') log.write(wellname + " isn't in well coordiante file or the file is not a las format/n") def COnRun(self): coord = self.getcrd(self.entry.get()) las = self.dirlist.get(0) pathcwd = self.getpath(las) indextup = self.dirlist.curselection() #print indextup[0] indexnum = int(indextup[0]) + 1 #print indexnum index = [] for eachline in range(indexnum): index.append(eachline) for eachnum in index: eachlasfile = self.dirlist.get(eachnum) self.getlas(eachlasfile, coord, pathcwd) print "%d files have been processed!/n" % (eachnum+1) if __name__ == "__main__": import os import Tkinter import tkFileDialog root = Tkinter.Tk() root.title("Crd2Las") TopApp(root) root.mainloop()</textarea> 

 

代码比较长,尤其是一开始关于界面部分,后面几个以get开始的小写字母的函数全部都是类内部处理函数,以COn开始的函数全部是回调函数,从第131行开始为运行代码,其实就是调用这个类(当然由于功能简单,所以只有一个类)。我们把这个程序保存为Crd2LasGUI.py文件,然后随便放在哪里都行,我放在桌面上了,哈哈。

 

总算把工作完成了,剩下的就是看看我们的成果:

首先看看数据,数据就是很多las文件和一个叫做coordinate.prn的坐标文件,如下图:

然后我们双击放在桌面上的程序,打开界面如下图:

和我们之前设计的基本是一样的,哈哈。先单击第一个select按钮,选择坐标文件,然后单击第二个按钮选择las文件,选择后如下图:

选择后,一定要注意:点击选择las列表中的最后一个文件,否则程序不知道有多少个文件。如下图:

井位坐标添加到Las文件功能——Tkinter界面开发学习笔记一_第4张图片

然后点击运行按钮,运行过程中后面的黑色命令程序中会出现完成多少个程序的提示,请耐心等待,如下图:

运行后,处理完成后,在las文件夹中会生成一个crdlasfile子文件夹,里面存放的就是处理后的las文件。

这就是处理后的那六个文件。

最后,就可以点击Exit按钮退出程序了。

哈哈,由于程序小所以调试的时间很短,但是实际的软件开发一般代码完成后的调试会占去大部分的时间。

 

你可能感兴趣的:(工作,python,command,File,import,button)