午夜视频在线网站,日韩视频精品在线,中文字幕精品一区二区三区在线,在线播放精品,1024你懂我懂的旧版人,欧美日韩一级黄色片,一区二区三区在线观看视频

分享

用Python創(chuàng)建你第一個(gè)GIS程序[4]:前后端連接協(xié)作

 GIS薈 2021-09-19
前言:在完成前后端的搭建后,通過(guò)代碼將其連接起來(lái),成為一個(gè)整體,能真正通過(guò)圖形用戶界面操作運(yùn)行的程序!這一章就帶著你一步一步完善上一章搭建好的前后端。

完善 GUI 界面

在上一章中制作了第一個(gè) GUI 界面。這個(gè)界面是“平面”的,是無(wú)法互動(dòng)的,點(diǎn)擊按鈕沒(méi)有任何反應(yīng)。
所以下面就是讓 GUI “立體”起來(lái)的操作教程。
 

按鈕調(diào)用

實(shí)現(xiàn)點(diǎn)擊上方按鈕打開(kāi)文件選擇對(duì)話框。

# -*- coding:utf-8 -*-

import Tkinter as tk

import tkFileDialog #<<注釋1>>

class MyGUI(object):

def __init__(self):

self.root = tk.Tk()

self.root.geometry("450x600+800+200") #大小位置

self.root.title("GIS") #設(shè)置名稱

# run function

self.create_widget()

self.create_run_button()

self.root.mainloop() # 執(zhí)行循環(huán)

def create_widget(self):

self.frame1 = tk.Frame(self.root, relief="raised", bd=3)

self.frame1.pack(fill="x")

self.entry = tk.Entry(self.frame1)

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.config(command=self.open_dialog) #<<注釋2>>

self.but.pack(side="right", pady=8)

def open_dialog(self): #<<注釋3>>

tkFileDialog.askopenfilename()

def create_run_button(self):

# 生成下方的“運(yùn)行”按鈕

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"運(yùn)行",relief="groove", width=10)

self.ok_button.pack(side="right", pady=8)

if __name__ == '__main__':

MyGUI()

<<注釋1>>:tkFileDialog 是屬于 Tkinter 框架下的對(duì)話框創(chuàng)建模塊。注意該模塊在 Python3 中的導(dǎo)入方式和Python2 不一樣。
 
<<注釋2>>:self.but.config(command=self.open_dialog)self.but = tk.Button(self.frame1, command=self.open_dialog) 的效果是等價(jià)的。
command 參數(shù)需要我們傳入一個(gè)函數(shù)或者方法(甚至包括類),當(dāng)點(diǎn)擊該按鈕時(shí)會(huì)觸發(fā)該函數(shù)或者方法。
我們傳入方法 open_dialog:當(dāng)鼠標(biāo)點(diǎn)擊該按鈕時(shí)程序執(zhí)行 open_dialog 方法來(lái)打開(kāi)文件選擇對(duì)話框。
Note: 傳入的函數(shù)、方法或者類都不能在后面添加小括號(hào) ()。因?yàn)?strong style="box-sizing: border-box;">()表示執(zhí)行前面的字符串所引用的內(nèi)存地址。如果加了()符號(hào),程序運(yùn)行時(shí)就會(huì)自動(dòng)運(yùn)行傳入的方法、函數(shù)或者類,但是我們?cè)谶@里的需求是點(diǎn)擊按鈕才執(zhí)行。
 
<<注釋3>>:該方法用于打開(kāi)文件選擇對(duì)話框。
 
運(yùn)行效果:

 

更新文本框

選中文件后更新文本框(Entry)的信息。

# -*- coding:utf-8 -*-

import Tkinter as tk

import tkFileDialog

class MyGUI(object):

def __init__(self):

self.root = tk.Tk()

self.root.geometry("450x600+800+200") #設(shè)置窗口大小、位置

self.root.title("GIS") #設(shè)置程序名稱

self.var = tk.StringVar() #<<注釋1>>

# run function

self.create_widget()

self.create_run_button()

self.root.mainloop() # 執(zhí)行循環(huán)

def create_widget(self):

self.frame1 = tk.Frame(self.root, relief="raised", bd=3)

self.frame1.pack(fill="x")

self.entry = tk.Entry(self.frame1)

self.entry.config(textvariable=self.var) #<<注釋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.config(command=self.open_dialog)

self.but.pack(side="right", pady=8)

def open_dialog(self):

varrr = tkFileDialog.askopenfilename()

self.var.set(varrr) #<<注釋3>>

def create_run_button(self):

# 生成下方的“運(yùn)行”按鈕

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"運(yùn)行",relief="groove", width=10)

self.ok_button.pack(side="right", pady=8)

if __name__ == '__main__':

MyGUI()

<<注釋1>>:創(chuàng)建一個(gè)字符串變量。用來(lái)和 Entry 綁定。
 
