如何让无向图显示到用户界面里


def main():
            
        
       

# 问题 2:无向图的最短路问题(司守奎,数学建模算法与应用,P43,例4.3)
             G2 = nx.Graph()  # 创建:空的 有向图

             G2.add_edge('A', 'B', weight=1)  # 添加 带权边,weight表示边权
             G2.add_edge('A', 'D', weight=7)
             G2.add_edge('B', 'E', weight=4)
             G2.add_edge('D', 'E', weight=3)
             G2.add_edge('F', 'G', weight=4)
             G2.add_edge('F', 'E', weight=5)
             G2.add_edge('G', 'K', weight=9)

# 两个指定顶点之间的最短加权路径
             source=nameEntry3.get()
             target=nameEntry4.get()
             minWPath_v1_v5 = nx.dijkstra_path(G2, source, target)  # 顶点 0 到 顶点 3 的最短加权路径
             return minWPath_v1_v5
             # 两个指定顶点之间的最短加权路径的长度
             lMinWPath_v1_v5 = nx.dijkstra_path_length(G2, source, target)  # 最短加权路径长度
             return lMinWPath_v1_v5
             plt.clf()
             pos = nx.spring_layout(G2)  # 用 FR算法排列节点
             nx.draw(G2, pos, with_labels=True, alpha=0.5)
             labels = nx.get_edge_attributes(G2, 'weight')
             nx.draw_networkx_edge_labels(G2, pos, edge_labels=labels)
              # plt.show()


             edgeList = []
             for i in range(len(minWPath_v1_v5)-1):
                edgeList.append((minWPath_v1_v5[i], minWPath_v1_v5[i+1]))
             nx.draw_networkx_edges(G2, pos, edgelist=edgeList, edge_color='m', width=4) 
             # 设置边的颜色
             
             plt.savefig('path' +'.jpg')
             filename = ".\path.jpg"
             image = Image.open(filename)
             photo = ImageTk.PhotoImage(image)
             canvas.create_image(450,250,image = photo)
             canvas.update()
             time.sleep(sleep_time)
      
      frame_mid = Frame(width=800,height=100,bg='white') 
      frame_mid.grid(row=8,column=10,rowspan=6,columnspan=2,padx=4, pady=5)
      
      canvas = Canvas(frame_mid,width = 800,height = 600,bg = '#FFCCCC')#画板
      
      canvas.grid()



                

            
      def main2():
            
               
               EditText.insert(tkinter.END,main())
             
      EditText=tkinter.Text(window2,width=15,height=5)
      EditText.grid(row=8,column=8)
      def main3():
          main()
      
        
     
      q=tkinter.Button(window2,text="确定", font=('宋体',15),command=main2)
      q.grid(row=7,column=6)
      q=tkinter.Button(window2,text="确定", font=('宋体',15),command=main3)
      q.grid(row=7,column=8

为什么我用networkx和canvas画的图显示不到tkinter里
该如何让它显示呢

首先,您需要安装 NetworkX 和 matplotlib 库来绘制图像。然后,可以使用 NetworkX 库中的 draw 函数来绘制图。将图绘制到画布上,然后将画布放置在您的用户界面中的相应位置即可。


以下是一个例子,其中使用 Tkinter 库创建了一个简单的用户界面,并在其中绘制了一个无向图:

import tkinter as tk
import networkx as nx
import matplotlib.pyplot as plt

# 创建一个窗口
window = tk.Tk()

# 创建一个画布
canvas = tk.Canvas(window, width=600, height=600)
canvas.pack()

# 创建一个无向图
G = nx.Graph()
G.add_edge('A', 'B', weight=1)
G.add_edge('A', 'D', weight=7)
G.add_edge('B', 'E', weight=4)
G.add_edge('D', 'E', weight=3)
G.add_edge('F', 'G', weight=4)
G.add_edge('F', 'E', weight=5)
G.add_edge('G', 'K', weight=9)

# 绘制图像
pos = nx.spring_layout(G)  # 使用 FR 算法排列节点
nx.draw(G, pos, with_labels=True, alpha=0.5, on=canvas)
labels = nx.get_edge_attributes(G, 'weight')
nx.draw_networkx_edge_labels(G, pos, edge_labels=labels, on=canvas)

# 显示窗口
window.mainloop()

上述代码使用了 NetworkX 库中的 spring_layout 函数来排制节点的位置,然后使用 draw 函数绘制图像。还使用了 get_edge_attributes 函数和 draw_networkx_edge_labels 函数来绘制边的标签。