import numpy as np import tkinter as tk from tkinter import ttk, messagebox class MatrixGenerator: def __init__(self, n, step, start): self.n = n self.step = step self.start = start self.matrix = np.zeros((n, n), dtype=int) # 预先生成等差数列 self.values = [start + i * step for i in range(n * n)] def generate_spiral(self, clockwise=True): m = self.matrix n = self.n visited = [[False] * n for _ in range(n)] # 顺时针方向:右 -> 下 -> 左 -> 上 if clockwise: dr = [0, 1, 0, -1] dc = [1, 0, -1, 0] # 逆时针方向:下 -> 右 -> 上 -> 左 else: dr = [1, 0, -1, 0] dc = [0, 1, 0, -1] r, c, di = 0, 0, 0 for i in range(n * n): m[r][c] = self.values[i] visited[r][c] = True # 尝试下一个位置 nr, nc = r + dr[di], c + dc[di] # 检查边界及是否已访问 if 0 <= nr < n and 0 <= nc < n and not visited[nr][nc]: r, c = nr, nc else: # 转向 di = (di + 1) % 4 r, c = r + dr[di], c + dc[di] return m def generate_zigzag(self): m = self.matrix idx = 0 for i in range(2 * self.n - 1): if i < self.n: r, c = 0, i else: r, c = i - self.n + 1, self.n - 1 curr_diag = [] while r < self.n and c >= 0: curr_diag.append((r, c)) r += 1; c -= 1 if i % 2 == 0: curr_diag.reverse() for r, c in curr_diag: m[r][c] = self.values[idx]; idx += 1 return m def generate_snake(self): m = self.matrix idx = 0 for i in range(self.n): # 偶数行从左往右,奇数行从右往左 cols = range(self.n) if i % 2 == 0 else range(self.n - 1, -1, -1) for j in cols: m[i][j] = self.values[idx]; idx += 1 return m def generate_diagonal(self): m = self.matrix idx = 0 for d in range(2 * self.n - 1): for i in range(max(0, d - self.n + 1), min(d + 1, self.n)): m[i][d - i] = self.values[idx]; idx += 1 return m class MatrixApp: def __init__(self, root): self.root = root self.root.title("多功能矩阵生成器 Pro") self.root.geometry("700x700") # 输入面板 input_frame = ttk.LabelFrame(root, text="矩阵参数配置", padding=10) input_frame.pack(fill="x", padx=15, pady=10) # 使用 Grid 布局排列输入框 ttk.Label(input_frame, text="矩阵维数 (n):").grid(row=0, column=0, sticky="w", padx=5) self.n_entry = ttk.Entry(input_frame, width=15); self.n_entry.insert(0, "6") self.n_entry.grid(row=0, column=1, pady=5) ttk.Label(input_frame, text="起始数值:").grid(row=0, column=2, sticky="w", padx=5) self.start_entry = ttk.Entry(input_frame, width=15); self.start_entry.insert(0, "1") self.start_entry.grid(row=0, column=3, pady=5) ttk.Label(input_frame, text="数值步长:").grid(row=1, column=0, sticky="w", padx=5) self.step_entry = ttk.Entry(input_frame, width=15); self.step_entry.insert(0, "1") self.step_entry.grid(row=1, column=1, pady=5) ttk.Label(input_frame, text="填充模式:").grid(row=1, column=2, sticky="w", padx=5) self.mode_cb = ttk.Combobox(input_frame, width=13, values=["螺旋形", "之字形", "对角线", "蛇形"], state="readonly") self.mode_cb.current(0); self.mode_cb.grid(row=1, column=3, pady=5) ttk.Label(input_frame, text="旋转方向:").grid(row=2, column=0, sticky="w", padx=5) self.dir_cb = ttk.Combobox(input_frame, width=13, values=["顺时针 (Clockwise)", "逆时针 (Counterclockwise)"], state="readonly") self.dir_cb.current(0); self.dir_cb.grid(row=2, column=1, pady=5) # 按钮 btn = ttk.Button(input_frame, text="立即生成矩形", command=self.handle_generate) btn.grid(row=2, column=2, columnspan=2, sticky="nsew", padx=5, pady=5) # 输出区域 self.text_area = tk.Text(root, font=("Consolas", 11), wrap="none", bg="#f8f9fa") self.text_area.pack(fill="both", expand=True, padx=15, pady=10) # 滚动条控制 sy = ttk.Scrollbar(self.text_area, orient="vertical", command=self.text_area.yview) sy.pack(side="right", fill="y") sx = ttk.Scrollbar(self.text_area, orient="horizontal", command=self.text_area.xview) sx.pack(side="bottom", fill="x") self.text_area.configure(yscrollcommand=sy.set, xscrollcommand=sx.set) def handle_generate(self): try: # 验证输入 n_str = self.n_entry.get() if not n_str.isdigit(): raise ValueError("矩阵大小必须是正整数") n = int(n_str) if n <= 0: raise ValueError("矩阵大小必须大于0") if n > 60: raise ValueError("大小超过60可能导致显示错乱") start = int(self.start_entry.get()) step = int(self.step_entry.get()) gen = MatrixGenerator(n, step, start) mode = self.mode_cb.get() direction = "顺时针" in self.dir_cb.get() if mode == "螺旋形": res = gen.generate_spiral(clockwise=direction) elif mode == "之字形": res = gen.generate_zigzag() elif mode == "对角线": res = gen.generate_diagonal() else: res = gen.generate_snake() self.display_matrix(res) except ValueError as e: messagebox.showerror("参数错误", str(e)) except Exception as e: messagebox.showerror("运行时错误", f"发生未知错误: {e}") def display_matrix(self, matrix): self.text_area.delete(1.0, tk.END) # 获取矩阵中绝对值最大的数字来确定列宽 max_val = np.abs(matrix).max() col_width = len(str(max_val)) + 2 if col_width < 4: col_width = 4 output = [] for row in matrix: line = "".join(f"{item:>{col_width}}" for item in row) output.append(line) self.text_area.insert(tk.END, "\n".join(output)) if __name__ == "__main__": root = tk.Tk() # 设置简单的样式 style = ttk.Style() style.theme_use('clam') app = MatrixApp(root) root.mainloop()