python2利用wxpython生成投影界面工具的图文详解

本投影界面工具的功能:

准备好.prj投影文件,将输入文件夹内的WGS84经纬度坐标shp文件,投影为平面文件,成果自动命名为prj_***并新建在输入文件夹同一路径下。

下一步目标:

利用pyinstaller或其他打包库生成exe文件,目前停滞在python2语法、arcpy打包出错相关问题上。

参考文献:

《Using Py2exe with Arcpy- It can be done easily!》

《如何使用py2exe打包arcpy脚本?》

GUI界面示意图

投影文件所在文件夹结构如下:

               

GUI代码

# -*- coding: utf-8 -*-
# =============================================================================
#                   输入文件——点选、复制、拖拽
#                   选择待投影的文件夹、投影文件所在文件夹
# =============================================================================
"""
Created on Thu Feb  4 16:12:00 2021
@author: zhutong
"""

import wx
from Def_Projection_common_E import createPrjFile,projection
#创建应用程序对象
app = wx.App()

#自定义窗口类MyFrame
class MyFrame(wx.Frame):

    def __init__(self):

        super(MyFrame,self).__init__(None,title="通用经纬度转平面坐标工具",pos=(600,500),size=(600,300))#Python2语法

        panel = wx.Panel(parent=self)#创建面板对象

        self.statictext_shp = wx.StaticText(parent=panel,label="待投影数据所在文件夹",pos=(60,30))#创建静态文本对象
        self.statictext_shp = wx.StaticText(parent=panel,label="投影文件所在文件夹",pos=(60,80))#创建静态文本对象

        self.shp_text = wx.TextCtrl(parent=panel,value="",pos=(60,50),size=(350,25))#【文本控件1】
        open_shp_button = wx.Button(parent=panel, label='打开',pos=(430,50))#【按钮控件1】

        self.prj_text = wx.TextCtrl(parent=panel,value="",pos=(60,100),size=(350,25))#【文本控件2】
        open_prj_button = wx.Button(parent=panel, label='打开',pos=(430,100))#【按钮控件2】

        projection_button = wx.Button(parent=panel, label='平面投影',pos=(150,150),size=(180,30))#【按钮控件3】

        self.Bind(wx.EVT_BUTTON, self.onButton_opendir, open_shp_button)#绑定事件1——打开文件夹

        self.Bind(wx.EVT_BUTTON, self.onButton_opendir, open_prj_button)#绑定事件2——打开文件夹

        self.Bind(wx.EVT_BUTTON, self.onButton_projection, projection_button)#绑定事件3——投影

        self.Bind(wx.EVT_TEXT, self.inputText, self.shp_text)#绑定事件4——直接在文本框输入路径

        self.Bind(wx.EVT_TEXT, self.inputText, self.prj_text)#绑定事件4——直接在文本框输入路径              

    def onButton_opendir(self,control):#在事件源(控件)上产生特定事件(左键单击)后的处理程序
        # Create open file dialog
        openDirDialog = wx.DirDialog(parent=self, message="选择一个文件夹", defaultPath="", style=wx.DD_DEFAULT_STYLE)

        openDirDialog.ShowModal()
        self.path = openDirDialog.GetPath()
        print(self.path)

        openDirDialog.Destroy()
        control.SetValue(self.path)#将路径显示在文本框1中

    def inputText(self,control):
        self.path = control.GetValue()

    def onButton_projection(self,event):
        inWorkspace = self.shp_text.GetValue()
        prjdir = self.prj_text.GetValue()
        prjWorkspace = createPrjFile(inWorkspace,add_str="prj_")#新建投影成果根目录prjWorkspace
        projection(inWorkspace,prjdir,prjWorkspace)

if __name__ == "__main__":
    # #创建窗口对象
    frm = MyFrame()
    # #显示窗口
    frm.Show()       

    #进入主事件循环
    app.MainLoop()

功能正确,但提示有冗余报错

平面投影代码

# coding=utf-8
# ---------------------------------------------------------------------------
#
#                 为文件夹内所有城市的经纬度shp生成对应的平面shp
#                   注意文件夹内所有路径须为英文路径,python2
#
# ---------------------------------------------------------------------------
#注意西安和香港
import arcpy
import os,re
import time
#os,arcpy文件覆盖写
arcpy.env.overwriteOutput = True  #启用覆盖地理处理操作的输出

inWorkspace = r'D:\PythonCode_E3DCM\01Data\04BackPoiProcess\02POI\POI_4'#待投影根目录【运行前确认修改!】
prjdir = r'D:\PythonCode_E3DCM\01Data\prjFile'#投影文件所在路径

##判断是否为shp文件
def isShapefile(file_name):
    if ".shp" in file_name and ".xml" not in file_name:
        flag = True
    else:
        flag = False
    return flag

##建立对应投影成果文件夹——绝对路径中【叶子节点】文件夹前加"add_str"
def createPrjFile(file_dir,add_str):
    dir_name,base_name = os.path.split(file_dir)#如果路径末有//,则输出路径和为空文件名
    #print dir_name
    #print base_name
    prj_file_dir = os.path.join(dir_name,add_str + base_name)
    if os.path.exists(prj_file_dir) == False:
        os.mkdir(prj_file_dir)
    print prj_file_dir + u" 文件夹新建成功!"
    return prj_file_dir

