将networkx嵌入pyqt5

单纯使用networkx的话会蹦出来一个独立的窗口,那么,因为networkx是建立在matplotlib的基础上的,既然可以将matplotliblib嵌入pyqt,networkx的嵌入从理论上也是可以实现的。

将matplotlib嵌入pyqt参考了这篇博客:https://www.cnblogs.com/Arago/p/7765510.html

将networkx嵌入pyqt5_第1张图片

使用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。

  • ax (Matplotlib Axes object, optional) – Draw the graph in the specified Matplotlib axes.

然后运行:

将networkx嵌入pyqt5_第2张图片

可以看到networkx已经嵌入pyqt的窗口了。

PS:其中一些位置和大小的参数需要自己调整,不然可能会出现奇怪的画面。

你可能感兴趣的:(Python)