之前有一篇文章里边讲了使用PyQt5生成地图文件(格式为html,可以使用浏览器直接查看),后来结合PyQt5库制作了一个图形化界面,通过这个图形化界面可以直接展示生成的html文件,而不需要在另外用浏览器打开。
我使用的软件版本是:Python3.7.2,PyQt5版本5.13.1
首先注意的是我们需要使用到from PyQt5.QtWebEngineWidgets,这个包不在PyQt5默认的安装里边,需要另外安装,安装指令后边的版本号要跟自己的PyQt5版本对应(否则会安装最新版的PyQtWebEngine,顺便还会安装PyQt5的最新版,你的电脑就有两个PyQt5版本了,再导入就会出现莫名其妙报错的情况):
pip install PyQtWebEngine==5.13.1
程序首先使用PyQt5库区生成一个界面,使用QSplitter区分割窗口,将窗口分割为两部分,左边有下拉选项框和文本输入框,可以通过选择下拉选项或者直接填写名字显示地图即可。
程序的整体思路还是首先生成html文件之后再由PyQt5.QtWebEngineWidgets中提供的方法打开。
因为程序开始时会默认打开map.html文件,又没有这个文件,所以第一次运行程序时地图展示框出现的是无文件读取,点一下左侧的显示按钮即可。
import sys
from PyQt5.QtWidgets import QMainWindow, QApplication, QFrame, QSplitter, QGridLayout, QLabel, QPushButton, QComboBox, QLineEdit
from PyQt5.QtCore import Qt, QUrl, QFileInfo
from PyQt5.QtWebEngineWidgets import QWebEngineView
from pyecharts import options as opts
from pyecharts.charts import Map
from pyecharts.faker import Faker
class Main_Window(QMainWindow):
def __init__(self):
self.desktop = QApplication.desktop()
self.screenRect = self.desktop.screenGeometry()
self.height = self.screenRect.height()
self.width = self.screenRect.width()
self.ditu1 = 'world'
self.ditu2 = ''
self.knowledge = {'world': '全世界共有七大洲和四大洋',
'china': '中国共有56个民族,陆地面积960万平方千米,\n水域面积约470多万平方千米',
'北京': '北京是中国的首都',
'美国': ''
}
super().__init__()
self.initUI()
def initUI(self):
#将整个窗口分割成3个模块
choice_frame = QFrame(self) #声明一个矩形框,放置设置用的按钮
choice_frame.setFrameShape(QFrame.StyledPanel) #在矩形框周围画上黑线
knowledge_frame = QFrame(self) #声明一个矩形框,写知识点
knowledge_frame.setFrameShape(QFrame.StyledPanel)
show_frame = QFrame(self) #声明一个矩形框,展示地图
show_frame.setFrameShape(QFrame.StyledPanel)
#对三个矩形框进行位置的排列,左边上下各两个框,右边一个用来展示动画
splitter1 = QSplitter(Qt.Vertical) #纵向分割,每添加一个,会依次向下添加
splitter1.addWidget(choice_frame) #将选项矩形框添加到这个布局中
splitter1.addWidget(knowledge_frame) #将知识点矩形框添加到这个布局中
splitter2 = QSplitter(Qt.Horizontal) #横向分割
splitter2.addWidget(splitter1) #将第一个纵向分割添加到横向中
splitter2.addWidget(show_frame) #将展示矩形框添加到横向中
self.setCentralWidget(splitter2) #将横向分割放置在窗口
#栅格布局放置按钮
choice_grid = QGridLayout()
choice_grid.setSpacing(10)
#选择方式1
choice1_label = QLabel('地图显示选择')
choice1 = QComboBox(self)
choice1.addItem('world')
choice1.addItem('china')
choice1.addItem('美国')
choice1.addItem('日本')
choice1.addItem('加拿大')
choice1.addItem('北京')
choice1.addItem('上海')
choice1.addItem('天津')
choice1.addItem('重庆')
choice1.addItem('河北')
choice1.addItem('山西')
choice1.addItem('辽宁')
choice1.addItem('吉林')
choice1.addItem('黑龙江')
choice1.addItem('江苏')
choice1.addItem('浙江')
choice1.addItem('安徽')
choice1.addItem('福建')
choice1.addItem('江西')
choice1.addItem('山东')
choice1.addItem('河南')
choice1.addItem('湖北')
choice1.addItem('湖南')
choice1.addItem('广东')
choice1.addItem('海南')
choice1.addItem('四川')
choice1.addItem('贵州')
choice1.addItem('云南')
choice1.addItem('陕西')
choice1.addItem('甘肃')
choice1.addItem('青海')
choice1.addItem('台湾')
choice1.addItem('新疆')
choice1.addItem('西藏')
choice1.addItem('宁夏')
choice1.addItem('内蒙古')
choice1.addItem('广西')
choice1.activated[str].connect(self.ditu1_Changed)
button1 = QPushButton('显示', self)
button1.clicked.connect(self.button1_action)
choice_grid.addWidget(choice1_label, 0, 0)
choice_grid.addWidget(choice1, 0, 1)
choice_grid.addWidget(button1, 0, 2)
#选择方式2
choice2_label = QLabel('地图输入')
choice2 = QLineEdit(self)
choice2.textChanged[str].connect(self.ditu2_Changed)
button2 = QPushButton('显示', self)
button2.clicked.connect(self.button2_action)
choice_grid.addWidget(choice2_label, 1, 0)
choice_grid.addWidget(choice2, 1, 1)
choice_grid.addWidget(button2, 1, 2)
choice_frame.setLayout(choice_grid)
#知识点框架的设置
knowledge_grid = QGridLayout()
self.knowledge_label = QLabel('')
knowledge_grid.addWidget(self.knowledge_label)
knowledge_frame.setLayout(knowledge_grid)
#地图放置框架的设置
self.map_grid = QGridLayout()
self.browser = QWebEngineView()
self.map_grid.addWidget(self.browser)
self.browser.load(QUrl(QFileInfo("./map.html").absoluteFilePath()))
show_frame.setLayout(self.map_grid)
self.setGeometry(self.width/4, self.height/4, self.width/2, self.height/2)
self.setWindowTitle('地理地图')
def ditu1_Changed(self, text):
self.ditu1 = text
def ditu2_Changed(self, text):
self.ditu2 = text
def button1_action(self):
print(self.ditu1)
self.get_ditu(self.ditu1)
def button2_action(self):
self.get_ditu(self.ditu2)
def get_ditu(self, text):
map = (Map().add(text, [list(z) for z in zip(Faker.provinces, Faker.values())], text)
.set_global_opts(title_opts=opts.TitleOpts(title="map")))
map.render('map.html')
self.browser.load(QUrl(QFileInfo("./map.html").absoluteFilePath()))
if text in self.knowledge:
self.knowledge_label.setText(self.knowledge[text])
else:
self.knowledge_label.setText('')
if __name__ == '__main__':
app = QApplication(sys.argv)
window = Main_Window()
window.show()
sys.exit(app.exec_())
动图大小有限制,所以南京地图就出现了一下子,仔细看能看到