#返回一个文件在投影文件列表中匹配的投影文件
def prjMatch(shp_dir,prjdir):#shp_dir最好为绝对路径,1文件夹或2文件名匹配投影文件均可行
    #打印作为参数输入的shp路径
    print "\nshp_dir:\n" + shp_dir.lower()
    prjfile_ls = os.listdir(prjdir)
    #city_ls = [i.replace(suffix,"") for i in os.listdir(prjdir)]

    #检查城市名是否有包含的情况,如香港xinggang包含西安xian
    for prjfile in prjfile_ls:

        suffix = ".prj"
        city = prjfile.replace(suffix,"")

        if city.lower() in shp_dir.lower():
            print city          

            #排除特殊城市西安xian【有错误!】
            if ("xian" in shp_dir.lower()) and ("xianggang" not in shp_dir.lower()):
                print "xian branch prj"
                return os.path.join(prjdir,"xian.prj")

            elif "xianggang" in shp_dir.lower():
                print "xianggang branch prj"
                return os.path.join(prjdir,"xianggang.prj")

            else:#忽略shp_dir中城市名大小写
                prjfile_dir = os.path.join(prjdir,prjfile)
                print "Ordinary branch:\n" + prjfile_dir + "\n"
                return prjfile_dir

        #else:
            #print "prj match fail!"

#如果列表中的元素是字符串,判断任一元素不被包含在其他元素中

num_shp = 0
num_shp_ok = 0
num_shp_fail = 0
##针对文件夹内shp,建立对应所在投影文件夹、并投影
#参数:inWorkspace待投影成果根目录,ini_root(=inWorkspace)新建投影文件夹替换字符用
def projection(inWorkspace,prjdir,prjWorkspace):#递归函数的参数只能是变量参数

    global num_shp
    global num_shp_ok
    global num_shp_fail

    file_names = os.listdir(inWorkspace)

    for file_name in file_names:#文件或文件夹名,不是绝对路径
        file_dir = os.path.join(inWorkspace,file_name)#待投影文件的绝对路径

        if os.path.isdir(file_dir):#判断是否为文件夹

            #建立对应投影成果文件夹
            prjSubfolder= file_dir.replace(inWorkspace,prjWorkspace)
            if os.path.exists(prjSubfolder) == False:
                os.mkdir(prjSubfolder)

            #inWorkspace = file_dir#将当前文件夹当作根目录

            projection(file_dir,prjdir,prjSubfolder)#递归

        else:
            if isShapefile(file_name):
                print "file_name:"+file_name
                #投影成果shp的绝对路径
                prj_file_dir = file_dir.replace(inWorkspace,prjWorkspace)
                #print prj_file_dir

                #投影文件prj的绝对路径
                prjfile_dir = prjMatch(file_dir,prjdir)
                #print prjfile_dir
                #如果投影成果不存在(6个文件),再投影
                try:
                    arcpy.Project_management(file_dir, prj_file_dir, prjfile_dir)
                    #prj_file_dir投影成果shp文件的路径,prjfile_dir投影文件的路径
                    num_shp_ok += 1
                    print file_dir + u"投影成功!"
                except:
                    num_shp_fail += 1
                    print file_dir + u"投影失败!"

            else:
                pass
                #print "Srange ERROR in: "+file_dir

    print inWorkspace + u" 文件夹投影完成!"#注意不是局部变量inWorkspace
    print str(num_shp_ok) + u"shp文件投影成功!"
    print str(num_shp_ok) + u"shp文件投影失败!"

##    return paths
if __name__ == '__main__':
    time_start=time.time()
    prjWorkspace = createPrjFile(inWorkspace,add_str="prj_")#新建投影成果根目录prjWorkspace
    projection(inWorkspace,prjdir,prjWorkspace)
    time_end=time.time()
    print u'投影耗时:{:.2f}min'.format((time_end-time_start)/60)

附录:在python2中调试wxpython,界面一闪而过的解决办法:

