首页 > 编程语言 >使用Python创建省份城市地图选择器

使用Python创建省份城市地图选择器

时间:2024-08-16 12:28:05浏览次数:17  
标签:province city 城市地图 Python cb self __ 选择器 wx

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

全部代码

import wx
import wx.html2
import json

class 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])
                break

    def 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 json

class 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])
                break

    def 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。

标签:province,city,城市地图,Python,cb,self,__,选择器,wx
From: https://blog.csdn.net/winniezhang/article/details/141206051

相关文章

  • 【Python-办公自动化】1秒提取PPT文本内容形成目录保存至WORD
    欢迎来到"花花ShowPython",一名热爱编程和分享知识的技术博主。在这里,我将与您一同探索Python的奥秘,分享编程技巧、项目实践和学习心得。无论您是编程新手还是资深开发者,都能在这里找到有价值的信息和灵感。自我介绍:我热衷于将复杂的技术概念以简单易懂的方式呈现给大家,......
  • 【Python-办公自动化】几分钟生成上万份合同(用此思路可以用于写作固定格式的文章)
    欢迎来到"花花ShowPython",一名热爱编程和分享知识的技术博主。在这里,我将与您一同探索Python的奥秘,分享编程技巧、项目实践和学习心得。无论您是编程新手还是资深开发者,都能在这里找到有价值的信息和灵感。自我介绍:我热衷于将复杂的技术概念以简单易懂的方式呈现给大家,......
  • SSM-国外鞋服代购平台-97782(免费领源码+开发文档)可做计算机毕业设计JAVA、PHP、爬虫、
    SSM国外鞋服代购平台摘 要随着科学技术的飞速发展,社会的方方面面、各行各业都在努力与现代的先进技术接轨,通过科技手段来提高自身的优势,鞋服代购平台当然也不例外。代购平台是以实际运用为开发背景,运用软件工程原理和开发方法,采用Java技术构建的一个管理系统。整个开发过......
  • 使用magicAPI对接python 文件,上传参数获取不到回参问题
    1、在python文件中,创建post请求 @app.route('/post_endpoint',methods=['POST'])defhandle_post_request():#从请求中获取JSON数据data=request.form#打印接收到的数据(可选,用于调试)print(data)returnjsonify(data),200 这个方法,是得到form-data返回的参......
  • Python格式化字符串大全
    Python提供了多种方式来格式化字符串,以下是主要的几种方法,我会用一个新的例子来展示它们的用法。假设我们有三个变量name,age,和city,我们想要打印一句话:“Hello,mynameisAlice,Iam30yearsoldandIliveinNewYork.”%操作符这是较早的格式化方法,又称为格式化字符......
  • 小学生教你微积分,用编程理解高数(python,C,C++)
    一、代码实现微分(实际上是导数,微分不用除dx):python代码:x=0dx=0.00001deff(x):y=2*xreturnyprint((f(x+dx)-f(x))/dx)C语言代码:#include<stdio.h>doublex=1;doubledx=0.00001;doublef(doublearg){doubley=2*arg;returny;}......
  • Python - SOLID Principles
    •Singleresponsibilityprinciple(SRP)•Open-closedprinciple(OCP)Itemphasizesthatsoftwareentities, suchasclassesandmodules,shouldbeopenforextensionbutclosedformodification.Whatdoes thatmean?Itmeansthatonceasoftwareentityis......
  • python 利用高德得到地址对应的经伟度,由于地址原因在指定时间范围内得不到经伟度而终
    importrequests,sysimportjson,math,xlrd,xlwt,time#!/usr/bin/envpython#-*-coding:utf-8-*-frommathimportsin,asin,cos,radians,fabs,sqrtimportpandasaspdfromgeopy.distanceimportgeodesicfromopenpyxlimportload_workbookimportred......
  • 计算机毕业设计必看必学!! 93494基于springboot 书店信息管理系统,原创定制程序, java
    摘 要书店信息管理系统采用B/S结构、java开发语言、以及Mysql数据库等技术。系统主要分为管理员和用户两部分,管理员管理主要功能包括:首页、轮播图、公告栏、资源管理(图书资讯、资讯分类)交流管理(留言板、留言板分类)系统用户(管理员、顾客用户)模块管理(图书信息、分类管理、购......
  • 华为OD笔试机试 - 攀登者2 (python/c++/java 2024年C卷D卷真题算法)
    华为OD机试(C卷+D卷)2024真题目录(Java&c++&python)题目描述攀登者喜欢寻找各种地图,并且尝试攀登到最高的山峰。地图表示为一维数组,数组的索引代表水平位置,数组的元素代表相对海拔高度。其中数组元素0代表地面。例如:[0,1,2,4,3,1,0,0,1,2,3,1,2,1,0],代表如下图所示的......