在这篇博客中,我们将探讨如何使用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()
项目概述
我们的目标是创建一个应用程序,它具有以下功能:
- 从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 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()
运行项目
要运行这个项目,您需要:
-
安装必要的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。