# -*- encoding: utf-8 -*- from head import * class Node: # 标记节点按钮 def node_mark_display(self): for w in frame_right.winfo_children(): w.destroy() # 清除右侧组件 curx = -1 y0 = 0.1 for i in d.Nodes: if i[2] == 1: curx = i[0] lab = tk.Label(frame_right, text="节点操作", bg=RED, fg=BLACK, font=('微软雅黑', 20)) lab.place(relx=0.18, rely=0.02, width=200, height=30) lab1 = tk.Label(frame_right, text=f"当前共有{len(d.Nodes)}个节点", bg=RED, fg=BLACK, font=('微软雅黑', 15)) lab1.place(relx=0.1, rely=0.0 + y0, width=200, height=30) lab1 = tk.Label(frame_right, text="当前节点:", bg=RED, fg=BLACK, font=('微软雅黑', 12)) if curx == -1: text = "未选择" else: text = f"{d.Nodes[curx][1]}" lab2 = tk.Label(frame_right, text=text, bg=BLUE, fg=BLACK, font=('微软雅黑', 12)) lab1.place(relx=0.1, rely=0.05 + y0, width=80, height=30) lab2.place(relx=0.4, rely=0.05 + y0, width=80, height=30) B = tk.Button(frame_right, text="设置标签", command=lambda: self.node_rename()) B.place(relx=0.7, rely=0.05 + y0, width=80, height=30) B = tk.Button(frame_right, text="删除当前节点", command=lambda: self.node_del_exact()) B.place(relx=0.1, rely=0.1 + y0, width=150, height=30) if d.Nodes[curx][4] == 1: text = '设为非必经节点' else: text = '设为必经节点' B = tk.Button(frame_right, text=text, command=lambda: self.dominator(curx)) B.place(relx=0.1, rely=0.15 + y0, width=150, height=30) B = tk.Button(frame_right, text="增加一个节点", command=lambda: self.node_add()) B.place(relx=0.1, rely=0.25 + y0, width=150, height=30) B = tk.Button(frame_right, text="减少一个节点", command=lambda: self.node_del()) B.place(relx=0.1, rely=0.3 + y0, width=150, height=30) def dominator(self, x): d.Nodes[x][4] ^= 1 G.draw() self.node_mark_display() def node_mark(self, name): if name >= len(d.Nodes): self.node_404(name) return for node in d.Nodes: if node[0] == name: node[2] = 1 else: node[2] = 0 G.draw() self.node_mark_display() def node_del_exact(self): if d.nodes_num <= 2:# 若删除节点以后节点过少,则直接返回并警告 tk.messagebox.askokcancel(title='错误', message='节点过少') return flag = 0 cur = -1 for node in d.Nodes:# 寻找当前选定的节点 if node[2] == 1: cur = node[0] flag = 1 if flag == 0: tk.messagebox.askokcancel(title='错误', message='未选择节点') return if d.source == 1:# 如果是均匀分布,则重新计算点的坐标 d.nodes_num -= 1#节点数目减一 d.ang = 360 / d.nodes_num#重新计算圆心角 nodes = d.Nodes.copy()#复制节点 d.Nodes.clear()#清除Data中的节点 num = 0 for n in nodes:#逐个复制节点 if n[0] == cur:#若是删除的节点,则不复制 continue n[0] = num#重新编号 rad = math.radians(num * d.ang)#计算当前角度 x = int(math.cos(rad) * d.R)#计算当前点x坐标(相对) y = int(math.sin(rad) * d.R)#计算当前点y坐标(相对) n[3] = (d.center[0] + x, d.center[1] + y)#计算绝对坐标 d.Nodes.append(n)#将当前点加入点集合中 num += 1 edges = d.Edges.copy()#将原有边集复制出来 d.Edges.clear()#删除Data中的边集 num = 0 for e in edges:#复制边 if e[1] == cur or e[2] == cur:#删除的边不复制 continue if e[1] > cur:#修改边对应的点的编号 e[1] -= 1 if e[2] > cur:#修改边对应的点的编号 e[2] -= 1 e[0] = num#重新编号 d.Edges.append(e)#将边加入边集中 num += 1 # 如果是按照经纬度分布,则重新计算比例尺 elif d.source == 2: name = [] for i in range(len(d.name)): if not i == cur: name.append(d.name[i]) d.name = name.copy() d.nodes_num -= 1 d.coordinate = d.coord_creat() # 纯节点坐标 d.Nodes = d.JI_nodes_creat() # 节点列表 d.Edges = d.JI_edges_creat() d.JI_edge_add(2) d.JI_edge_add(3) elif d.source == 3: name = [] for i in range(len(d.name)): if not i == cur: name.append(d.name[i]) d.name = name.copy() d.nodes_num -= 1 d.coordinate = d.coord_creat() # 纯节点坐标 d.Nodes = d.LIAO_nodes_creat() # 节点列表 d.Edges = d.LIAO_edges_creat() d.LIAO_edge_add(2) d.LIAO_edge_add(3) G.draw() self.node_mark_display() def node_rename(self): flag = 0 for node in d.Nodes: if node[2] == 1: cur = node flag = 1 if flag == 1: result = tkinter.simpledialog.askstring(title='修改节点标签', prompt='请输入修改后的标签:', initialvalue=cur[1]) else: tk.messagebox.askokcancel(title='错误', message='未选择节点') return for node in d.Nodes: # 检查新的名称是否已经存在 if node[1] == result: return "Error: name already exists" if result: cur[1] = result G.draw() self.node_mark_display() def node_clear(self): for node in d.Nodes: node[2] = False G.draw() def node_add(self): # 增加一个节点 nodes = len(d.Nodes) + 1 # 如果节点数目大于五,则将连接详细信息改为不显示 if nodes > 5: d.edgeinfo = 0 self.node_init(nodes) G.draw() self.node_mark_display() def node_set(self): node = tkinter.simpledialog.askinteger(title='修改节点数目', prompt='请输入修改后的节点数目:', initialvalue=str(len(d.Nodes))) if node: self.node_init(node) G.draw() def node_del(self): if d.nodes_num <= 2: tk.messagebox.askokcancel(title='错误', message='节点过少') return nodes = len(d.Nodes) - 1 if nodes < 6: d.edgeinfo = 1 self.node_init(nodes) G.draw() self.node_mark_display() def node_init(self, node): if not node: return if d.source == 1: d.data(node) elif d.source == 2: if node > 13: tk.messagebox.askokcancel(title='错误', message='节点过多') return d.HEI_data(node) else: if node > 13: tk.messagebox.askokcancel(title='错误', message='节点过多') return d.LIAO_data(node) if node > 5: d.edgeinfo = 0 else: d.edgeinfo = 1 def graph_del(self): global d del d def node_refresh(self): nodes = len(d.Nodes) self.node_init(nodes) G.draw() self.node_mark_display() def node_404(self, name): # 弹出对话框 tk.messagebox.askokcancel(title='错误', message='该节点不存在') # print(result) if __name__ == '__main__': G.draw() node = Node() node.node_mark_display() mainloop()