This repository has been archived on 2026-04-12. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
2026-04-12 21:40:41 +08:00

193 lines
6.7 KiB
Python

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()