[Python] 纯文本查看 复制代码 import sys
import networkx as nx
import matplotlib.pyplot as plt
from PyQt5.QtWidgets import *
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QFont
class GraphVisualizer(QMainWindow):
def __init__(self):
super().__init__()
self.init_ui()
def init_ui(self):
self.setWindowTitle('图论可视化学习-东台市实验中学 727 崔冷亦')
self.setGeometry(100, 100, 800, 600)
# 主布局
main_layout = QVBoxLayout()
# 输入区域
input_group = QGroupBox('输入图的数据')
input_layout = QVBoxLayout()
self.input_text = QTextEdit()
self.input_text.setPlaceholderText('请输入图的数据,每行表示一条边,例如:\nA B\nB C\nC A')
input_layout.addWidget(self.input_text)
self.adj_matrix_btn = QPushButton('生成邻接矩阵')
self.adj_matrix_btn.clicked.connect(self.generate_adj_matrix)
input_layout.addWidget(self.adj_matrix_btn)
self.adj_list_btn = QPushButton('生成邻接表')
self.adj_list_btn.clicked.connect(self.generate_adj_list)
input_layout.addWidget(self.adj_list_btn)
self.draw_graph_btn = QPushButton('绘制图形')
self.draw_graph_btn.clicked.connect(self.draw_graph)
input_layout.addWidget(self.draw_graph_btn)
input_group.setLayout(input_layout)
main_layout.addWidget(input_group)
# 输出区域
self.output_text = QTextEdit()
self.output_text.setReadOnly(True)
main_layout.addWidget(self.output_text)
# 设置主窗口部件
container = QWidget()
container.setLayout(main_layout)
self.setCentralWidget(container)
def generate_adj_matrix(self):
edges = self.get_edges()
if not edges:
return
G = nx.Graph()
G.add_edges_from(edges)
adj_matrix = nx.adjacency_matrix(G).todense()
self.output_text.clear()
self.output_text.append('邻接矩阵:')
self.output_text.append(str(adj_matrix))
def generate_adj_list(self):
edges = self.get_edges()
if not edges:
return
G = nx.Graph()
G.add_edges_from(edges)
adj_list = nx.generate_adjlist(G)
self.output_text.clear()
self.output_text.append('邻接表:')
for line in adj_list:
self.output_text.append(line)
def draw_graph(self):
edges = self.get_edges()
if not edges:
return
G = nx.Graph()
G.add_edges_from(edges)
plt.figure()
nx.draw(G, with_labels=True, node_color='skyblue', node_size=2000, edge_color='gray', font_size=15, font_weight='bold')
plt.show()
def get_edges(self):
input_data = self.input_text.toPlainText().strip()
if not input_data:
QMessageBox.warning(self, '警告', '请输入图的数据!')
return None
edges = []
for line in input_data.split('\n'):
nodes = line.split()
if len(nodes) != 2:
QMessageBox.warning(self, '警告', f'无效的边数据:{line}')
return None
edges.append(tuple(nodes))
return edges
if __name__ == '__main__':
app = QApplication(sys.argv)
window = GraphVisualizer()
window.show()
sys.exit(app.exec_())
|