def main3():
canvas = tkinter.Canvas(window2, width=50, height=50)
canvas.grid(row=8,column=10)
# 创建一个无向图
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)
# 绘制图像
source=nameEntry3.get()
target=nameEntry4.get()
minWPath_v1_v5 = nx.dijkstra_path(G, source, target) # 顶点 0 到 顶点 3 的最短加权路径
# 两个指定顶点之间的最短加权路径的长度
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)
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(G, pos, edgelist=edgeList, edge_color='m', width=4,on=canvas)
怎么让我画的无向图显示在canvas画布上
你可以将画布作为绘图函数的第一个参数,如:
nx.draw(G, pos, with_labels=True, alpha=0.5, canvas=canvas)
或者,可以使用 FigureCanvasTkAgg 将画布绑定到 tkinter 窗口中,例如:
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
fig = plt.figure(figsize=(5, 5))
canvas = FigureCanvasTkAgg(fig, master=window2)
canvas.get_tk_widget().grid(row=8, column=10)
nx.draw(G, pos, with_labels=True, alpha=0.5, fig=fig)
在这种情况下,应该使用 fig 而不是 canvas 作为绘图函数的第一个参数。
请注意,如果使用 FigureCanvasTkAgg,则需要导入 matplotlib.pyplot 模块,并使用 plt.figure 创建一个新图表。