当前位置: 首页 > news >正文

使用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()

项目概述

我们的目标是创建一个应用程序,它具有以下功能:

  1. 从JSON文件加载中国的省份和城市数据
  2. 提供两个下拉框,分别用于选择省份和城市
  3. 当选择一个省份时,自动更新城市下拉框的选项
  4. 点击确定按钮后,在嵌入的网页浏览器中显示所选城市的高德地图

技术栈

  • 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()

运行项目

要运行这个项目,您需要:

  1. 安装必要的Python库:

    pip install wxPython
    pip install wxPython-webview
    
  2. 准备 ‘area-city.json’ 文件,确保它与Python脚本在同一目录下。

  3. 运行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

总结

通过这个项目,我们学习了:

  1. 如何使用wxPython创建基本的图形用户界面
  2. 如何处理JSON数据
  3. 如何在wxPython应用中嵌入网页浏览器
  4. 如何实现简单的用户交互逻辑

这个项目为更复杂的地理信息应用程序奠定了基础。您可以进一步扩展它,例如添加更多的地理信息,实现地图标记功能,或者集成其他地图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.读取图像&#xff0c;显示图像&#xff0c;保存图像 #图像读取、显示与保存 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

题目&#xff1a; 题解&#xff1a; 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远程仓库分支与远程仓库分支数量不一致

说明&#xff1a;一次&#xff0c;在IDEA中想切换到某分支&#xff0c;但是查看Remote没有找到要切换的分支&#xff0c;但是打开GitLab&#xff0c;查看远程仓库&#xff0c;是有这个分支的。 解决&#xff1a;1&#xff09;在IDEA的Git中&#xff0c;点下面Fatch获取一下远程…...

opencv-python实战项目九:基于拉普拉斯金字塔的图像融合

文章目录 一&#xff0c;简介&#xff1a;二&#xff0c;拉普拉斯金字塔介绍&#xff1a;三&#xff0c;算法实现步骤3.1 构建融合拉普拉斯金字塔3.2 融合后的拉普拉斯金字塔复原&#xff1a; 四&#xff0c;整体代码实现&#xff1a;五&#xff0c;效果&#xff1a; 一&#x…...

浅谈JDK

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

爬虫案例3——爬取彩票双色球数据

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

C++ | Leetcode C++题解之第337题打家劫舍III

题目&#xff1a; 题解&#xff1a; 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知识导图&#xff0c;包含如下内容&#xff1a; 结构化设计&#xff0c;包含结构化设计的概念、结构化设计的主要内容、概要设计、详细设计及模块设计原则&#xff1b;UML是什么&#xff1a;介绍UML是什么&#xff1b;UML的结构&#xff1a;构造块、公共机制…...

在使用transformers和pytorch时出现的版本冲突的问题

在使用transformers和torch库的时候&#xff0c;出现了以下问题&#xff1a; 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&#xff1a; 插件安装 主要是依靠 address-parse 这个插件&#xff1a; 官网 收货地址自动识别 支持pc、h5、微信小程序 - DCloud 插件市场 // 首先需要引入插件 npm install address-parse --save 2&#xff1a;html部分 <view class""><view class&quo…...

C语言 | Leetcode C语言题解之第335题路径交叉

题目&#xff1a; 题解&#xff1a; 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学习第十三篇 - 泛型

在编译期间不确定变量的类型&#xff0c;在调用时&#xff0c;由开发者指定具体的类型。 1. 如何给arg参数和函数指定类型&#xff1f; function identity(arg){return arg; }identity(1) identity(jack) identity(true) identity([]) identity(null)定义的时候&#xff0c;无…...

工业智能网关在汽车制造企业的应用价值及功能-天拓四方

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

LLM - 在服务器中使用 Ollama + OpenWebUI 部署最新大模型

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

重启人生计划-积蓄星火

&#x1f973;&#x1f973;&#x1f973; 茫茫人海千千万万&#xff0c;感谢这一刻你看到了我的文章&#xff0c;感谢观赏&#xff0c;大家好呀&#xff0c;我是最爱吃鱼罐头&#xff0c;大家可以叫鱼罐头呦~&#x1f973;&#x1f973;&#x1f973; 如果你觉得这个【重启人生…...

2024.08.11 校招 实习 内推 面经

地/球&#x1f30d; &#xff1a; neituijunsir 交* 流*裙 &#xff0c;内推/实习/校招汇总表格 1、自动驾驶一周资讯 - 比亚迪将采购华为智驾系统&#xff0c;用于方程豹新款越野车&#xff1b;英特尔发布第一代车载独立显卡&#xff1b;黑芝麻智能上市首日破发大跌 自动…...

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...

云计算——弹性云计算器(ECS)

弹性云服务器&#xff1a;ECS 概述 云计算重构了ICT系统&#xff0c;云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台&#xff0c;包含如下主要概念。 ECS&#xff08;Elastic Cloud Server&#xff09;&#xff1a;即弹性云服务器&#xff0c;是云计算…...

day52 ResNet18 CBAM

在深度学习的旅程中&#xff0c;我们不断探索如何提升模型的性能。今天&#xff0c;我将分享我在 ResNet18 模型中插入 CBAM&#xff08;Convolutional Block Attention Module&#xff09;模块&#xff0c;并采用分阶段微调策略的实践过程。通过这个过程&#xff0c;我不仅提升…...

ssc377d修改flash分区大小

1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...

oracle与MySQL数据库之间数据同步的技术要点

Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异&#xff0c;它们的数据同步要求既要保持数据的准确性和一致性&#xff0c;又要处理好性能问题。以下是一些主要的技术要点&#xff1a; 数据结构差异 数据类型差异&#xff…...

镜像里切换为普通用户

如果你登录远程虚拟机默认就是 root 用户&#xff0c;但你不希望用 root 权限运行 ns-3&#xff08;这是对的&#xff0c;ns3 工具会拒绝 root&#xff09;&#xff0c;你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案&#xff1a;创建非 roo…...

css的定位(position)详解:相对定位 绝对定位 固定定位

在 CSS 中&#xff0c;元素的定位通过 position 属性控制&#xff0c;共有 5 种定位模式&#xff1a;static&#xff08;静态定位&#xff09;、relative&#xff08;相对定位&#xff09;、absolute&#xff08;绝对定位&#xff09;、fixed&#xff08;固定定位&#xff09;和…...

WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)

一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解&#xff0c;适合用作学习或写简历项目背景说明。 &#x1f9e0; 一、概念简介&#xff1a;Solidity 合约开发 Solidity 是一种专门为 以太坊&#xff08;Ethereum&#xff09;平台编写智能合约的高级编…...

JVM暂停(Stop-The-World,STW)的原因分类及对应排查方案

JVM暂停(Stop-The-World,STW)的完整原因分类及对应排查方案,结合JVM运行机制和常见故障场景整理而成: 一、GC相关暂停​​ 1. ​​安全点(Safepoint)阻塞​​ ​​现象​​:JVM暂停但无GC日志,日志显示No GCs detected。​​原因​​:JVM等待所有线程进入安全点(如…...

Spring AI与Spring Modulith核心技术解析

Spring AI核心架构解析 Spring AI&#xff08;https://spring.io/projects/spring-ai&#xff09;作为Spring生态中的AI集成框架&#xff0c;其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似&#xff0c;但特别为多语…...