<<注釋2>>:將字符串變量和 Entry 的默認(rèn)值綁定到一起。當(dāng)字符串變量更新的時(shí)候,文本框會(huì)自動(dòng)顯示變量。
 
<<注釋3>>:更新字符串變量。
 
運(yùn)行效果:

 

啟動(dòng)鍵

現(xiàn)在需要對(duì)我們的“啟動(dòng)鍵”動(dòng)手了。

啟動(dòng)鍵有以下兩個(gè)功能:
  • 收集我們使用按鈕選擇的文件地址,該文件會(huì)被后端程序調(diào)用。

  • 運(yùn)行后端程序。

 
現(xiàn)在已經(jīng)知道了 tk.Button 類中的 command 參數(shù)可以指定一個(gè)函數(shù)或者方法(包括類),點(diǎn)擊該按鈕時(shí)就會(huì)觸發(fā)。所以只需要將后端的主程序當(dāng)做 tk.Button 類的參數(shù)傳入就行。
 

修改后端代碼

在傳入之前修改了第三章的后端代碼,使其更簡(jiǎn)潔和簡(jiǎn)單。
原始代碼見(jiàn)第三節(jié)《前后端搭建》。
在原來(lái)的基礎(chǔ)上改動(dòng)了工作空間的配置:因?yàn)楹蠖说臄?shù)據(jù)處理等工作很簡(jiǎn)單所以就沒(méi)有使用 GDB 數(shù)據(jù)庫(kù)作為工作空間,而是使用當(dāng)前代碼所在的文件夾作為工作空間。
矢量數(shù)據(jù)的保存格式為 shp。
主要功能沒(méi)有發(fā)生變化,依然是:將一個(gè)線矢量文件轉(zhuǎn)換成面矢量文件,然后給這個(gè)面矢量文件添加四個(gè)不同的字段。

# -*- coding:utf-8 -*-

# ---------------------------------------------------------------------------

# Created on: 2021/1/17 14:53

import arcpy

import os

def main(line_shp): #<<注釋1>>

"""

程序運(yùn)行主函數(shù)

:param line_shp: 線矢量文件

:return: None

"""

arcpy.env.workspace = os.getcwd() #<<注釋2>>

arcpy.env.overwriteOutput = True

# 線要素轉(zhuǎn)面,生成的面矢量名稱為 polygon

arcpy.FeatureToPolygon_management(line_shp, "polygon.shp")

print "Create polygon"

# 給 polygon 圖層添加字段

for name in ["CJQYMC", "CJQYDM", "XJQYMC", "XJQYDM"]:

arcpy.AddField_management("polygon.shp", name,

"TEXT", field_length=100)

print "Add field complete"

print "Done"

<<注釋1>>:將原來(lái)的“散裝”代碼封裝成函數(shù)。沒(méi)有改變功能。
 
<<注釋2>>:用于設(shè)置工作空間。將源代碼文件所在的文件夾作為默認(rèn)工作空間。
 

連接

在修改完前后端代碼后,現(xiàn)在正式將兩部分連接起來(lái)。

# -*- coding:utf-8 -*-

import Tkinter as tk

import tkFileDialog

import giscode #<<注釋1>>

class MyGUI(object):

def __init__(self):

self.root = tk.Tk()

self.root.geometry("450x600+800+200") #設(shè)置窗口大小、位置

self.root.title("GIS") #設(shè)置程序名稱

self.var = tk.StringVar()

# run function

self.create_widget()

self.create_run_button()

self.root.mainloop() # 執(zhí)行循環(huán)

def create_widget(self):

self.frame1 = tk.Frame(self.root, relief="raised", bd=3)

self.frame1.pack(fill="x")

self.entry = tk.Entry(self.frame1)

self.entry.config(textvariable=self.var)

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.config(command=self.open_dialog)

self.but.pack(side="right", pady=8)

def open_dialog(self):

varrr = tkFileDialog.askopenfilename()

self.var.set(varrr)

def create_run_button(self):

# 生成下方的“運(yùn)行”按鈕

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"運(yùn)行",relief="groove", width=10)

self.ok_button.pack(side="right", pady=8)

self.ok_button.config(command=self.run) #<<注釋2>>

def run(self):#<<注釋3>>

giscode.main(self.var.get())

if __name__ == '__main__':

MyGUI()

<<注釋1>>:導(dǎo)入后端代碼。前端和后端代碼是分離的。創(chuàng)建 GUI 的前端代碼文件是 makeGUI.py;后端代碼文件是 giscode.py。

 
<<注釋2>>&<<注釋3>>:新創(chuàng)建一個(gè)方法,該方法用于啟動(dòng)后端功能代碼。
 

運(yùn)行視頻



結(jié)束語(yǔ)

第四章的源代碼和演示用矢量文件下載地址:
鏈接:https://pan.baidu.com/s/1UIkgPGe7AjHkqm7vsz9p7w
提取碼:skjr  

分享GIS,不止于Python。
薈GIS精粹,關(guān)注我,帶你飛!
我叫 GIS薈

歡迎交流

    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多