到此这篇关于python2利用wxpython生成投影界面工具的图文详解的文章就介绍到这了,更多相关python投影界面工具内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • python 实现倒计时功能(gui界面)

    运行效果: 完整源码: ##import library from tkinter import * import time from playsound import playsound ## display window root = Tk() root.geometry('400x300') root.resizable(0,0) root.config(bg ='blanched almond') root.title('TechVidvan - Countdown Clock And

  • Python中pycharm编辑器界面风格修改方法

    教你配置属于自己的PYcharm界面色彩风格,PYthon学习必备 GO 第一步,换成深色背景,保护视力 PyCharm默认的背景是白色的,比较刺眼.还是换成深色的比较好,而且感觉比较酷一点. 修改方法:进入PyCharm,File ==>setting==> Appearance&Behavior ==> Appearance,右侧找到Theme一项,换成Darcula. 第二步,修改字体,换一个更好看的字体 修改方法:进入PyCharm,File ==> setting

  • 一个非常简单好用的Python图形界面库(PysimpleGUI)

    前一阵,我在为朋友编写一个源代码监控程序的时候,发现了一个 Python 领域非常简单好用的图形界面库. 说起图形界面库,你可能会想到 TkInter.PyQt.PyGUI 等流行的图形界面库,我也曾经尝试使用,一个很直观的感受就是,这太难用了.就去网上搜搜,看看有没有一些 demo,拿来改改,结果很少有,当时我就放弃了这些图形库的学习,转而使用了 vue+flask 的形式以浏览器网页作为程序界面,因为我会这个,即使实现起来稍微麻烦,但是也快. 那有朋友可能问了:一定要学习图形界面吗? 其实不

  • Python聊天室带界面实现的示例代码(tkinter,Mysql,Treading,socket)

    一.前言 我用的是面向对象写的,把界面功能模块封装成类,然后在客户端创建对象然后进行调用.好处就是方便我们维护代码以及把相应的信息封装起来,每一个实例都是各不相同的. 所有的界面按钮处理事件都在客户端,在创建界面对象是会把客户端的处理事件函数作为创建对象的参数,之后再按钮上绑定这个函数,当点击按钮时便会回调函数 二.登录界面实现 登录界面模块chat_login_panel.py from tkinter import * # 导入模块,用户创建GUI界面 # 登陆界面类 class Login

  • 用Python给图像算法做个简单应用界面

    以前在Windows上做界面用MFC,现在做算法都是基于Python,所以转用Python的Tkinter库来做.主要是能使用Opencv和Torch处理数据,然后在界面上显示. 效果如下: 主要包括3个板块,其余还有一些小功能: 1.显示固定的图片.或从电脑加载一张图片并显示(涉及到按钮的响应函数编写和弹窗) 2.下拉框和文本框的使用 3.进度条的使用(涉及到多线程) Tkinter支持控件自动调整布局,但是时间比较赶就不研究了,使用固定位置布局,界面也不给调整. 控件名称 Buttom 按钮

  • Python PyQt5-图形界面的美化操作

    前言 今天就来学习一下图形设计界面的美化,首先我们知道 QtDesigner设计出来的界面默认是不太怎么美观的.所以在以后的实际开发中很多界面都是要美化的.那么现在来看看具体怎么美化. 首先我们要知道在什么地方美化它. 1 软件背景的添加 最简单的方法就是直接在设计界面时,在style里直接用css美化. # 添加背景 QWidget { border-image:url(C:/Users/DELL/Pictures/Saved Pictures/1.jpg); } #下面的防止背景干扰其他控件

  • 用python制作个论文下载器(图形化界面)

    在科研学习的过程中,我们难免需要查询相关的文献资料,而想必很多小伙伴都知道SCI-HUB,此乃一大神器,它可以帮助我们搜索相关论文并下载其原文.可以说,SCI-HUB造福了众多科研人员,用起来也是"美滋滋". 在上一篇文章中介绍了分析过程以及相应的函数代码.根据小伙伴们的反映发现了一些问题,毕竟命令框的形式用起来难免没那么"丝滑".为了让大家更方便地使用,可以"纵享丝滑",kimol君决定写一个图形界面(GUI): PS.由于近期实属忙到晕厥,这

  • Python基础之tkinter图形化界面学习

    一.基础内容 import tkinter as tk from PIL import Image,ImageTk def my(): pwin.destroy() win.deiconify() win = tk.Tk() #win.geometry('320x240+100+50') #长320宽240 右100,下50 win['width']=320 #可以用win.keys()查看哪些可以这样写 win['height']=240 win.title('tkinter图形化专题学习')

  • python实现简单的井字棋游戏(gui界面)

    项目输出 项目先决条件 要使用python构建井字游戏,我们需要tkinter模块和python的基本概念 Tkinter模块是用于渲染图形的标准图形用户界面. Tkinter.messagebox用于显示消息框 要安装tkinter模块,我们在命令提示符下使用了pip install命令: pip install tkinter 项目文件结构 这些是使用python构建井字游戏的步骤: 导入模块 初始化窗口 检查结果的功能 检查获胜者的功能 定义标签和按钮 1.导入模块 from tkinte

  • python tkinter制作用户登录界面的简单实现

    本文只是几年前学习的tkinter的时候写的测试程序,十分之简陋,只是学习用,没什么其他用处. 学习一下莫烦Python的tkinter教程,根据教程制作了用户登录注册页.基本功能为检查登录.注册. 运行如下: ​​​​​​ 代码如下: # -*- coding: utf-8 -*- """ Created on Sun Aug 5 10:34:10 2018 @author: Administrator """ import tkinter a

  • python制作一个简单的gui 数据库查询界面

    一.准备工作: 1.安装mysql3.7,创建一个test数据库,创建student表,创建列:(列名看代码),创建几条数据 (以上工作直接用navicat for mysql工具完成) 二.代码: import sys import tkinter as tk import mysql.connector as sql #--------------------查询函数--------------------------- def sql_connect(): listbox_show.del

随机推荐