用Python创建你第一个GIS程序[3]:前后端搭建
前言:为了区分说明,我们这里也用前端后端这个概念来阐述。本章节使用简单的案例,分别展示前后端的代码,包括一个简单前端 GUI 界面的搭建流程和代码。后端
为了区分说明,我们这里也用前端后端这个概念来阐述。后端在这里就是我们的核心运行代码,是我们程序功能的实现。而在这里我们要实现一个怎样的功能呢?由于是制作一个简单的程序,所以我们也选了一个较为简单的功能,所以选了下面这个文章《Python和ArcGIS自动化制图完全指南》第一节中展示的功能:把线矢量转换成面,然后给面添加4个新字段。 因为之前的文章讲过,所以这里就多说。普普通通的源代码如下:# -*- coding:utf-8 -*-# ---------------------------------------------------------------------------# Author: LiaoChenchen# Created on: 2021/1/17 14:53# arcpy自动化制图完全指南(一):使用arcpy完成工作流import arcpyimport osclass InitPath(object):"""初始化工作空间,创建gdb数据库(如果没有的话)"""def __new__(cls, *args, **kwargs):if not hasattr(cls, "_instance"):# if not cls._instance:cls._instance = object.__new__(cls)return cls._instancedef __init__(self):"""_________________________create folder____________________________"""scratch_path = "D:\doc\Scratch"try:if not os.path.isdir(scratch_path):os.makedirs(scratch_path)except:scratch_path = "E:\doc\Scratch"if not os.path.isdir(scratch_path):os.makedirs(scratch_path)"""_________________________create folder____________________________"""# make gdbscratch_gdb = os.path.join(scratch_path, "Scratch.gdb")if not arcpy.Exists(scratch_gdb):arcpy.CreateFileGDB_management(scratch_path, "Scratch")arcpy.env.workspace = scratch_patharcpy.env.overwriteOutput = Trueself.scratch_path = scratch_pathself.scratch_gdb = scratch_gdbdef __iter__(self):return (i for i in (self.scratch_path, self.scratch_gdb))folder_path, gdb_path = InitPath()arcpy.env.workspace = gdb_patharcpy.env.overwriteOutput = True"""********************************流程代码**********************************"""line = "data/line_data.shp"# 线要素转面,生成的面矢量名称为 polygonarcpy.FeatureToPolygon_management (line, "polygon")# 给 polygon 图层添加字段for name in ["CJQYMC", "CJQYDM", "XJQYMC", "XJQYDM"]:arcpy.AddField_management("polygon", name, "TEXT", field_length = 100)可是只是目前这种状况的话,还是这能在黑乎乎的命令行窗口运行。完全没有达到我们之前的预期,所以接下来,就需要编写 GUI 程序了(图形用户界面程序)。 前端
在《用Python创建你第一个GIS程序》第二章讲解过不同的 GUI 库的选择。所以这里的 GUI 界面我们使用 Python 自带的 Tkinter库 来编写。Note: 在 Python2 中叫 Tkinter,而在 Python3 中叫 tkinter。1.创建基本界面
GUI 图形界面本质上就是一个无限循环程序,只有系统崩溃和人为干预才会退出。先完成一个基本的 GUI,代码如下:# -*- coding:utf-8 -*-import Tkinter as tkclass MyGUI(object):def __init__(self):self.root = tk.Tk()self.root.mainloop() # 执行循环if __name__ == '__main__':MyGUI()self.root 是这个 GUI 程序的根基,或者说母体,后续的按钮、输入框都是创建在 self.root 的基础上。他的创建方式是固定化的,不需要理解。 生成的图形界面如下,是一个空白的界面。但这是重要的一步
2.添加输入框和按钮
按钮和输入框无处不在,是人类和现代计算机程序发生交互的重要单位之一。下面讲解如何创建你的第一个按钮和输入框。先创建出第一个按钮# -*- coding:utf-8 -*-import Tkinter as tkclass MyGUI(object):def __init__(self):self.root = tk.Tk()self.root.geometry("450x600+800+200") # 设置程序窗口大小和打开位置self.root.title("GIS") # 设置程序名称self.create_widget()self.root.mainloop() # 执行循环def create_widget(self):self.but = tk.Button(self.root, text=u"输入线要素", relief="groove") # <<<注释1>>>self.but.pack() # <<<注释2>>>if __name__ == '__main__':MyGUI()方式 create_widget 用于生成各种小部件,并将它们“安装”到 self.root 上。 <<<注释1>>>:生成代码按钮,Button类,正如名字所示,该类是用于生成按钮。<<<注释2>>>:摆放按钮。运行效果如下:
增加了一些细节# -*- coding:utf-8 -*-import Tkinter as tkclass MyGUI(object):def __init__(self):self.root = tk.Tk()self.root.geometry("450x600+800+200") # 设置程序窗口大小和打开位置self.root.title("GIS") # 设置程序名称self.create_widget()self.create_run_button()self.root.mainloop() # 执行循环def create_widget(self):self.frame1 = tk.Frame(self.root, relief="raised", bd=3) #<<<注释1>>>self.frame1.pack(fill="x")self.entry = tk.Entry(self.frame1) #<<<注释2>>>self.entry.pack(side="left",expand=True, fill="x", pady=8, padx=10)self.but = tk.Button(self.frame1, text=u"输入线要素", relief="groove", width=10)self.but.pack(side="right", pady=8)def create_run_button(self): #<<<注释3>>># 生成下方的“运行”按钮self.bottom_frame = tk.Frame(self.root,relief="raised",bd=3)self.bottom_frame.pack(side="bottom",fill="x",anchor="s")self.ok_button=tk.Button(self.bottom_frame,text=u"运行",relief="groove", width=10)self.ok_button.pack(side="right", pady=8)if __name__ == '__main__':MyGUI()<<<注释1>>>:使用 tk.Frame 类创建了一个”框“,将按钮和输入库装了进去,方便排列。<<<注释2>>>:使用 tk.Entry类创建输入框,就下方图片中的白色长条。<<<注释3>>>:在界面的最低端创建了一个“运行”组件:使用"框"将按钮包住放最小面。该按钮最后调用后端的核心功能来运行程序。 运行结果如下:
那么我们的简单前端就搭建完毕了,非常简单把。 结束语
该指南的一个中心思想不是做的大而全、尽善尽美,而是带领带领大家了解一个简单 GIS 程序的构建过程,了解基本的概念、了解如何把 GUI 和 核心的功能代码连接起来、了解运行程序后前端卡死怎么解决。这才是这一指南的目的。那么下一章就是讲解如何把前端的 GUI 界面和后端功能代码连接起来。 分享GIS,不止于Python。荟GIS精粹,关注我,带你飞!我叫 GIS荟(长按扫码也行)欢迎交流点击留言