基于tkinter的GUI工具,实现对指定文件夹下所有markdown文件的批量处理,核心功能包括:选择文件夹、批量查找内容、批量替换内容、展示查找结果、替换后按时间戳重命名并保存新文件(比如将所有文件中的aaa替换为bbb)。







编写一个完整、可直接运行的tkinter程序,整合所有你提到的功能,界面友好且操作流程清晰。
https://changdunovel.com/ug/pages/short-story-share?post_id=7611909021624472345&post_type=13&service_id=0&forum_book_id=0&share_code=G0VuqmlVm8JzlsoCfInRUn7w99s8_uLB5Mw0Ltsg-AE%3D&forum_id=0&forum_share_code=bf3ZWHYkWfxqQc7H2m8HMohglo12P9wWjzRp5j2CnhU%3D&relative_type=0&aid=1967&update_version_code=70932&percent=30&use_open_launch_app=1&user_id=94375796e7dca0fee8ec7e9a5a1acb55&did=e766a7e228d16a8b50e06f7c70181d3f&entrance=story_share_button&zlink=https%3A%2F%2Fzlink.fqnovel.com%2FdhVGe&gd_label=click_schema_lhft_share_novelapp_android&source_channel=wechat&share_channel=wechat&share_timestamp=1772290573&report_params=%7B%22entrance%22%3A%22story_share_button%22%2C%22type%22%3A%22story%22%2C%22content_type%22%3A%22story%22%2C%22content_id%22%3A%227611908638269000766%22%2C%22content_id_key%22%3A%22book_id%22%2C%22share_timestamp%22%3A%221772290573%22%7D&share_token=6fa167ac-5d3c-43fc-9a37-0e8e915518f5

