前言:在完成前后端的搭建后,通過(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ì)話框。更新文本框# -*- 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)顯示變量。
啟動(dòng)鍵現(xiàn)在需要對(duì)我們的“啟動(dòng)鍵”動(dòng)手了。現(xiàn)在已經(jīng)知道了 tk.Button 類中的 command 參數(shù)可以指定一個(gè)函數(shù)或者方法(包括類),點(diǎn)擊該按鈕時(shí)就會(huì)觸發(fā)。所以只需要將后端的主程序當(dāng)做 tk.Button 類的參數(shù)傳入就行。修改后端代碼在傳入之前修改了第三章的后端代碼,使其更簡(jiǎn)潔和簡(jiǎn)單。在原來(lái)的基礎(chǔ)上改動(dòng)了工作空間的配置:因?yàn)楹蠖说臄?shù)據(jù)處理等工作很簡(jiǎn)單所以就沒(méi)有使用 GDB 數(shù)據(jù)庫(kù)作為工作空間,而是使用當(dāng)前代碼所在的文件夾作為工作空間。主要功能沒(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
|