#coding:utf-8
# 导入matplotlib模块并使用Qt5Agg
import os
from PIL import Image
import matplotlib
matplotlib.use('Qt5Agg')
# 使用 matplotlib中的FigureCanvas (在使用 Qt5 Backends中 FigureCanvas继承自QtWidgets.QWidget)
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from PyQt5 import QtCore, QtWidgets,QtGui
from PyQt5.QtCore import QCoreApplication
from PyQt5.QtWidgets import QApplication
import matplotlib.pyplot as plt
import sys
import numpy as np
num_point = 4
position={
0:[160,93],
1:[150,212],
2:[284,141],
3:[350,198]
}
class My_Main_window(QtWidgets.QDialog):#QtWidgets.QDialog,
def __init__(self,parent=None):
# 父类初始化方法
super(My_Main_window,self).__init__(parent)
# 几个QWidgets
self.figure = plt.figure()
self.canvas = FigureCanvas(self.figure)
self.button_plot = QtWidgets.QPushButton("绘制")
self.button_plot_1 = QtWidgets.QPushButton("最短路径")
self.button_plot_2 = QtWidgets.QPushButton("关闭窗口")
self.button_plot_3 = QtWidgets.QPushButton("路径规划")
# self.button_plot_3 = QtWidgets.QPushButton("绘制到的最短距离")
self.lineEdit = QtWidgets.QLineEdit()
self.lineEdit.setPlaceholderText('从该点到其他位置的最短距离')
# 变量
self.lam=np.zeros([num_point,num_point])
# self.line= int(self.lineEdit.text())
# print(self.line)
# 连接事件
self.button_plot.clicked.connect(self.plot_map)
self.button_plot_1.clicked.connect(self.kijskstra)
self.button_plot_2.clicked.connect(QCoreApplication.instance().quit)
#self.button_plot_3.clicked.connect()
self.lineEdit.returnPressed.connect(self.plot_line)
# 设置布局(先布局widget再加Layout)
layout = QtWidgets.QVBoxLayout()
layout.addWidget(self.button_plot_2)
layout.addWidget(self.canvas)
layout1 = QtWidgets.QHBoxLayout()
layout1.addWidget(self.button_plot)
layout1.addWidget(self.button_plot_1)
layout1.addWidget(self.button_plot_3)
layout1.addWidget(self.lineEdit)
layout_all = QtWidgets.QVBoxLayout()
layout_all.addLayout(layout)
layout_all.addLayout(layout1)
self.setLayout(layout_all)
# layout.addWidget(self.button_plot_3)
def plot_line(self):
show_point=int(self.lineEdit.text())
line_style = ['ro--','bo-','yo--','go--']
img = Image.open(os.path.join('test' + '.png'))
ax = self.figure.add_axes([0,0,1,1])
ax.cla()
# 画图
ax.imshow(img)
ax.axis('off') # 关掉坐标轴为 off
# print('dss')
for i in range(num_point):
offset = np.random.rand(1)*3
if i == show_point:
continue
mid_point = int(self.lam[show_point][i])
# print(mid_point)
start_point = i
end_point = show_point
while 1:
ax.plot([position[start_point][0]+offset*i,position[mid_point][0]+offset*i],
[position[start_point][1]+offset*i,position[mid_point][1]+offset*i],line_style[i])
if mid_point==end_point:
break
else:
start_point = mid_point
mid_point = self.lam[show_point][mid_point]
self.canvas.draw()
# 关闭窗口
def close_windows(self):
qApp = QApplication.instance()
qApp.quit()
# 连接的绘制的方法
def plot_map(self):
print('dss')
img = Image.open(os.path.join('test' + '.png'))
ax = self.figure.add_axes([0,0,1,1])
# 画图
ax.imshow(img)
ax.axis('off') # 关掉坐标轴为 off
self.canvas.draw()
# 最短路径
def kijskstra(self):
for startpoint in range(4):
A=np.array([[0,5,7,10],
[5,0,7,3],
[7,7,0,2],
[10,3,2,0]])
A[A==0]=999#float('inf')
l=len(A)
V=set(range(l))
s={startpoint}
p=np.zeros(l)
T=np.repeat(float('inf'),l)
k=startpoint
flag=1
while flag==1:
if s==V:
flag=0
else:
T_cop=V-s
loc=[i for i in range(l) if A[k][i] != float('inf')]
for i in loc:
if p[k]+A[k][i]<T[i]:
T[i]=p[k]+A[k][i]
self.lam[startpoint][i]=k
k=[i for i in T_cop if T[i]==min([T[i] for i in T_cop])][0]
p[k]=min([T[i] for i in T_cop])
s.add(k)
# print(startpoint)
self.lam[startpoint][startpoint]=startpoint
# print('lam=',self.lam[startpoint])
# print('p=',p)
# 运行程序
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
main_window = My_Main_window()
main_window.show()
app.exec()
# 把鼠标放到那,就显示那里的坐标
import numpy as np
import matplotlib.animation as animation
import matplotlib.pyplot as plt
import matplotlib
matplotlib.use('Qt5Agg')
from PIL import Image
def on_press(event):
print("my position:" ,event.button,event.xdata, event.ydata)
fig = plt.figure()
img = Image.open('test.png')
#updata = True
plt.imshow(img, animated= True)
fig.canvas.mpl_connect('button_press_event', on_press)
plt.show()