单纯使用networkx的话会蹦出来一个独立的窗口,那么,因为networkx是建立在matplotlib的基础上的,既然可以将matplotliblib嵌入pyqt,networkx的嵌入从理论上也是可以实现的。
将matplotlib嵌入pyqt参考了这篇博客:https://www.cnblogs.com/Arago/p/7765510.html
使用qt designer先创建一个widget,然后保存,将.ui转为.py格式。
修改自动生成的代码(改为自定义的PlotCanvas):
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(699, 544)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.widget = PlotCanvas(self.centralwidget)
self.widget.setGeometry(QtCore.QRect(0, 0, 500, 500))
self.widget.setObjectName("widget")
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 699, 26))
self.menubar.setObjectName("menubar")
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
自定义一个类:
class PlotCanvas(
FigureCanvas): # 通过继承FigureCanvas类,使得该类既是一个PyQt5的Qwidget,又是一个matplotlib的FigureCanvas,这是连接pyqt5与matplotlib的关键
def __init__(self, parent=None, width=500, height=500, dpi=100):
fig = Figure(figsize=(width, height),
dpi=dpi) # 创建一个Figure,注意:该Figure为matplotlib下的figure,不是matplotlib.pyplot下面的figure
self.axes = fig.add_subplot(111) # 调用figure下面的add_subplot方法,类似于matplotlib.pyplot下面的subplot方法
self.plot()
FigureCanvas.__init__(self, fig) # 初始化父类
self.setParent(parent)
FigureCanvas.setSizePolicy(self,
QSizePolicy.Expanding,
QSizePolicy.Expanding)
FigureCanvas.updateGeometry(self)
def plot(self):
G = nx.DiGraph()
G.add_node('555')
G.add_node('123456')
G.add_edge('555', '123456')
nx.draw(G, pos=nx.spring_layout(G), node_color='w',ax = self.axes,
edge_color='b', with_labels=True, alpha=1,
font_size=10, node_size=20, arrows=True)
其中的重点是nx.draw()函数的 ax 参数。这个参数用于指定在matplotlib的哪个axes进行绘图,在这里填入上面创建的self.axes。
然后运行:
可以看到networkx已经嵌入pyqt的窗口了。
PS:其中一些位置和大小的参数需要自己调整,不然可能会出现奇怪的画面。