使用Python创建省份城市地图选择器
在这篇博客中,我们将探讨如何使用Python创建一个简单而实用的省份城市地图选择器。这个项目不仅能帮助我们学习Python的基础知识,还能让我们了解如何处理JSON数据和集成网页浏览器到桌面应用程序中。
C:\pythoncode\new\geographicgooglemap.py
全部代码
import wx
import wx.html2
import jsonclass MapSelector(wx.Frame):def __init__(self):super().__init__(parent=None, title='省份城市地图选择器')panel = wx.Panel(self)# 加载省份和城市数据with open('area-city.json', 'r', encoding='utf-8') as f:self.data = json.load(f)# 创建控件self.province_cb = wx.ComboBox(panel, choices=[p['name'] for p in self.data], style=wx.CB_READONLY)self.city_cb = wx.ComboBox(panel, style=wx.CB_READONLY)self.confirm_btn = wx.Button(panel, label='确定')self.browser = wx.html2.WebView.New(panel)# 绑定事件self.province_cb.Bind(wx.EVT_COMBOBOX, self.on_province_select)self.confirm_btn.Bind(wx.EVT_BUTTON, self.on_confirm)# 设置布局sizer = wx.BoxSizer(wx.VERTICAL)sizer.Add(self.province_cb, 0, wx.ALL | wx.EXPAND, 5)sizer.Add(self.city_cb, 0, wx.ALL | wx.EXPAND, 5)sizer.Add(self.confirm_btn, 0, wx.ALL | wx.EXPAND, 5)sizer.Add(self.browser, 1, wx.ALL | wx.EXPAND, 5)panel.SetSizer(sizer)self.SetSize(800, 600)def on_province_select(self, event):province = self.province_cb.GetStringSelection()for p in self.data:if p['name'] == province:cities = p['districts']self.city_cb.Clear()self.city_cb.AppendItems([city['name'] for city in cities])breakdef on_confirm(self, event):province = self.province_cb.GetStringSelection()city = self.city_cb.GetStringSelection()if province and city:# 使用高德地图API显示城市地图# url = f"https://www.amap.com/search?query={city}"url = f"https://www.google.com/maps/place/{city}"self.browser.LoadURL(url)if __name__ == '__main__':app = wx.App()frame = MapSelector()frame.Show()app.MainLoop()
项目概述
我们的目标是创建一个应用程序,它具有以下功能:
- 从JSON文件加载中国的省份和城市数据
- 提供两个下拉框,分别用于选择省份和城市
- 当选择一个省份时,自动更新城市下拉框的选项
- 点击确定按钮后,在嵌入的网页浏览器中显示所选城市的高德地图
技术栈
- Python 3.x
- wxPython:用于创建图形用户界面
- wxPython的webview扩展:用于嵌入网页浏览器
- JSON:用于存储和处理省份和城市数据
实现步骤
1. 数据准备
首先,我们需要准备一个包含省份和城市信息的JSON文件。文件结构如下:
[{"name": "省份名称","districts": [{"name": "城市名称","center": "经度,纬度"},// 更多城市...]},// 更多省份...
]
2. 创建GUI
使用wxPython,我们创建了一个包含两个下拉框(ComboBox)、一个按钮和一个网页浏览器控件的窗口。
3. 加载数据
在程序初始化时,我们从JSON文件中加载省份和城市数据。
4. 实现交互逻辑
- 当选择一个省份时,更新城市下拉框的选项。
- 当点击确定按钮时,在网页浏览器中加载所选城市的高德地图。
核心代码
以下是实现这个项目的核心Python代码:
import wx
import wx.html2
import jsonclass MapSelector(wx.Frame):def __init__(self):super().__init__(parent=None, title='省份城市地图选择器')panel = wx.Panel(self)# 加载省份和城市数据with open('area-city.json', 'r', encoding='utf-8') as f:self.data = json.load(f)# 创建控件self.province_cb = wx.ComboBox(panel, choices=[p['name'] for p in self.data], style=wx.CB_READONLY)self.city_cb = wx.ComboBox(panel, style=wx.CB_READONLY)self.confirm_btn = wx.Button(panel, label='确定')self.browser = wx.html2.WebView.New(panel)# 绑定事件self.province_cb.Bind(wx.EVT_COMBOBOX, self.on_province_select)self.confirm_btn.Bind(wx.EVT_BUTTON, self.on_confirm)# 设置布局sizer = wx.BoxSizer(wx.VERTICAL)sizer.Add(self.province_cb, 0, wx.ALL | wx.EXPAND, 5)sizer.Add(self.city_cb, 0, wx.ALL | wx.EXPAND, 5)sizer.Add(self.confirm_btn, 0, wx.ALL | wx.EXPAND, 5)sizer.Add(self.browser, 1, wx.ALL | wx.EXPAND, 5)panel.SetSizer(sizer)self.SetSize(800, 600)def on_province_select(self, event):province = self.province_cb.GetStringSelection()for p in self.data:if p['name'] == province:cities = p['districts']self.city_cb.Clear()self.city_cb.AppendItems([city['name'] for city in cities])breakdef on_confirm(self, event):province = self.province_cb.GetStringSelection()city = self.city_cb.GetStringSelection()if province and city:url = f"https://www.amap.com/search?query={city}"self.browser.LoadURL(url)if __name__ == '__main__':app = wx.App()frame = MapSelector()frame.Show()app.MainLoop()
运行项目
要运行这个项目,您需要:
-
安装必要的Python库:
pip install wxPython pip install wxPython-webview
-
准备 ‘area-city.json’ 文件,确保它与Python脚本在同一目录下。
-
运行Python脚本。
效果如下
相关链接
https://github.com/nicez2/china-area-json/blob/master/area-city.json
https://github.com/nicez2/china-area-json/blob/master/area-province.json
总结
通过这个项目,我们学习了:
- 如何使用wxPython创建基本的图形用户界面
- 如何处理JSON数据
- 如何在wxPython应用中嵌入网页浏览器
- 如何实现简单的用户交互逻辑
这个项目为更复杂的地理信息应用程序奠定了基础。您可以进一步扩展它,例如添加更多的地理信息,实现地图标记功能,或者集成其他地图API。
相关文章:

使用Python创建省份城市地图选择器
在这篇博客中,我们将探讨如何使用Python创建一个简单而实用的省份城市地图选择器。这个项目不仅能帮助我们学习Python的基础知识,还能让我们了解如何处理JSON数据和集成网页浏览器到桌面应用程序中。 C:\pythoncode\new\geographicgooglemap.py 全部代码…...

【Java 数据结构】Stack和Queue介绍
Stack和Queue StackStack是什么Stack的使用构造方法常用方法 栈的模拟实现初始化和基本方法入栈出栈查看栈顶 栈的应用链栈的简单介绍 QueueQueue是什么Queue的使用队列的模拟实现初始化入队出队查看队头元素 循环队列循环队列的定义及其注意点循环队列的实现初始化和基本方法获…...

Docker基本语法
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、更新yum镜像仓库(一)查看本地yum镜像源地址(二)设置docker的镜像仓库(1)安装必要工具…...

uniapp 对于scroll-view滑动和页面滑动的联动处理
需求 遇到一个需求 解决方案 这个时候可以做一个内页面滑动判断 <!-- scroll-y 做true或者false的判断是否滑动 --> <view class"u-menu-wrap" style"background-color: #fff;"><scroll-view :scroll-y"data.isGo" scroll-wit…...

opencv基础的图像操作
1.读取图像,显示图像,保存图像 #图像读取、显示与保存 import numpy as np import cv2 imgcv2.imread(./src/1.jpg) #读取 cv2.imshow("img",img) #显示 cv2.imwrite("./src/2.jpg",img) #保存 cv2.waitKey(0) #让程序进入主循环(让…...

Java | Leetcode Java题解之第337题打家劫舍III
题目: 题解: class Solution {public int rob(TreeNode root) {int[] rootStatus dfs(root);return Math.max(rootStatus[0], rootStatus[1]);}public int[] dfs(TreeNode node) {if (node null) {return new int[]{0, 0};}int[] l dfs(node.left);i…...

本地查看的Git远程仓库分支与远程仓库分支数量不一致
说明:一次,在IDEA中想切换到某分支,但是查看Remote没有找到要切换的分支,但是打开GitLab,查看远程仓库,是有这个分支的。 解决:1)在IDEA的Git中,点下面Fatch获取一下远程…...

opencv-python实战项目九:基于拉普拉斯金字塔的图像融合
文章目录 一,简介:二,拉普拉斯金字塔介绍:三,算法实现步骤3.1 构建融合拉普拉斯金字塔3.2 融合后的拉普拉斯金字塔复原: 四,整体代码实现:五,效果: 一&#x…...

浅谈JDK
JDK(Java Development Kit) JDK是Java开发工具包,是Java编程语言的核心软件开发工具。 JDK包含了一系列用于开发、编译和运行Java应用程序的工具和资源。其中包括: 1.Java编译器(javac):用于将Java源代码编译成字节…...

爬虫案例3——爬取彩票双色球数据
简介:个人学习分享,如有错误,欢迎批评指正 任务:从500彩票网中爬取双色球数据 目标网页地址:https://datachart.500.com/ssq/ 一、思路和过程 目标网页具体内容如下: 我们的任务是将上图中…...

C++ | Leetcode C++题解之第337题打家劫舍III
题目: 题解: struct SubtreeStatus {int selected;int notSelected; };class Solution { public:SubtreeStatus dfs(TreeNode* node) {if (!node) {return {0, 0};}auto l dfs(node->left);auto r dfs(node->right);int selected node->val…...

软件架构设计师-UML知识导图
软件架构设计师-UML知识导图,包含如下内容: 结构化设计,包含结构化设计的概念、结构化设计的主要内容、概要设计、详细设计及模块设计原则;UML是什么:介绍UML是什么;UML的结构:构造块、公共机制…...
在使用transformers和pytorch时出现的版本冲突的问题
在使用transformers和torch库的时候,出现了以下问题: 1、OSError: [WinError 126] 找不到指定的模块。 Error loading "D:\Program Files\anaconda3\envs\testenv\Lib\site-packages\torch\lib\fbgemm.dll" or one of its dependencies. 2、…...

uniapp粘贴板地址识别
1: 插件安装 主要是依靠 address-parse 这个插件: 官网 收货地址自动识别 支持pc、h5、微信小程序 - DCloud 插件市场 // 首先需要引入插件 npm install address-parse --save 2:html部分 <view class""><view class&quo…...

C语言 | Leetcode C语言题解之第335题路径交叉
题目: 题解: bool isSelfCrossing(int* distance, int distanceSize){if (distance NULL || distanceSize < 4) {return false;}for (int i 3; i < distanceSize; i) {if ((distance[i] > distance[i - 2]) && (distance[i - 1] &l…...
TypeScript学习第十三篇 - 泛型
在编译期间不确定变量的类型,在调用时,由开发者指定具体的类型。 1. 如何给arg参数和函数指定类型? function identity(arg){return arg; }identity(1) identity(jack) identity(true) identity([]) identity(null)定义的时候,无…...

工业智能网关在汽车制造企业的应用价值及功能-天拓四方
随着工业互联网的飞速发展,工业智能网关作为连接物理世界与数字世界的桥梁,正逐渐成为制造业数字化转型的核心组件。本文将以一家汽车制造企业的实际使用案例为蓝本,深入解析工业智能网关在实际应用中的价值、功能及其实操性。 一、背景与挑…...

LLM - 在服务器中使用 Ollama + OpenWebUI 部署最新大模型
欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/140992533 免责声明:本文来源于个人知识与公开资料,仅用于学术交流,欢迎讨论,不支持转载。 Ollama 是一个开源的大型语言模型(LLM)服务工具,目的是简化本地运行…...

重启人生计划-积蓄星火
🥳🥳🥳 茫茫人海千千万万,感谢这一刻你看到了我的文章,感谢观赏,大家好呀,我是最爱吃鱼罐头,大家可以叫鱼罐头呦~🥳🥳🥳 如果你觉得这个【重启人生…...
2024.08.11 校招 实习 内推 面经
地/球🌍 : neituijunsir 交* 流*裙 ,内推/实习/校招汇总表格 1、自动驾驶一周资讯 - 比亚迪将采购华为智驾系统,用于方程豹新款越野车;英特尔发布第一代车载独立显卡;黑芝麻智能上市首日破发大跌 自动…...

网络六边形受到攻击
大家读完觉得有帮助记得关注和点赞!!! 抽象 现代智能交通系统 (ITS) 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 (…...

(十)学生端搭建
本次旨在将之前的已完成的部分功能进行拼装到学生端,同时完善学生端的构建。本次工作主要包括: 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...

AI Agent与Agentic AI:原理、应用、挑战与未来展望
文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例:使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例:使用OpenAI GPT-3进…...

SpringCloudGateway 自定义局部过滤器
场景: 将所有请求转化为同一路径请求(方便穿网配置)在请求头内标识原来路径,然后在将请求分发给不同服务 AllToOneGatewayFilterFactory import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; impor…...

select、poll、epoll 与 Reactor 模式
在高并发网络编程领域,高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表,以及基于它们实现的 Reactor 模式,为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。 一、I…...
鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南
1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发,使用DevEco Studio作为开发工具,采用Java语言实现,包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...

【笔记】WSL 中 Rust 安装与测试完整记录
#工作记录 WSL 中 Rust 安装与测试完整记录 1. 运行环境 系统:Ubuntu 24.04 LTS (WSL2)架构:x86_64 (GNU/Linux)Rust 版本:rustc 1.87.0 (2025-05-09)Cargo 版本:cargo 1.87.0 (2025-05-06) 2. 安装 Rust 2.1 使用 Rust 官方安…...

【C++特殊工具与技术】优化内存分配(一):C++中的内存分配
目录 一、C 内存的基本概念 1.1 内存的物理与逻辑结构 1.2 C 程序的内存区域划分 二、栈内存分配 2.1 栈内存的特点 2.2 栈内存分配示例 三、堆内存分配 3.1 new和delete操作符 4.2 内存泄漏与悬空指针问题 4.3 new和delete的重载 四、智能指针…...

在Mathematica中实现Newton-Raphson迭代的收敛时间算法(一般三次多项式)
考察一般的三次多项式,以r为参数: p[z_, r_] : z^3 (r - 1) z - r; roots[r_] : z /. Solve[p[z, r] 0, z]; 此多项式的根为: 尽管看起来这个多项式是特殊的,其实一般的三次多项式都是可以通过线性变换化为这个形式…...

在 Visual Studio Code 中使用驭码 CodeRider 提升开发效率:以冒泡排序为例
目录 前言1 插件安装与配置1.1 安装驭码 CodeRider1.2 初始配置建议 2 示例代码:冒泡排序3 驭码 CodeRider 功能详解3.1 功能概览3.2 代码解释功能3.3 自动注释生成3.4 逻辑修改功能3.5 单元测试自动生成3.6 代码优化建议 4 驭码的实际应用建议5 常见问题与解决建议…...