使用PythonTkinter开发GPGGA的坐标转换工具

  • 需求
  • 软件环境
    • 安装环境
      • Python2安装
      • sandglass安装
      • py2exe安装
  • 实际功能
  • 全部源码
  • 运行效果图
  • 要点总结
  • 改进建议

需求

最近负责Cors系统售后工作的同事提出了一个需求,他们在做算法精度比对工作时,需要一个很方便的转换GPGGA到经纬度的工具,他在市面上没找到,需要我们帮忙开发一款,我简单了解了一下GPGGA,其实很简单,麻烦的但是如果将程序放到Web程序下,web程序需要向外网服务,而考虑的系统的安全性,不应该内部系统暴露到外网。最终我决定用Python开发一款C/S架构的工具,而看重Python的原因是:简单,代码量少,支持直接发布为exe程序,不需要安装运行环境。

软件环境

  • Python 2.7.14(推荐没入坑的朋友还是要学习Python3,Python2要被放弃支持了,因为我之前学习、写工具用的都是Python2,相对比较熟悉,这里选用Python2进行开发)
  • py2exe Python的exe打包工具
  • sandglass 目前我用过最好用的时间包

安装环境

Python2安装

网上有大量的Python安装文档,这里不赘述了,提醒大家安装的时候一定要看一下系统环境是32位还是64位,再安装相应的程序

sandglass安装

安装好Python后,cmd运行命令pip install sandglass,自动安装就完成。

py2exe安装

下载路径:sourceforge下载路径
这里再次提醒一下,一定要下载对应版本的py2exe,要和你的操作系统环境和Python版本对应起来,不然后续打包会报错,
比如:我的python版本是python2.7,操作系统是64位,我需要下载
py2exe-0.6.9.win64-py2.7.amd64.exe

实际功能

最终完成程序开发支持几个功能:

  • 输入GGA转换为坐标
  • 支持度显示和度分秒显示
  • 支持文件批量导入,批量生成坐标,以文件形式导出

全部源码

全部源码如下:

#!/usr/local/bin/Python
# -*- coding: UTF-8 -*-
"""Displays the keysym for each KeyPress event as you type."""
import Tkinter as tk
import tkFileDialog
from sandglass import *window = tk.Tk()
window.title('获取坐标工具')
window.geometry('400x300')
ggaVar = tk.StringVar()
latLngVar = tk.StringVar()
typeVar = tk.IntVar()
fileVar = tk.StringVar()
pathVar = tk.StringVar()ggaText = tk.Entry(window,show=None,textvariable = ggaVar)
ggaText.pack(pady=20,padx = 20,fill="x")latLngText = tk.Entry(window,show=None,textvariable = latLngVar)
latLngText.pack(pady = 10,padx = 20,fill = "x")
latLngText['state'] = 'readonly'#度类型
DOC_TYPE = 0
#度分秒类型
DOC_MIN_SEC_TYPE = 1NO_FILE = "NO_FILE"def format_lat_lng():try:if pathVar.get() != NO_FILE:loadFile(pathVar.get(),typeVar.get(),"./"+ben().strftime("%Y%m%d%H%M%S")+".txt")returnif typeVar.get() == DOC_MIN_SEC_TYPE:latLngVar.set(getLLDocMinSec(ggaVar.get()))if typeVar.get() == DOC_TYPE:latLngVar.set(getLLDoc(ggaVar.get()))except Exception as e:latLngVar.set("GPGGA异常:"+str(e))def getLLDoc(gga):splitMsg = gga.strip().split(",")latStr = splitMsg[2]latFlag = splitMsg[3]lngStr = splitMsg[4]lngFlag = splitMsg[5]latInt = int(latStr[0:2])latMin = float(latStr[2:-1])/60lat = latInt + latMinlat = lat if latFlag == "N" else -latlngInt = int(lngStr[0:3])lngMin = float(lngStr[3:-1])/60lng = lngInt + lngMinlng = lng if lngFlag == "E" else -lngreturn str(lat)+","+str(lng)def getLLDocMinSec(gga):splitMsg = gga.strip().split(",")latStr = splitMsg[2]latFlag = splitMsg[3]lngStr = splitMsg[4]lngFlag = splitMsg[5]latDoc = latStr[0:2]latDoc = latDoc if latFlag == "N" else ("-"+latDoc)latMinList = latStr[2:-1].split(".")latMin = latMinList[0]latSec = float("0."+latMinList[1]) * 60lat = "%s°%s′%s″"%(latDoc,latMin,latSec)lngDoc = int(lngStr[0:3])lngDoc = lngDoc if lngFlag == "E" else ("-"+lngDoc)lngMinList = lngStr[3:-1].split(".")lngMin = lngMinList[0]lngSec = float("0." + lngMinList[1]) * 60lng = "%s°%s′%s″"%(lngDoc,lngMin,lngSec)return str(lat) + "," + str(lng)def loadFile(path,curtype,writeFilePath):with open(path, 'r') as file :with open(writeFilePath, 'w') as wfile:while 1:wlines = []lines = file.readlines(10000)if not lines:breakfor line in lines:result = "\n"if curtype == DOC_TYPE:try:result = getLLDoc(line) + "\n"except Exception as e:print eif curtype == DOC_MIN_SEC_TYPE:try:result = getLLDocMinSec(line) + "\n"except Exception as e:print ewlines.append(result)wfile.writelines(wlines)def chageType():print(typeVar.get())docButton = tk.Radiobutton(window, text="度", value=DOC_TYPE, command=chageType, variable=typeVar)
docMinSecButton = tk.Radiobutton(window, text="度分秒", value=DOC_MIN_SEC_TYPE, command=chageType, variable=typeVar)
docButton.pack()
docMinSecButton.pack()
typeVar.set(DOC_TYPE)fileVar.set(u"您没有选择任何文件")
pathVar.set(NO_FILE)
lb = tk.Label(window,textvariable = fileVar)lb.pack(padx = 10,pady = 10)def uploadFile():filename = tkFileDialog.askopenfilename()if filename != "":#lb.config(text = u"您选择的文件是:" + filename)fileVar.set(u"您选择的文件是:" + filename)pathVar.set(filename)def clearUploadFile():fileVar.set(u"您没有选择任何文件")pathVar.set(NO_FILE)b2 = tk.Button(window,text = "上传文件",width=15,height = 2,command = uploadFile)b2.pack(side='left',padx = 10)
b1 = tk.Button(window,text='获取坐标',width=15,height=2,command=format_lat_lng)
b1.pack(side='right',padx = 10)b3 = tk.Button(window,text = "清除文件",width=15,height = 2,command = clearUploadFile)
b3.pack(side="left",padx = 10)window.mainloop()

运行效果图

要点总结

下面开始要点总结:

  1. Tkinter使用了类似数据绑定的功能进行更新,如:
ggaVar = tk.StringVar()
ggaText = tk.Entry(window,show=None,textvariable = ggaVar)

上面文本框的内容通过ggaVar这个变量进行关联,监控ggaVar可以方便的了解到文本框的内容变更,同时也可以通过ggaVar.set()函数对文本框内的内容进行修改。
2. Tkinter的组件如果显示,必须要条用pack函数,同时pack函数可以对布局产生影响
3. 注意Tkinter包的引入,网上很多程序Tkinter包引入时是tkinter小写,python2.7在使用时Tkinter包已经改成首字母大写
4. 文件路径获取组件使用tkFileDialog不在Tkinter包内,需要单独引用
5. StringVar中set为None,再获取时获取的字符串“None”,而不是None对象

改进建议

整体来说,代码写的非常的丑