import tkinter as tkfrom tkinter import ttk, filedialog, messageboximport osimport refrom datetime import datetimeclassMarkdownBatchProcessor:def__init__(self, root): self.root = root self.root.title("Markdown批量处理工具") self.root.geometry("900x600")# 初始化变量 self.folder_path = tk.StringVar() # 选中的文件夹路径 self.search_text = tk.StringVar() # 要查找的文本 self.replace_text = tk.StringVar() # 要替换的文本 self.search_results = [] # 存储查找结果# 创建UI界面 self._create_widgets()def_create_widgets(self):"""创建所有UI组件"""# 1. 文件夹选择区域 frame_folder = ttk.LabelFrame(self.root, text="文件夹选择") frame_folder.pack(fill="x", padx=10, pady=5) ttk.Label(frame_folder, text="目标文件夹:").grid(row=0, column=0, padx=5, pady=5, sticky="w") ttk.Entry(frame_folder, textvariable=self.folder_path, width=80).grid(row=0, column=1, padx=5, pady=5) ttk.Button(frame_folder, text="选择文件夹", command=self._select_folder).grid(row=0, column=2, padx=5, pady=5)# 2. 查找替换区域 frame_search_replace = ttk.LabelFrame(self.root, text="查找替换设置") frame_search_replace.pack(fill="x", padx=10, pady=5)# 查找行 ttk.Label(frame_search_replace, text="查找内容:").grid(row=0, column=0, padx=5, pady=5, sticky="w") ttk.Entry(frame_search_replace, textvariable=self.search_text, width=50).grid(row=0, column=1, padx=5, pady=5) ttk.Button(frame_search_replace, text="批量查找", command=self._batch_search).grid(row=0, column=2, padx=5, pady=5)# 替换行 ttk.Label(frame_search_replace, text="替换为:").grid(row=1, column=0, padx=5, pady=5, sticky="w") ttk.Entry(frame_search_replace, textvariable=self.replace_text, width=50).grid(row=1, column=1, padx=5, pady=5) ttk.Button(frame_search_replace, text="批量替换并保存", command=self._batch_replace, bg="#4CAF50", fg="white").grid(row=1, column=2, padx=5, pady=5)# 3. 结果展示区域 frame_result = ttk.LabelFrame(self.root, text="查找结果") frame_result.pack(fill="both", expand=True, padx=10, pady=5)# 创建表格 columns = ("文件名", "匹配次数", "匹配位置预览") self.tree = ttk.Treeview(frame_result, columns=columns, show="headings")# 设置列标题for col in columns: self.tree.heading(col, text=col)# 设置列宽 self.tree.column("文件名", width=200) self.tree.column("匹配次数", width=100) self.tree.column("匹配位置预览", width=500)# 滚动条 scrollbar = ttk.Scrollbar(frame_result, orient="vertical", command=self.tree.yview) self.tree.configure(yscrollcommand=scrollbar.set) self.tree.pack(side="left", fill="both", expand=True) scrollbar.pack(side="right", fill="y")def_select_folder(self):"""选择目标文件夹""" folder = filedialog.askdirectory(title="选择包含markdown文件的文件夹")if folder: self.folder_path.set(folder)# 清空之前的结果 self._clear_tree()def_get_md_files(self):"""获取文件夹下所有markdown文件""" folder = self.folder_path.get()ifnot os.path.exists(folder): messagebox.showerror("错误", "文件夹路径不存在!")return [] md_files = []for file in os.listdir(folder):if file.lower().endswith(".md"): md_files.append(os.path.join(folder, file))return md_filesdef_clear_tree(self):"""清空结果表格"""for item in self.tree.get_children(): self.tree.delete(item) self.search_results = []def_batch_search(self):"""批量查找所有markdown文件中的指定内容"""# 清空之前的结果 self._clear_tree()# 验证输入 search_text = self.search_text.get().strip()ifnot search_text: messagebox.showwarning("警告", "请输入要查找的内容!")return# 获取所有md文件 md_files = self._get_md_files()ifnot md_files: messagebox.showinfo("提示", "未找到任何markdown文件!")return# 遍历文件查找for file_path in md_files:try:with open(file_path, "r", encoding="utf-8") as f: content = f.read()# 查找所有匹配位置 matches = list(re.finditer(re.escape(search_text), content)) match_count = len(matches)# 生成预览信息 preview = ""if match_count > 0:# 取第一个匹配的前后20个字符作为预览 first_match = matches[0] start = max(0, first_match.start() - 20) end = min(len(content), first_match.end() + 20) preview = content[start:end].replace("\n", " ") preview = f"...{preview}..."# 保存结果 file_name = os.path.basename(file_path) self.search_results.append((file_name, match_count, preview))# 插入表格 self.tree.insert("", "end", values=(file_name, match_count, preview))except Exception as e: messagebox.showerror("错误", f"读取文件 {os.path.basename(file_path)} 失败:{str(e)}") messagebox.showinfo("完成", f"查找完成!共处理 {len(md_files)} 个文件,找到匹配项的文件有 {len(self.search_results)} 个")def_batch_replace(self):"""批量替换并保存新文件"""# 验证输入 search_text = self.search_text.get().strip() replace_text = self.replace_text.get().strip()ifnot search_text: messagebox.showwarning("警告", "请输入要查找的内容!")return# 获取所有md文件 md_files = self._get_md_files()ifnot md_files: messagebox.showinfo("提示", "未找到任何markdown文件!")return# 确认替换ifnot messagebox.askyesno("确认", f"即将替换 {len(md_files)} 个文件中的 '{search_text}' 为 '{replace_text}',并生成新文件。是否继续?"):return# 生成时间戳 timestamp = datetime.now().strftime("%Y%m%d%H%M%S") success_count = 0# 遍历文件替换for file_path in md_files:try:# 读取原文件with open(file_path, "r", encoding="utf-8") as f: content = f.read()# 替换内容 new_content = content.replace(search_text, replace_text)# 生成新文件名:原文件名_时间戳.md file_dir = os.path.dirname(file_path) file_name = os.path.basename(file_path) name_without_ext = os.path.splitext(file_name)[0] new_file_name = f"{name_without_ext}_{timestamp}.md" new_file_path = os.path.join(file_dir, new_file_name)# 保存新文件with open(new_file_path, "w", encoding="utf-8") as f: f.write(new_content) success_count += 1except Exception as e: messagebox.showerror("错误", f"处理文件 {os.path.basename(file_path)} 失败:{str(e)}") messagebox.showinfo("完成", f"替换完成!共处理 {len(md_files)} 个文件,成功生成 {success_count} 个新文件。\n时间戳:{timestamp}")# 替换后重新查找(展示替换结果) self._batch_search()if __name__ == "__main__": root = tk.Tk() app = MarkdownBatchProcessor(root) root.mainloop()界面布局:
ttk.LabelFrame分组,Treeview表格展示查找结果,界面清晰易操作核心功能实现:
str.replace实现全局替换)test_20260228153020.md).md文件re.finditer查找所有匹配项filedialog.askdirectory获取文件夹路径,自动过滤非markdown文件异常处理:
aaa)bbb)aaabbbnote.mdnote_20260228153020.md(文件内所有aaa都被替换为bbb)前的代码虽然实现了替换和时间戳保存,但没有按照「年月日时分秒+替换aaa为bbb」的格式来命名新文件(比如 20260228153020_替换aaa为bbb_原文件名.md),而是仅在原文件名后加了时间戳。我会修正这个问题,让新文件名严格符合你要求的格式,同时确保每个文档中的指定字段被全部替换。
import tkinter as tkfrom tkinter import ttk, filedialog, messageboximport osimport refrom datetime import datetimeclassMarkdownBatchProcessor:def__init__(self, root): self.root = root self.root.title("Markdown批量处理工具") self.root.geometry("900x600")# 初始化变量 self.folder_path = tk.StringVar() # 选中的文件夹路径 self.search_text = tk.StringVar() # 要查找的文本(如aaa) self.replace_text = tk.StringVar() # 要替换的文本(如bbb) self.search_results = [] # 存储查找结果# 创建UI界面 self._create_widgets()def_create_widgets(self):"""创建所有UI组件"""# 1. 文件夹选择区域 frame_folder = ttk.LabelFrame(self.root, text="文件夹选择") frame_folder.pack(fill="x", padx=10, pady=5) ttk.Label(frame_folder, text="目标文件夹:").grid(row=0, column=0, padx=5, pady=5, sticky="w") ttk.Entry(frame_folder, textvariable=self.folder_path, width=80).grid(row=0, column=1, padx=5, pady=5) ttk.Button(frame_folder, text="选择文件夹", command=self._select_folder).grid(row=0, column=2, padx=5, pady=5)# 2. 查找替换区域 frame_search_replace = ttk.LabelFrame(self.root, text="查找替换设置") frame_search_replace.pack(fill="x", padx=10, pady=5)# 查找行 ttk.Label(frame_search_replace, text="查找内容:").grid(row=0, column=0, padx=5, pady=5, sticky="w") ttk.Entry(frame_search_replace, textvariable=self.search_text, width=50).grid(row=0, column=1, padx=5, pady=5) ttk.Button(frame_search_replace, text="批量查找", command=self._batch_search).grid(row=0, column=2, padx=5, pady=5)# 替换行 ttk.Label(frame_search_replace, text="替换为:").grid(row=1, column=0, padx=5, pady=5, sticky="w") ttk.Entry(frame_search_replace, textvariable=self.replace_text, width=50).grid(row=1, column=1, padx=5, pady=5) ttk.Button(frame_search_replace, text="批量替换并保存", command=self._batch_replace, bg="#4CAF50", fg="white").grid(row=1, column=2, padx=5, pady=5)# 3. 结果展示区域 frame_result = ttk.LabelFrame(self.root, text="查找结果") frame_result.pack(fill="both", expand=True, padx=10, pady=5)# 创建表格 columns = ("文件名", "匹配次数", "匹配位置预览") self.tree = ttk.Treeview(frame_result, columns=columns, show="headings")# 设置列标题for col in columns: self.tree.heading(col, text=col)# 设置列宽 self.tree.column("文件名", width=200) self.tree.column("匹配次数", width=100) self.tree.column("匹配位置预览", width=500)# 滚动条 scrollbar = ttk.Scrollbar(frame_result, orient="vertical", command=self.tree.yview) self.tree.configure(yscrollcommand=scrollbar.set) self.tree.pack(side="left", fill="both", expand=True) scrollbar.pack(side="right", fill="y")def_select_folder(self):"""选择目标文件夹""" folder = filedialog.askdirectory(title="选择包含markdown文件的文件夹")if folder: self.folder_path.set(folder)# 清空之前的结果 self._clear_tree()def_get_md_files(self):"""获取文件夹下所有markdown文件""" folder = self.folder_path.get()ifnot os.path.exists(folder): messagebox.showerror("错误", "文件夹路径不存在!")return [] md_files = []for file in os.listdir(folder):if file.lower().endswith(".md"): md_files.append(os.path.join(folder, file))return md_filesdef_clear_tree(self):"""清空结果表格"""for item in self.tree.get_children(): self.tree.delete(item) self.search_results = []def_batch_search(self):"""批量查找所有markdown文件中的指定内容"""# 清空之前的结果 self._clear_tree()# 验证输入 search_text = self.search_text.get().strip()ifnot search_text: messagebox.showwarning("警告", "请输入要查找的内容!")return# 获取所有md文件 md_files = self._get_md_files()ifnot md_files: messagebox.showinfo("提示", "未找到任何markdown文件!")return# 遍历文件查找for file_path in md_files:try:with open(file_path, "r", encoding="utf-8") as f: content = f.read()# 查找所有匹配位置(全局匹配) matches = list(re.finditer(re.escape(search_text), content)) match_count = len(matches)# 生成预览信息 preview = ""if match_count > 0:# 取第一个匹配的前后20个字符作为预览 first_match = matches[0] start = max(0, first_match.start() - 20) end = min(len(content), first_match.end() + 20) preview = content[start:end].replace("\n", " ") preview = f"...{preview}..."# 保存结果 file_name = os.path.basename(file_path) self.search_results.append((file_name, match_count, preview))# 插入表格 self.tree.insert("", "end", values=(file_name, match_count, preview))except Exception as e: messagebox.showerror("错误", f"读取文件 {os.path.basename(file_path)} 失败:{str(e)}") messagebox.showinfo("完成", f"查找完成!共处理 {len(md_files)} 个文件,找到匹配项的文件有 {len(self.search_results)} 个")def_batch_replace(self):"""批量替换所有文档的指定字段,并按指定格式保存新文件"""# 验证输入 search_text = self.search_text.get().strip() replace_text = self.replace_text.get().strip()ifnot search_text: messagebox.showwarning("警告", "请输入要查找的内容!")return# 获取所有md文件 md_files = self._get_md_files()ifnot md_files: messagebox.showinfo("提示", "未找到任何markdown文件!")return# 确认替换 confirm_msg = f"即将替换 {len(md_files)} 个文件中的 '{search_text}' 为 '{replace_text}',并按「年月日时分秒_替换xxx为xxx_原文件名.md」格式生成新文件。是否继续?"ifnot messagebox.askyesno("确认", confirm_msg):return# 生成时间戳(年月日时分秒) timestamp = datetime.now().strftime("%Y%m%d%H%M%S")# 生成替换描述(如:替换aaa为bbb) replace_desc = f"替换{search_text}为{replace_text}" success_count = 0# 遍历文件执行全局替换for file_path in md_files:try:# 读取原文件内容(确保UTF-8编码,兼容中文)with open(file_path, "r", encoding="utf-8") as f: content = f.read()# 全局替换:替换所有匹配的字段(str.replace默认全局替换) new_content = content.replace(search_text, replace_text)# 生成新文件名:时间戳_替换描述_原文件名.md file_dir = os.path.dirname(file_path) original_file_name = os.path.basename(file_path) new_file_name = f"{timestamp}_{replace_desc}_{original_file_name}" new_file_path = os.path.join(file_dir, new_file_name)# 保存新文件(覆盖保护:如果同名文件已存在,自动加序号) counter = 1while os.path.exists(new_file_path): new_file_name = f"{timestamp}_{replace_desc}_{counter}_{original_file_name}" new_file_path = os.path.join(file_dir, new_file_name) counter += 1# 写入新内容with open(new_file_path, "w", encoding="utf-8") as f: f.write(new_content) success_count += 1except Exception as e: messagebox.showerror("错误", f"处理文件 {os.path.basename(file_path)} 失败:{str(e)}")# 提示结果 result_msg = f"替换完成!\n共处理 {len(md_files)} 个文件,成功生成 {success_count} 个新文件。\n示例文件名:{timestamp}_{replace_desc}_原文件名.md" messagebox.showinfo("完成", result_msg)# 替换后重新查找,验证替换结果 self._batch_search()if __name__ == "__main__": root = tk.Tk() app = MarkdownBatchProcessor(root) root.mainloop()新文件名格式严格符合要求
note_20260228153020.md20260228153020_替换aaa为bbb_note.md(完全匹配「年月日时分秒+替换aaa为bbb+原文件名」)timestamp = datetime.now().strftime("%Y%m%d%H%M%S") # 年月日时分秒replace_desc = f"替换{search_text}为{replace_text}"# 替换描述new_file_name = f"{timestamp}_{replace_desc}_{original_file_name}"# 组合新文件名确保全局替换所有字段
content.replace(search_text, replace_text):Python的str.replace方法默认会替换字符串中所有匹配的子串,而非仅第一个,确保每个文档中的目标字段被全部替换(比如所有aaa都变成bbb)。20260228153020_替换aaa为bbb_1_note.md),避免文件覆盖。更清晰的用户提示
假设你操作如下:
aaabbb学习笔记.md20260228164530_替换aaa为bbb_学习笔记.mdaaa都被替换成bbb,原文件保持不变。# 第1集:楔子·神王陨落
诛仙渊底,罡风如刀,刮过崖壁上的嶙峋怪石,发出鬼哭狼嚎般的嘶吼,卷着刺骨的寒意,吞噬着周遭仅剩的一丝生机。渊顶云雾翻涌,遮蔽了日月,仅有的微光艰难地穿透云层,落在崖边那道摇摇欲坠的身影上,将其染成一片血色。
杨少平半跪在地,胸口一道深可见骨的伤口狰狞可怖,断裂的肋骨刺破皮肉,暗红的神血顺着伤口汩汩涌出,滴落在脚下的碎石上,发出“滋滋”的声响,瞬间将坚硬的岩石腐蚀出细小的坑洞。他那身曾经威震三界的神王战甲,早已破碎不堪,甲片散落一地,沾满了血污与尘埃,唯有战甲领口处那枚镌刻着青云纹路的玉佩,还在微弱地散发着淡青色的光晕,那是青云宗的宗主信物,也是他一生守护的象征。
他的气息微弱得如同风中残烛,每一次呼吸都牵扯着胸口的剧痛,嘴角不断溢出鲜血,视线也开始变得模糊。但那双曾经澄澈如星辰、盛满威严与温柔的眼眸,此刻却燃烧着滔天的恨意与不甘,死死地盯着崖顶那道挺拔却阴狠的身影。
黄琛就站在诛仙渊的崖边,一身月白色的青云宗大师兄服饰纤尘不染,与这血色弥漫的场景格格不入。他面容俊朗,眉眼间却带着一丝难以掩饰的得意与贪婪,手中紧紧攥着一柄通体漆黑、泛着诡异光泽的长剑,剑身上还残留着杨少平的神血,顺着剑刃缓缓滴落,坠入深渊。
那是杨少平的佩剑,破妄神剑。
“为什么……”杨少平的声音嘶哑得如同破旧的风箱,每一个字都带着血沫,却依旧带着不容置疑的质问。他想不通,自己倾囊相授、视若手足的大师兄,自己甘愿托付宗门重任、分享权力的挚友,为何会在自己冲击至高神境的关键时刻,给予自己致命一击。
黄琛闻言,嘴角勾起一抹冰冷的嗤笑,缓缓抬起头,目光俯视着崖底的杨少平,眼神里没有半分昔日的恭敬与亲近,只剩下赤裸裸的野心与厌恶。“为什么?”他重复了一遍,语气中满是嘲讽,“杨少平,你太天真了。你以为我真的甘愿屈居你之下,做你身边的陪衬吗?”
他向前迈了一步,居高临下地看着杨少平,声音里的贪婪愈发明显:“你是青云宗万年不遇的奇才,天生拥有神王之姿,一手破妄神剑法威震三界,宗门上下都对你俯首帖耳,连宗主之位都早早地传给了你。可你呢?你只顾着修炼,只顾着守护那些所谓的宗门道义,根本看不到我的野心,也看不到我为青云宗付出的一切!”
“我追随你多年,为你出生入死,为青云宗南征北战,立下无数汗马功劳。可所有人都只记得你杨少平,记得你是那个拯救青云宗的神王,谁还记得我黄琛?”黄琛的声音逐渐提高,语气中满是怨毒,“还有混沌剑胎,那是上古神物,本就该属于有能力的人。你空有神王之姿,却不懂如何最大化利用剑胎的力量,与其让它在你手中浪费,不如交给我,我会用它带领青云宗走向更高的巅峰,甚至统治整个三界!”
混沌剑胎。
这四个字如同利刃,再次刺穿了杨少平的心脏。那是他耗费百年光阴,从上古秘境中寻得的神物,蕴含着无尽的神王本源,是他冲击至高神境的关键,也是他计划中守护青云宗、守护三界的最大依仗。他从未想过,黄琛竟然早已觊觎这混沌剑胎,甚至为此策划了这场惊天背叛。
“所以,宗门里的内奸,是你安排的?”杨少平的心脏像是被一只无形的手紧紧攥住,剧痛难忍。他想起了近期宗门内频繁出现的异动,想起了那些忠于自己的弟子莫名失踪,想起了自己冲击神境时,那些突如其来的干扰——原来这一切,都是黄琛的阴谋。
“是又如何?”黄琛毫不掩饰,脸上露出得意的笑容,“没有那些内奸,我怎么能在你冲击神境、最虚弱的时候,给你这致命一击?怎么能顺利地夺走破妄神剑,怎么能让整个青云宗都以为,你是修炼走火入魔,坠渊而亡?”
他顿了顿,又补充道:“哦对了,还有师父和师母,他们不肯接受我成为新的宗主,不肯承认你的‘罪行’,我只能……送他们去见你了。”
“你说什么?!”杨少平浑身一震,一股极致的愤怒瞬间冲破了身体的剧痛,他猛地想要站起身,却牵动了胸口的伤口,一口鲜血喷涌而出,身体再次重重地摔倒在地。师父待他如己出,师母更是从小对他悉心照料,他们是他在这世上最亲近的人,如今竟然也被黄琛所害!
“哈哈哈……”黄琛见状,发出一阵肆无忌惮的狂笑,“杨少平,你现在是不是很愤怒?是不是很不甘?可惜,一切都晚了。你已经重伤垂危,混沌剑胎在我手中,青云宗也已经是我的了,你所珍视的一切,都将归我所有!”
他抬手,指尖凝聚起一缕黑色的魔气,那是他暗中勾结魔道的铁证。“你以为我只是觊觎你的位置和剑胎吗?我早就和魔道至尊达成了协议,只要我帮他夺取混沌剑胎,他就帮我统一三界。等我掌控了三界,我就是新的神王,而你,只会成为诛仙渊底的一抔黄土,被世人遗忘!”
杨少平的眼神变得愈发冰冷,恨意如同燎原之火,在他心中疯狂燃烧。他看着黄琛那张得意忘形的脸,看着他手中那柄沾染了自己鲜血的破妄神剑,看着他身上那股令人作呕的魔气,心中只剩下一个念头——复仇!
他拼尽最后一丝力气,抬手想要凝聚神之力,哪怕只有一丝希望,他也要拉着黄琛一起坠入这诛仙渊,同归于尽。可他的身体早已不堪重负,神之力刚刚凝聚,就瞬间消散,胸口的伤口再次崩裂,更多的鲜血涌出,视线也变得愈发模糊。
黄琛察觉到了他的意图,脸上的笑容瞬间敛去,取而代之的是一丝狠戾。“怎么?到了这种地步,还想反抗?”他抬手,将指尖的魔气猛地向杨少平射去,“既然你这么不甘,那我就送你一程,让你彻底解脱!”
黑色的魔气如同毒蛇,瞬间穿透了杨少平的身体,所过之处,神脉寸寸断裂,生机飞速流逝。杨少平只觉得浑身剧痛,仿佛有无数根针在扎着他的骨头,他的意识开始逐渐涣散,耳边只剩下黄琛那冰冷的嘲讽声。
“杨少平,安心地去吧。你的青云宗,你的混沌剑胎,你的神王之位,我都会替你好好‘守护’的……”
意识消散的最后一刻,杨少平用尽全身的力气,将自己的神王残魂与混沌剑胎的一丝本源紧紧绑定,心中默念着黄琛的名字,立下最恶毒的誓言——若有来生,我杨少平定要将你碎尸万段,血债血偿,重振青云宗,让你为自己的背叛付出惨痛的代价!
身体渐渐失去了力气,杨少平的目光缓缓垂下,最终彻底失去了光泽。他的身体顺着崖壁,缓缓滑落,坠入了深不见底的诛仙渊,只留下一缕微弱的残魂,裹挟着混沌剑胎的本源,在无尽的黑暗中沉浮。
黄琛站在崖边,看着杨少平的身影彻底消失在深渊之中,脸上露出了满意的笑容。他低头看了看自己手中的破妄神剑,又摸了摸胸口——那里,存放着他从杨少平身上夺走的混沌剑胎,只是剑胎此刻没有丝毫光泽,仿佛陷入了沉睡。
“混沌剑胎,很快,你就会属于我了。”黄琛眼中闪烁着贪婪的光芒,转身离去,背影挺拔,却带着一股彻骨的阴狠。诛仙渊的罡风依旧呼啸,崖边的血迹渐渐被风吹干,仿佛从未发生过这场惊天背叛,唯有那枚散落的玉佩,还在微弱地散发着光晕,见证着神王的陨落。
……
无尽的黑暗中,杨少平的残魂如同风中残烛,在罡风与魔气的侵蚀下,几乎要彻底消散。可那股深入骨髓的恨意,那不灭的复仇之心,却如同火种,支撑着他的残魂,在黑暗中艰难地沉浮。
混沌剑胎的本源包裹着他的残魂,散发着微弱的暖意,一点点修复着他受损的魂体。不知道过了多久,也许是一瞬,也许是万年,那缕残魂突然感受到一股强大的吸力,周围的黑暗开始剧烈地扭曲、旋转,形成一个巨大的时空漩涡。
杨少平的意识被这股吸力拉扯着,不由自主地卷入了漩涡之中。耳边传来呼啸的风声,眼前闪过无数碎片化的画面——他小时候在青云宗修炼的场景,师父师母对他的悉心教导,他与黄琛一起并肩作战的日子,还有黄琛偷袭他时的阴狠嘴脸,师父师母惨死的模样……
“不——!”
杨少平猛地睁开眼睛,剧烈地喘息着,胸口的剧痛仿佛还在,神血喷涌的触感也清晰可辨。他下意识地抬手摸向自己的胸口,却发现那里光滑平整,没有丝毫伤口,身上也不再是那身破碎的神王战甲,而是一身崭新的青云宗宗主服饰,纤尘不染,领口处的青云玉佩,正散发着淡淡的青色光晕。
他环顾四周,发现自己正站在青云宗的大典广场上。广场宽阔平坦,地面由清一色的青石板铺成,光滑如镜,倒映着周围的景象。广场四周,矗立着数十根巨大的石柱,石柱上雕刻着栩栩如生的青云纹路,顶端悬挂着红色的绸带,随风飘扬,显得喜庆而庄重。
广场上人头攒动,密密麻麻地站满了青云宗的弟子,他们身着统一的青色弟子服,脸上带着恭敬与喜悦,目光齐刷刷地投向广场中央的高台。高台上,摆放着一张宽大的案几,案几上摆放着瓜果祭品,两侧站着几位头发花白、气息雄厚的宗门长老,他们面色庄重,眼神中满是欣慰。
空气中弥漫着浓郁的灵气,还有淡淡的檀香,耳边传来弟子们的低声议论,还有悠扬的钟声,回荡在整个青云宗的山谷之中。
这不是诛仙渊,这是青云宗的宗门大典广场!
杨少平的心脏狂跳不止,他有些不敢相信自己的眼睛。他不是已经坠入诛仙渊,魂飞魄散了吗?怎么会突然回到青云宗的宗门大典上?
他下意识地运转体内的神之力,却发现自己的神之力虽然没有达到巅峰状态,却也有着神境初期的修为,而且身体完好无损,没有丝毫受伤的痕迹。他又摸了摸自己的胸口,混沌剑胎的本源就在体内,虽然依旧处于沉睡状态,却散发着稳定的气息,没有丝毫损伤。
“我……重生了?”杨少平的心中涌起一股巨大的狂喜,随之而来的,是更加浓烈的恨意。他抬头望向高台下方,目光在人群中快速搜索着,很快,就找到了那道熟悉的身影。
黄琛就站在人群的前排,一身月白色的大师兄服饰,面容俊朗,嘴角带着温和的笑容,正与身边的几位弟子低声交谈着,看起来温文尔雅,人畜无害。若是前世的杨少平,一定会被他这副模样所欺骗,以为他是真心为自己高兴,真心为青云宗感到欣慰。
可现在,杨少平看着他这副虚伪的嘴脸,只觉得无比恶心。他清楚地记得,就是这副嘴脸的主人,在不久的将来,会勾结魔道,背叛自己,杀害师父师母,屠戮忠于自己的弟子,夺走混沌剑胎,将自己推入诛仙渊,鸠占鹊巢,成为青云宗的伪宗主!
“宗主,您醒了?”一个温和的声音在身边响起,杨少平回头,看到了自己的贴身弟子林默。林默身着青色弟子服,面容清秀,眼神中满是关切,正小心翼翼地看着他,“您刚才站在这里,突然闭着眼睛,脸色不太好,是不是修炼出了什么岔子?”
林默,前世忠于自己的核心弟子之一,为了保护自己,被黄琛的手下残忍杀害,死状凄惨。
看到林默活生生地站在自己面前,杨少平的心中一暖,眼底闪过一丝不易察觉的动容。他拍了拍林默的肩膀,声音尽量保持平静:“我没事,只是刚才想起了一些事情,有些失神。”
林默松了口气,点了点头:“没事就好。宗主,大典马上就要开始了,长老们都在等您上台呢。这次是您突破神境、带回混沌剑胎的庆功大典,整个青云宗都在为您高兴,还有其他宗门的使者,也都前来祝贺了。”
突破神境、带回混沌剑胎的庆功大典!
杨少平的心中瞬间明白了过来。他重生了,回到了自己刚刚突破神境,从上古秘境中带回混沌剑胎,青云宗为他举办庆功大典的这一天!
他清楚地记得,就是这一天,黄琛会假意前来祝贺,表面上对他恭敬有加,暗地里却在试探混沌剑胎的下落,同时观察他的状态,为后续的背叛布局。也是从这一天开始,黄琛开始暗中勾结魔道,拉拢宗门内奸,一步步实施自己的阴谋。
前世的他,就是因为太过信任黄琛,没有察觉到他的异样,才给了他可乘之机,最终落得家破人亡、魂飞魄散的下场。
“好,我知道了。”杨少平缓缓点头,眼底的动容渐渐被冰冷的寒意取代。他抬起头,目光再次投向黄琛,眼神中没有了前世的信任与温柔,只剩下彻骨的冰冷与杀意。
黄琛似乎察觉到了他的目光,转过头,与他对视。四目相对的瞬间,黄琛的眼中闪过一丝不易察觉的诧异,似乎没想到杨少平会用这样的眼神看着自己。但很快,他就恢复了温和的笑容,对着杨少平微微躬身,露出一副恭敬的模样。
杨少平没有回应他的恭敬,只是冷冷地收回了目光。他知道,这一世,一切都将不同。
黄琛,你欠我的,欠师父师母的,欠那些忠于我的弟子的,欠青云宗的,我都会一一讨回来!这一世,我不会再对你有任何信任,不会再给你任何背叛的机会!混沌剑胎是我的,青云宗是我的,神王之位也是我的,你所觊觎的一切,我都会牢牢守住,而你,终将为自己的野心和背叛,付出最惨痛的代价!
“宗主,该上台了。”林默的声音再次响起,打断了杨少平的思绪。
杨少平深吸一口气,压下心中的恨意与杀意,整理了一下身上的宗主服饰,迈步向高台走去。每一步,都沉稳而坚定,仿佛踩在通往复仇之路的基石上。
广场上的弟子们看到他走来,纷纷安静下来,目光中满是恭敬与崇拜,低声欢呼着“宗主”。几位长老也纷纷转过身,对着他点了点头,脸上露出欣慰的笑容。
杨少平走上高台,站在案几前,目光缓缓扫过广场上的众人。他看到了那些忠于自己的弟子,看到了几位真心为自己高兴的长老,也看到了人群中那道虚伪的身影——黄琛正仰着头,看着他,嘴角依旧带着温和的笑容,但眼底深处,却藏着一丝不易察觉的贪婪与算计。
就在这时,黄琛迈步走出人群,缓缓走上高台,手中捧着一个精致的玉盒,来到杨少平面前,躬身行礼:“师弟,恭喜你突破神境,成功带回混沌剑胎,为我青云宗争光!这是我为你准备的贺礼,希望你能喜欢。”
他的声音温和,语气恭敬,看起来真诚无比,任谁看了,都会觉得他是真心为杨少平高兴。
杨少平低头看着他手中的玉盒,又抬眼看向黄琛的脸,嘴角勾起一抹冰冷的弧度。他清楚地记得,这个玉盒里装的,是一枚看似珍贵、实则蕴含着微弱魔气的玉佩,黄琛就是想通过这枚玉佩,试探他的神之力,同时暗中侵蚀他的身体,为后续的偷袭做铺垫。
前世的他,毫无防备地收下了这枚玉佩,也正是因为这枚玉佩,他在冲击至高神境时,神脉受到了轻微的侵蚀,才给了黄琛可乘之机。
“多谢大师兄。”杨少平的声音平淡,没有丝毫波澜,伸出手,却没有去接那个玉盒,而是目光紧紧地盯着黄琛的眼睛,一字一句地说道,“只是,我近日修炼,感知有些敏锐,总觉得身边有一些不纯净的气息,不知道大师兄有没有察觉到?”
黄琛的身体微微一僵,脸上的笑容有瞬间的凝固,眼底闪过一丝慌乱,但很快就掩饰了过去。他抬起头,一脸疑惑地看着杨少平:“师弟说笑了,我青云宗乃是正道第一宗门,灵气纯净,怎么会有不纯净的气息?或许是师弟刚刚突破神境,气息还未稳定,才会有这样的错觉吧。”
“是吗?”杨少平挑了挑眉,语气中带着一丝不易察觉的嘲讽,“或许是吧。只是,有些东西,表面看起来纯净无瑕,内里却藏着污秽不堪的东西,大师兄说,对不对?”
说话间,他的目光有意无意地扫过黄琛手中的玉盒,又落在黄琛的胸口——那里,存放着他暗中勾结魔道的信物,也是他未来夺取混沌剑胎的重要依仗。
黄琛的心脏猛地一跳,心中的不安越来越强烈。他总觉得,今天的杨少平,似乎有些不一样。以往的杨少平,仁厚温和,对他无比信任,从来不会用这样的语气对他说话,更不会用这样的眼神审视他。
难道,他察觉到了什么?
这个念头刚刚升起,就被黄琛强行压了下去。不可能,他的计划天衣无缝,而且杨少平刚刚突破神境,正是志得意满的时候,怎么可能会怀疑自己?一定是自己多心了。
他定了定神,再次露出温和的笑容,将玉盒递到杨少平面前:“师弟说得有道理。或许是我太过粗心,没有察觉到。不过,这贺礼是我的一片心意,师弟还是收下吧。”
杨少平看着他手中的玉盒,又看了看他那副强装镇定的模样,心中冷笑。黄琛,你果然还是和前世一样,虚伪又狡猾。不过,这一世,我不会再让你得逞。
他没有去接玉盒,反而缓缓抬起手,指尖凝聚起一缕淡淡的神之力,看似随意地拂过玉盒的表面。瞬间,玉盒中那股微弱的魔气被神之力触动,发出一丝细微的黑色光晕,一闪而逝。
这一幕,虽然短暂,却被杨少平清晰地捕捉到了。而黄琛,也因为这股魔气被触动,身体再次微微一僵,眼神中的慌乱再也掩饰不住。
杨少平的嘴角,勾起一抹冰冷的杀意。
游戏,现在才刚刚开始。
他看着黄琛,缓缓开口,声音不大,却带着一股不容置疑的威严:“大师兄,这贺礼,我看还是先放一放吧。今日是宗门大典,不如,我们先好好庆祝一番?毕竟,这混沌剑胎,可是我青云宗的至宝,也是我们未来守护三界的依仗,值得好好庆贺。”
黄琛闻言,心中的不安更加强烈。他能感觉到,杨少平的目光一直落在自己身上,那目光冰冷而锐利,仿佛能看穿自己所有的伪装和阴谋。他强压下心中的慌乱,点了点头:“师弟说得是,是我考虑不周。今日是大典,理应好好庆祝。”
杨少平没有再说话,只是转过身,目光投向广场上的众人,脸上露出了一抹看似温和,实则冰冷的笑容。他知道,黄琛已经开始怀疑自己,接下来,黄琛一定会加快布局,暗中对自己下手。
但他并不害怕。
前世的悲剧,他不会再让其重演。这一世,他拥有前世的记忆,知道黄琛所有的阴谋和布局,他会步步为营,先发制人,清理宗门内奸,揭穿黄琛的伪装,夺回属于自己的一切。
而此刻,站在他身后的黄琛,看着他的背影,眼底闪过一丝阴狠的光芒。他确定,今天的杨少平,一定有问题。不管他察觉到了什么,自己都不能坐以待毙。混沌剑胎,他势在必得,青云宗的宗主之位,他也势在必得!
黄琛悄悄抬起手,指尖凝聚起一缕微弱的魔气,暗中看向杨少平的后背,眼神中闪过一丝杀意。只要杨少平敢阻碍自己,他不介意,提前动手!
广场上的钟声再次响起,庆典正式开始。弟子们的欢呼声此起彼伏,长老们的脸上满是欣慰,可谁也没有察觉到,高台上的两位核心人物,心中早已掀起了滔天巨浪,一场关乎青云宗命运、关乎三界安危的阴谋与复仇,正在悄然拉开序幕。
杨少平站在高台上,目光平静地看着下方的人群,心中却早已做好了准备。他知道,一场暴风雨即将来临,而他,将是这场暴风雨的主宰。黄琛,你的死期,不远了。
就在庆典进行到高潮,杨少平准备发表讲话之际,他突然感觉到一股微弱的杀气,从身后传来。他嘴角的笑容愈发冰冷,没有回头,只是在心中默念:黄琛,你果然忍不住了。也好,就让我们,好好算一算这笔账!