使用Python Tkinter开发GPGGA的坐标转换工具相关推荐

  1. 使用python+Tkinter库构建GUI应用工具 - 个性签名工具

    使用python+Tkinter库构建GUI应用工具 - 个性签名工具 安装Tkinter及pillow库 pip install tkinter # 安装tkinter库 pip install p ...

  2. Python+Pyqt5开发日志关键字检索工具

    项目测试中可能会涉及到日志安全测试,会检索组件打印的系统日志中是否包含敏感信息,如身份证号码.电话号码,明文密码等信息.正常组件较少,且日志量较少时,可通过将日志下载到本地,再通过Ctrl+F的方式进 ...

  3. 分步教学-使用Python+tkinter开发小学生语文拼音与词组学习机

    推荐教材:<Python程序设计基础与应用>(ISBN:9787111606178),董付国,机械工业出版社 图书详情: 配套资源: 用书教师可以联系董老师获取教学大纲.课件.源码.教案. ...

  4. Python tkinter 如何实现网站下载工具?将所有数据一键获取

    前言 铁汁们有没有想过,如何把几个代码的功能结合到一起呢? 有想过的话,有没有实现过呢? 其实很简单的啊,咱就写一个界面就好了,想要哪个代码运行,鼠标轻轻一点就行 开发环境 python 3.8: 解 ...

  5. python自动点名程序_利用python+tkinter开发一个点名软件

    from win32com.client importDispatchfrom tkinter import * importtkinter as tkfrom PIL importImagefrom ...

  6. python测试开发教程_python3测试工具开发快速入门教程

    现有的优秀python教程大多来自国外,但是翻译过来文章,有些丧失了原意.且现有的python3教程,很少有结合项目能快速上手.为此我们退出为零基础的初学者提供python入门教程(资深python使 ...

  7. 【实例】用 Python tkinter 开发 桌面便签

    1. 前言 最近要做的事情很多,琢磨着用 Python 写一个桌面便签的程序. 效果: 文件框架: Note |-- notes.txt # 存储便签的文件夹 |-- Note.py 2. 代码 话不 ...

  8. python tkinter图形界面代码统计工具--更新

    代码统计工具 修改了导出excel功能,把原来的主文件进行了拆分 code_count_windows.py #encoding=utf-8 import os,sys,time from colle ...

  9. python tkinter_Python+tkinter开发一个电子宠物(2 按钮)

    前:Python+tkinter开发一个电子宠物(1 开始)​zhuanlan.zhihu.com 画完了素材就开始写代码吧! 窗口 import 效果: 很好,窗口出来了 显示宠物 import 效 ...

  10. python图形统计代码_python tkinter图形界面代码统计工具

    本文为大家分享了python tkinter图形界面代码统计工具,供大家参考,具体内容如下 #encoding=utf-8 import os,sys,time from collections im ...

最新文章

  1. 走进单元测试:测试需要从哪些方面着手
  2. 正则表达式中匹配的特殊字符
  3. java finally在return_Java finally语句到底是在return之前还是之后执行?
  4. AI深入应用,生态越加开放,开发者的机会在哪里?
  5. C语言 __cplusplus - C语言零基础入门教程
  6. 本地上传文件到FastDFS命令上传报错:ERROR - file: connection_pool.c, line: 142, connect to server 192.168.0.197:221
  7. C语言如何去掉非数字字符串,Objective-C中利用正则去除非数字字母汉字方法实例...
  8. github上一些酷炫效果
  9. python 统计excel表格_Python实现对excel文件列表值进行统计的方法
  10. 分享5款好用到爆的软件,很多懂电脑的人都在用
  11. Python Tkinter教程(一)——tkinter编程基本步骤、窗口基本属性及Toplevel控件的使用
  12. Win10下Photoshop cc 2019安装
  13. FasterR-CNN,R-FCN,SSD,FPN,RetinaNet,YOLOv3速度和准确性比较
  14. 安规电容(X电容,Y电容)的简单对比介绍
  15. 国际标准组织 ISO 3166 的国家或地区代码
  16. BeautifulSoup说明
  17. 贝叶斯视角下的机器学习
  18. [分享] 揭开美国顶尖生物医学实验室成功的法宝--转
  19. 苹果会下架所有的基于H5的开发的APP?
  20. ORB-SLAM2 特征点法SLAM 单目 双目 rgbd相机SLAM 单应/本质矩阵恢复运动 小图大图地图优化

热门文章

  1. 基于数字证书的UKEY安全登录
  2. Google账户解封秘籍:这样申诉,分分钟解封Google 账户!
  3. 电子邮件归档市场现状分析
  4. 华为数通NA-NP学习笔记(个人精简)
  5. 错误解决:java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException: Failed to star
  6. 增值税发票税控开票软件数据接口规范
  7. 文章整理 - 匠人精神
  8. 电感升压(boost电路)感性理解
  9. windows创建服务删除服务
  10. 联想g500网卡linux驱动,联想g500无线网卡驱动下载-lenovog500无线网卡驱动v10.0.0.225 官方版 - 极光下载站...