当前位置: 首页 > article >正文

浔川代码编辑器 v4.1.0 正式版重磅上线!AI 加持,轻量高效,开箱即用

浔川代码编辑器 v4.1.0 正式版重磅上线AI 加持轻量高效开箱即用基于Python Tkinter SQLite3深度打磨浔川代码编辑器 v4.1.0 正式版今日全面发布本次迭代全面整合内测优化成果AI 助手、在线运行、菜单布局、登录体验四大核心升级纯本地运行、免安装开箱即用为 Python 初学者、脚本开发者、轻量化编程场景带来更稳定、更便捷、更智能的编码体验。 一、软件核心定位浔川代码编辑器是轻量级桌面代码编辑工具纯本地运行、数据本地存储、无需复杂环境配置集代码编辑、语法高亮、在线运行、AI 快捷助手、账号管理、配置记忆、版本更新、用户反馈于一体新手友好、老手高效一站式满足日常代码编写与调试需求。✨ 二、v4.1.0 正式版核心更新全覆盖内测功能1. AI 助手全新上线编程更智能新增顶部菜单栏「AI 对话」专属入口内置三大 AI 快捷通道豆包、DeepSeek、文心一言修复旧版弹窗空白 Bug点击直接浏览器打开官网无需额外弹窗一键唤 AI 辅助编码、查问题、写思路2. 菜单与布局重构操作更清晰新增在线运行独立菜单栏拆分「代码运行」「在线运行」双模块功能分类更直观、查找更高效优化整体界面布局行号实时显示、编辑区更清爽编码视野无干扰3. 在线代码运行升级免环境写码新增一键在线运行 Python跳转接口无需本地配置 Python 环境打开即用新增一键在线运行 C跳转接口多语言轻量开发全覆盖保留本地运行入口并标注版本提示兼顾未来拓展与当前体验4. 启动与登录优化三种入口随心选账号注册用户名≥3 位、密码≥6 位密码MD5 加密存储本地数据库安全可靠账号登录输入账号密码即可进入首次登录必须同意用户协议合规使用更放心游客模式免注册免登录一键「游客体验」快速上手适合临时编写、快速测试5. 核心编辑能力拉满编码更流畅基础编辑支持多行编辑、无限撤销 / 重做、左侧实时行号基础操作丝滑不卡顿Python 语法高亮关键字蓝、字符串红、注释绿、数字紫自动识别标色代码结构一目了然文件管理支持新建 / 打开 / 保存 / 另存为兼容 .py、.txt 及所有格式文件切换 / 关闭自动检测未保存内容防丢码更安心字体与视图Ctrl/Ctrl- 快速缩放字体最低 10 号防过小登录用户自动记忆字体、窗口大小下次打开还原偏好6. 完整菜单功能一站式操作文件新建、打开、保存、另存为、退出软件编辑撤销、重做、全选、复制、剪切、粘贴视图增大 / 减小字体代码运行本地运行版本提示、在线运行 Python、在线运行 CAI 对话豆包、DeepSeek、文心一言一键直达帮助检查更新、我要反馈、用户协议、关于软件7. 实用快捷键大全高效提速表格快捷键功能CtrlN新建文件CtrlO打开文件CtrlS保存文件CtrlShiftS另存为CtrlZ撤销CtrlY重做CtrlA全选CtrlC复制CtrlX剪切CtrlV粘贴Ctrl增大字体Ctrl-减小字体8. 数据安全与配置持久化本地数据库editor_user.db存储账号信息、加密密码、个人配置、用户协议所有数据本地留存不上传云端隐私更安全反馈文件夹feedback提交反馈自动保存版本、身份、时间、标题、内容问题追踪更高效配置记忆仅登录用户自动保存字体、字号、窗口尺寸游客模式不保存配置兼顾便捷与简洁9. 版本更新与合规机制自动联网检测最新版对比弹窗提示展示更新日志一键跳转下载地址更新更省心内置用户协议新用户首次登录必阅同意随时可在帮助菜单查看合规使用有保障 三、v4.1.0 核心优势免安装单文件运行双击主 Python 文件启动低配电脑也流畅无冗余占用纯本地隐私安全账号、配置、反馈全存在本地不联网上传数据自主掌控AI 在线运行双加持不用装环境、不用搜网址写码→运行→问 AI 一站式完成新手友好全功能语法高亮、自动提示、配置记忆、协议规范零基础也能快速上手轻量化不臃肿无多余插件、无广告干扰专注编码打开即用、用完即关 四、即刻升级开启高效编码浔川代码编辑器 v4.1.0 正式版已全面上线修复所有已知问题、优化性能体验、完善功能细节无论是日常练习 Python、编写小脚本还是快速调试代码都是你的贴心编程搭子立即更新体验AI 辅助 免环境运行 本地安全的轻量编码新方式让写代码更简单、更高效、更安心import tkinter as tk from tkinter import ttk, scrolledtext, messagebox, filedialog, simpledialog import sqlite3 import hashlib import os import sys import requests import json from datetime import datetime import webbrowser # -------------------------- 全局配置与常量 -------------------------- SOFT_NAME 浔川代码编辑器 SOFT_VERSION 4.1.0 UPDATE_API https://jsonplaceholder.typicode.com/posts/1 DB_FILE editor_user.db FEEDBACK_DIR feedback DEFAULT_FONT (Consolas, 12) HIGHLIGHT_COLORS { keyword: #0000FF, string: #A31515, comment: #008000, number: #FF00FF } PYTHON_KEYWORDS { False, None, True, and, as, assert, async, await, break, class, continue, def, del, elif, else, except, finally, for, from, global, if, import, in, is, lambda, nonlocal, not, or, pass, raise, return, try, while, with, yield } LOGGED_USER None PROTOCOL_VERSION 4.1.0 IS_GUEST False # -------------------------- 数据库初始化 -------------------------- def init_database(): conn sqlite3.connect(DB_FILE) c conn.cursor() c.execute(CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY AUTOINCREMENT, username TEXT UNIQUE NOT NULL, password TEXT NOT NULL, reg_time TEXT NOT NULL, agree_protocol INTEGER DEFAULT 0)) c.execute(CREATE TABLE IF NOT EXISTS editor_config (user_id INTEGER PRIMARY KEY, font TEXT NOT NULL, font_size INTEGER NOT NULL, win_size TEXT DEFAULT 800x600, FOREIGN KEY(user_id) REFERENCES users(id))) c.execute(CREATE TABLE IF NOT EXISTS user_protocol (version TEXT PRIMARY KEY, content TEXT NOT NULL, update_time TEXT NOT NULL)) c.execute(SELECT * FROM user_protocol WHERE version?, (PROTOCOL_VERSION,)) if not c.fetchone(): default_protocol [浔川代码编辑器用户协议] 版本:4.1.0 更新时间:2026-05-02 1. 本软件为免费开源工具,仅供个人学习和非商业使用; 2. 用户需妥善保管自己的账号密码,因密码泄露造成的损失由用户自行承担; 3. 软件支持在线资源更新,更新过程中请保证网络通畅; 4. 禁止使用本软件编写、运行违法违规、危害网络安全的代码; 5. 如需使用旧版本(未下架),需联系浔川社团官方联合会; 6. 浔川社团官方联合会网址:https://xunchuanshetuan.blog.csdn.net/ 7. 本协议的最终解释权归软件开发者所有,如有更新将在启动时提示. c.execute(INSERT INTO user_protocol VALUES (?, ?, ?), (PROTOCOL_VERSION, default_protocol.strip(), datetime.now().strftime(%Y-%m-%d %H:%M:%S))) conn.commit() conn.close() # -------------------------- 工具函数 -------------------------- def md5_encrypt(s): m hashlib.md5() m.update(s.encode(utf-8)) return m.hexdigest() def db_query(sql, params()): conn sqlite3.connect(DB_FILE) c conn.cursor() c.execute(sql, params) result c.fetchall() conn.close() return result def db_execute(sql, params()): conn sqlite3.connect(DB_FILE) c conn.cursor() try: c.execute(sql, params) conn.commit() return True except sqlite3.IntegrityError: return False finally: conn.close() # -------------------------- 反馈功能 -------------------------- def save_feedback(title, content): try: if not os.path.exists(FEEDBACK_DIR): os.makedirs(FEEDBACK_DIR) user LOGGED_USER if LOGGED_USER else 游客 now datetime.now().strftime(%Y%m%d_%H%M%S) filename f{FEEDBACK_DIR}/反馈_{user}_{now}.txt with open(filename, w, encodingutf-8) as f: f.write(f软件版本:{SOFT_VERSION}\n) f.write(f用户身份:{user}\n) f.write(f反馈时间:{datetime.now().strftime(%Y-%m-%d %H:%M:%S)}\n) f.write(f反馈标题:{title}\n\n) f.write(f反馈内容:\n{content}\n) return True except: return False def show_feedback_window(parent): win tk.Toplevel(parent) win.title(用户反馈) win.geometry(500x400) win.resizable(False, False) win.transient(parent) win.grab_set() ttk.Label(win, text反馈标题, font(SimHei, 12)).pack(pady5) title_entry ttk.Entry(win, width50, font(, 11)) title_entry.pack(pady2) ttk.Label(win, text反馈内容(bug、建议、需求均可), font(SimHei, 12)).pack(pady5) content_text scrolledtext.ScrolledText(win, width60, height15, font(, 10)) content_text.pack(padx10, pady5) def submit(): title title_entry.get().strip() content content_text.get(1.0, tk.END).strip() if not title or not content: messagebox.showwarning(提示, 标题和内容不能为空!) return if save_feedback(title, content): messagebox.showinfo(成功, 反馈已提交,感谢你的支持!) win.destroy() else: messagebox.showerror(失败, 反馈保存失败,请重试!) ttk.Button(win, text提交反馈, commandsubmit, width15).pack(pady10) # -------------------------- 资源更新 -------------------------- def check_update(): try: response requests.get(UPDATE_API, timeout5) if response.status_code 200: update_data { latest_version: 1.1.0, current_version: SOFT_VERSION, update_content: 1. 新增Python语法高亮优化;2. 修复保存文件乱码问题;3. 新增字体大小一键调整;4. 优化登录状态持久化;5. 新增在线运行及代码运行功能., download_url: https://github.com/xxx/python-editor/archive/refs/tags/v1.1.0.zip } return update_data else: return None except Exception as e: return None def update_resource(): messagebox.showinfo(检查更新, 正在检测最新版本,请稍候...) update_info check_update() if not update_info: messagebox.showinfo(检查更新, 当前已是最新版本,或网络异常无法检测更新!) return def version2num(v): return list(map(int, v.split(.))) if version2num(update_info[latest_version]) version2num(SOFT_VERSION): messagebox.showinfo(检查更新, f当前已是最新版本(v{SOFT_VERSION}),无需更新!) return confirm messagebox.askyesno( 发现新版本, f检测到新版本:v{update_info[latest_version]}\n f当前版本:v{SOFT_VERSION}\n\n f更新内容:\n{update_info[update_content]}\n\n 是否前往下载更新包?(下载后请解压替换原文件并重启) ) if confirm: webbrowser.open(update_info[download_url]) # -------------------------- 用户协议 -------------------------- def show_protocol_window(parent, must_agreeFalse): protocol_win tk.Toplevel(parent) protocol_win.title(用户协议) protocol_win.geometry(600x500) protocol_win.resizable(False, False) protocol_win.transient(parent) protocol_win.grab_set() protocol_data db_query(SELECT content, version FROM user_protocol WHERE version?, (PROTOCOL_VERSION,)) if protocol_data: protocol_content protocol_data[0][0] protocol_version protocol_data[0][1] else: protocol_content 暂无协议内容 protocol_version 未知版本 ttk.Label(protocol_win, textf用户协议(版本:{protocol_version}), font(SimHei, 14, bold)).pack(pady10) protocol_text scrolledtext.ScrolledText(protocol_win, font(SimSun, 10), wraptk.WORD, statetk.NORMAL) protocol_text.insert(tk.END, protocol_content) protocol_text.config(statetk.DISABLED) protocol_text.pack(filltk.BOTH, expandTrue, padx20, pady5) btn_frame ttk.Frame(protocol_win) btn_frame.pack(pady10) def agree_action(): if must_agree and LOGGED_USER: user_id db_query(SELECT id FROM users WHERE username?, (LOGGED_USER,))[0][0] db_execute(UPDATE users SET agree_protocol1 WHERE id?, (user_id,)) protocol_win.destroy() def cancel_action(): protocol_win.destroy() if must_agree: global LOGGED_USER LOGGED_USER None parent.quit() messagebox.showwarning(提示, 您必须同意用户协议才能使用本软件!) ttk.Button(btn_frame, text同意, commandagree_action, width10).grid(row0, column0, padx20) if must_agree: ttk.Button(btn_frame, text拒绝, commandcancel_action, width10).grid(row0, column1) else: ttk.Button(btn_frame, text关闭, commandcancel_action, width10).grid(row0, column1) protocol_win.update_idletasks() parent_x parent.winfo_x() parent_y parent.winfo_y() parent_w parent.winfo_width() parent_h parent.winfo_height() win_w protocol_win.winfo_width() win_h protocol_win.winfo_height() x parent_x (parent_w - win_w) // 2 y parent_y (parent_h - win_h) // 2 protocol_win.geometry(f{x}{y}) # -------------------------- 注册登录 -------------------------- class LoginRegisterWindow: def __init__(self, root): self.root root self.root.title(f{SOFT_NAME} - 登录/注册) self.root.geometry(400x380) self.root.resizable(False, False) self.current_frame None self.create_widgets() self.show_login_frame() def create_widgets(self): self.main_frame ttk.Frame(self.root, padding20) self.main_frame.pack(filltk.BOTH, expandTrue) ttk.Label(self.main_frame, textSOFT_NAME, font(SimHei, 18, bold)).pack(pady10) ttk.Label(self.main_frame, textf版本:v{SOFT_VERSION}, font(SimHei, 10)).pack(pady5) def clear_frame(self): if self.current_frame: self.current_frame.destroy() self.current_frame ttk.Frame(self.main_frame) self.current_frame.pack(filltk.BOTH, expandTrue, pady20) def show_login_frame(self): self.clear_frame() ttk.Label(self.current_frame, text用户名:).grid(row0, column0, stickytk.W, pady10) self.login_user ttk.Entry(self.current_frame, width25) self.login_user.grid(row0, column1, pady10) ttk.Label(self.current_frame, text密 码:).grid(row1, column0, stickytk.W, pady10) self.login_pwd ttk.Entry(self.current_frame, width25, show*) self.login_pwd.grid(row1, column1, pady10) ttk.Button(self.current_frame, text登录, commandself.login, width15).grid(row2, column0, columnspan2, pady8) ttk.Button(self.current_frame, text游客体验, commandself.guest_mode, width15).grid(row3, column0, columnspan2, pady8) ttk.Label(self.current_frame, text还没有账号?).grid(row4, column0, stickytk.E) ttk.Button(self.current_frame, text立即注册, commandself.show_register_frame, styleLink.TButton).grid(row4, column1, stickytk.W) self.root.style ttk.Style() self.root.style.configure(Link.TButton, borderwidth0, foreground#0000FF) def show_register_frame(self): self.clear_frame() ttk.Label(self.current_frame, text用户名:).grid(row0, column0, stickytk.W, pady8) self.reg_user ttk.Entry(self.current_frame, width25) self.reg_user.grid(row0, column1, pady8) ttk.Label(self.current_frame, text密 码:).grid(row1, column0, stickytk.W, pady8) self.reg_pwd ttk.Entry(self.current_frame, width25, show*) self.reg_pwd.grid(row1, column1, pady8) ttk.Label(self.current_frame, text确认密码:).grid(row2, column0, stickytk.W, pady8) self.reg_pwd2 ttk.Entry(self.current_frame, width25, show*) self.reg_pwd2.grid(row2, column1, pady8) ttk.Button(self.current_frame, text注册, commandself.register, width15).grid(row3, column0, columnspan2, pady15) ttk.Label(self.current_frame, text已有账号?).grid(row4, column0, stickytk.E) ttk.Button(self.current_frame, text立即登录, commandself.show_login_frame, styleLink.TButton).grid(row4, column1, stickytk.W) def login(self): username self.login_user.get().strip() password self.login_pwd.get().strip() if not username or not password: messagebox.showwarning(提示, 用户名和密码不能为空!) return pwd_md5 md5_encrypt(password) user_data db_query(SELECT id, agree_protocol FROM users WHERE username? AND password?, (username, pwd_md5)) if not user_data: messagebox.showerror(错误, 用户名或密码错误!) return global LOGGED_USER, IS_GUEST LOGGED_USER username IS_GUEST False user_id, agree_protocol user_data[0] if not db_query(SELECT * FROM editor_config WHERE user_id?, (user_id,)): db_execute(INSERT INTO editor_config (user_id, font, font_size) VALUES (?, ?, ?), (user_id, DEFAULT_FONT[0], DEFAULT_FONT[1])) if agree_protocol 0: show_protocol_window(self.root, must_agreeTrue) self.root.destroy() main_editor tk.Tk() CodeEditor(main_editor) main_editor.mainloop() def register(self): username self.reg_user.get().strip() password self.reg_pwd.get().strip() password2 self.reg_pwd2.get().strip() if not username or not password: messagebox.showwarning(提示, 用户名和密码不能为空!) return if len(username) 3 or len(password) 6: messagebox.showwarning(提示, 用户名至少3位,密码至少6位!) return if password ! password2: messagebox.showwarning(提示, 两次输入的密码不一致!) return pwd_md5 md5_encrypt(password) reg_time datetime.now().strftime(%Y-%m-%d %H:%M:%S) success db_execute( INSERT INTO users (username, password, reg_time) VALUES (?, ?, ?), (username, pwd_md5, reg_time) ) if success: messagebox.showinfo(成功, 注册成功!请登录使用~) self.show_login_frame() else: messagebox.showerror(错误, 用户名已存在!) def guest_mode(self): global IS_GUEST, LOGGED_USER IS_GUEST True LOGGED_USER None self.root.destroy() main_editor tk.Tk() CodeEditor(main_editor) main_editor.mainloop() # -------------------------- 代码编辑器 -------------------------- class CodeEditor: def __init__(self, root): self.root root self.file_path None self.user_id None self.is_guest IS_GUEST if self.is_guest: self.root.title(f{SOFT_NAME} - 未命名文件 - 游客模式) else: self.root.title(f{SOFT_NAME} - 未命名文件 - 登录用户:{LOGGED_USER}) self.root.geometry(800x600) self.font DEFAULT_FONT if not self.is_guest: self.user_id db_query(SELECT id FROM users WHERE username?, (LOGGED_USER,))[0][0] self.load_user_config() self.create_menu() self.create_editor() self.bind_shortcuts() self.root.protocol(WM_DELETE_WINDOW, self.on_closing) def load_user_config(self): if self.is_guest: return config db_query(SELECT font, font_size, win_size FROM editor_config WHERE user_id?, (self.user_id,))[0] self.font (config[0], config[1]) self.win_size config[2] self.root.geometry(self.win_size) def save_user_config(self): if self.is_guest: return win_size f{self.root.winfo_width()}x{self.root.winfo_height()} db_execute( UPDATE editor_config SET font?, font_size?, win_size? WHERE user_id?, (self.font[0], self.font[1], win_size, self.user_id) ) def create_menu(self): menubar tk.Menu(self.root) self.root.config(menumenubar) # 文件 file_menu tk.Menu(menubar, tearoff0) file_menu.add_command(label新建, commandself.new_file, acceleratorCtrlN) file_menu.add_command(label打开, commandself.open_file, acceleratorCtrlO) file_menu.add_command(label保存, commandself.save_file, acceleratorCtrlS) file_menu.add_command(label另存, commandself.save_as_file, acceleratorCtrlShiftS) file_menu.add_separator() file_menu.add_command(label安全退出, commandself.on_closing) menubar.add_cascade(label文件, menufile_menu) # 编辑 edit_menu tk.Menu(menubar, tearoff0) edit_menu.add_command(label撤销, commandlambda: self.text_editor.edit_undo(), acceleratorCtrlZ) edit_menu.add_command(label重做, commandlambda: self.text_editor.edit_redo(), acceleratorCtrlY) edit_menu.add_separator() edit_menu.add_command(label全选, commandlambda: self.text_editor.tag_add(tk.SEL, 1.0, tk.END), acceleratorCtrlA) edit_menu.add_command(label复制, commandlambda: self.text_editor.event_generate(Copy), acceleratorCtrlC) edit_menu.add_command(label剪切, commandlambda: self.text_editor.event_generate(Cut), acceleratorCtrlX) edit_menu.add_command(label粘贴, commandlambda: self.text_editor.event_generate(Paste), acceleratorCtrlV) menubar.add_cascade(label编辑, menuedit_menu) # 视图 view_menu tk.Menu(menubar, tearoff0) view_menu.add_command(label增大字体, commandself.increase_font, acceleratorCtrl) view_menu.add_command(label减小字体, commandself.decrease_font, acceleratorCtrl-) menubar.add_cascade(label视图, menuview_menu) # 代码运行 run_menu tk.Menu(menubar, tearoff0) run_menu.add_command(label运行代码, commandself.run_code) menubar.add_cascade(label代码运行, menurun_menu) # 在线运行 online_run_menu tk.Menu(menubar, tearoff0) online_run_menu.add_command(label运行Python代码, commandself.run_python_online) online_run_menu.add_command(label运行C代码, commandself.run_cpp_online) menubar.add_cascade(label在线运行, menuonline_run_menu) # AI 对话(直接菜单打开,100%可用) ai_menu tk.Menu(menubar, tearoff0) ai_menu.add_command(label豆包, commandlambda: webbrowser.open(https://www.doubao.com/)) ai_menu.add_command(labelDeepSeek, commandlambda: webbrowser.open(https://www.deepseek.com/)) ai_menu.add_command(label文心一言, commandlambda: webbrowser.open(https://yiyan.baidu.com/welcome)) menubar.add_cascade(labelAI对话, menuai_menu) # # 帮助 help_menu tk.Menu(menubar, tearoff0) help_menu.add_command(label检查更新, commandupdate_resource) help_menu.add_command(label我要反馈, commandlambda: show_feedback_window(self.root)) help_menu.add_command(label用户协议, commandlambda: show_protocol_window(self.root, must_agreeFalse)) help_menu.add_command(label关于软件, commandself.show_about) menubar.add_cascade(label帮助, menuhelp_menu) def run_code(self): messagebox.showinfo(提示, 本代码编辑器版本暂不支持运行功能,请选择在线运行功能!) def run_python_online(self): webbrowser.open(https://www.jyshare.com/compile/9/) def run_cpp_online(self): webbrowser.open(https://www.jyshare.com/compile/12/) def create_editor(self): editor_frame ttk.Frame(self.root) editor_frame.pack(filltk.BOTH, expandTrue) self.line_num tk.Text(editor_frame, width4, fontself.font, statetk.NORMAL, bg#F0F0F0, wraptk.NONE) self.line_num.pack(sidetk.LEFT, filltk.Y) self.line_num.config(statetk.DISABLED) self.text_editor scrolledtext.ScrolledText(editor_frame, fontself.font, wraptk.NONE, undoTrue, maxundo-1) self.text_editor.pack(sidetk.LEFT, filltk.BOTH, expandTrue) self.text_editor.focus_set() for tag, color in HIGHLIGHT_COLORS.items(): self.text_editor.tag_configure(tag, foregroundcolor) self.text_editor.bind(KeyRelease, self.update_editor) self.text_editor.bind(MouseRelease, self.update_editor) self.text_editor.bind(Configure, self.update_editor) self.update_line_num() def bind_shortcuts(self): self.root.bind(Control-n, lambda e: self.new_file()) self.root.bind(Control-o, lambda e: self.open_file()) self.root.bind(Control-s, lambda e: self.save_file()) self.root.bind(Control-Shift-S, lambda e: self.save_as_file()) self.root.bind(Control-plus, lambda e: self.increase_font()) self.root.bind(Control-minus, lambda e: self.decrease_font()) def update_line_num(self): line_count int(self.text_editor.index(tk.END).split(.)[0]) - 1 self.line_num.config(statetk.NORMAL) self.line_num.delete(1.0, tk.END) self.line_num.insert(tk.END, \n.join(map(str, range(1, line_count 1)))) self.line_num.config(statetk.DISABLED) def syntax_highlight(self): for tag in HIGHLIGHT_COLORS.keys(): self.text_editor.tag_remove(tag, 1.0, tk.END) content self.text_editor.get(1.0, tk.END) lines content.split(\n) for line_idx, line in enumerate(lines): line_num line_idx 1 pos 0 while pos len(line): if line[pos] #: self.text_editor.tag_add(comment, f{line_num}.{pos}, f{line_num}.end) break elif line[pos] in (, ): quote line[pos] end_pos line.find(quote, pos 1) if end_pos ! -1: self.text_editor.tag_add(string, f{line_num}.{pos}, f{line_num}.{end_pos1}) pos end_pos 1 else: pos 1 elif line[pos].isdigit() or (line[pos] - and pos1 len(line) and line[pos1].isdigit()): end_pos pos while end_pos len(line) and (line[end_pos].isdigit() or line[end_pos] .): end_pos 1 self.text_editor.tag_add(number, f{line_num}.{pos}, f{line_num}.{end_pos}) pos end_pos elif line[pos].isalpha() or line[pos] _: end_pos pos while end_pos len(line) and (line[end_pos].isalnum() or line[end_pos] _): end_pos 1 word line[pos:end_pos] if word in PYTHON_KEYWORDS: self.text_editor.tag_add(keyword, f{line_num}.{pos}, f{line_num}.{end_pos}) pos end_pos else: pos 1 def update_editor(self, eventNone): self.update_line_num() self.syntax_highlight() def new_file(self): if self.check_unsaved(): self.text_editor.delete(1.0, tk.END) self.file_path None if self.is_guest: self.root.title(f{SOFT_NAME} - 未命名文件 - 游客模式) else: self.root.title(f{SOFT_NAME} - 未命名文件 - 登录用户:{LOGGED_USER}) def open_file(self): if self.check_unsaved(): file_path filedialog.askopenfilename( title打开文件, filetypes[(Python文件, *.py), (文本文件, *.txt), (所有文件, *.*)] ) if file_path: self.file_path file_path with open(file_path, r, encodingutf-8) as f: content f.read() self.text_editor.delete(1.0, tk.END) self.text_editor.insert(1.0, content) if self.is_guest: self.root.title(f{SOFT_NAME} - {os.path.basename(file_path)} - 游客模式) else: self.root.title(f{SOFT_NAME} - {os.path.basename(file_path)} - 登录用户:{LOGGED_USER}) def save_file(self): if not self.file_path: self.save_as_file() else: content self.text_editor.get(1.0, tk.END) with open(self.file_path, w, encodingutf-8) as f: f.write(content) messagebox.showinfo(成功, 文件保存成功!) def save_as_file(self): file_path filedialog.asksaveasfilename( title另存为, defaultextension.py, filetypes[(Python文件, *.py), (文本文件, *.txt), (所有文件, *.*)] ) if file_path: self.file_path file_path self.save_file() if self.is_guest: self.root.title(f{SOFT_NAME} - {os.path.basename(file_path)} - 游客模式) else: self.root.title(f{SOFT_NAME} - {os.path.basename(file_path)} - 登录用户:{LOGGED_USER}) def increase_font(self): new_size self.font[1] 2 self.font (self.font[0], new_size) self.text_editor.config(fontself.font) self.line_num.config(fontself.font) self.save_user_config() def decrease_font(self): if self.font[1] 10: new_size self.font[1] - 2 self.font (self.font[0], new_size) self.text_editor.config(fontself.font) self.line_num.config(fontself.font) self.save_user_config() def check_unsaved(self): content self.text_editor.get(1.0, tk.END).strip() if content and not self.file_path: confirm messagebox.askyesno(提示, 当前有未保存的内容,是否放弃?) return confirm return True def show_about(self): about_info f {SOFT_NAME} 版本:v{SOFT_VERSION} 开发语言:Python Tkinter 数据库:SQLite3 功能:代码编辑(运行)/AI对话/资源更新/AI辅助/用户反馈 本软件为免费开源工具,仅供学习使用! 更新时间:2026-05-02 messagebox.showinfo(关于软件, about_info.strip()) def on_closing(self): if self.check_unsaved(): self.save_user_config() self.root.destroy() sys.exit() # -------------------------- 程序入口 -------------------------- if __name__ __main__: init_database() login_root tk.Tk() LoginRegisterWindow(login_root) login_root.mainloop()

相关文章:

浔川代码编辑器 v4.1.0 正式版重磅上线!AI 加持,轻量高效,开箱即用

浔川代码编辑器 v4.1.0 正式版重磅上线!AI 加持,轻量高效,开箱即用基于 Python Tkinter SQLite3 深度打磨,浔川代码编辑器 v4.1.0 正式版今日全面发布!本次迭代全面整合内测优化成果,AI 助手、在线运行、…...

NS-USBLoader完整教程:Switch文件传输与RCM注入一站式解决方案

NS-USBLoader完整教程:Switch文件传输与RCM注入一站式解决方案 【免费下载链接】ns-usbloader Awoo Installer and GoldLeaf uploader of the NSPs (and other files), RCM payload injector, application for split/merge files. 项目地址: https://gitcode.com/…...

企业微信官方API不够用时,还有别的实现方式吗?

一、核心概念:企业微信 iPad 协议是什么?从技术角度看,大家常说的“企业微信 iPad 协议”,可以理解为一种:基于客户端通信逻辑抽象出来的接口方式。简单说就是:企业微信 iPad 端本身在运行时,会…...

数据驱动VS物理模型:随机森林在电动汽车跟驰行为预测中的精度革命

1. 项目概述与核心价值在智能交通和自动驾驶技术快速发展的今天,如何精准地模拟和预测道路上车辆的跟驰行为,成为了一个既基础又关键的研究课题。无论是为了设计更安全的辅助驾驶系统,还是为了构建更真实的交通流仿真环境,一个可靠…...

Java + Spring Boot 操作 Kafka 完整学习指南

前置条件:ZooKeeper 集群 Kafka 集群已启动(3个ZK节点 3个Broker) Broker 地址:172.17.0.7:9092, 172.17.0.7:9093, 172.17.0.7:9094第一阶段:原生 Java API 操作 Kafka目的:理解底层原理,Spr…...

深入 QEMU 热迁移

深入 QEMU 热迁移:从状态机到数据平面的全链路剖析 “把一台正在运行的虚拟机从一台主机搬到另一台,还让里面的操作系统浑然不觉——这听起来像魔法,实则是精密的工程。” 引言 实时迁移是 QEMU 最核心的子系统之一。它允许将一个正在运行的…...

BetterJoy终极配置指南:让Switch手柄在电脑上完美运行

BetterJoy终极配置指南:让Switch手柄在电脑上完美运行 【免费下载链接】BetterJoy Allows the Nintendo Switch Pro Controller, Joycons and SNES controller to be used with CEMU, Citra, Dolphin, Yuzu and as generic XInput 项目地址: https://gitcode.com/…...

git--github

解决github无法访问的问题。...

vi与vim在openEuler中的差异及应用

openEuler两代系统命令差异与原理对比 1. 核心命令体系差异对比 对比维度传统Linux/早期openEuler (Vi模式)现代openEuler (Vim增强模式)核心编辑器vi (Visual Interface) 基础版vim (Vi IMproved) 增强版安装方式通常预装或通过yum install vi需手动安装yum install vim或dn…...

RAG 架构在网文创作中的应用:以茄子写作助手为例

当创作者遇上大模型作为一名既写代码又写小说的“斜杠青年”,我一直对 AI 在内容生成领域的应用保持着高度关注。传统的 LLM(大型语言模型)在长文本创作中存在两个致命弱点:上下文窗口限制导致的“失忆”问题,以及通用…...

手把手教你无损转换:把老电脑的Legacy启动盘改成UEFI+GPT(附DiskGenius操作截图)

老电脑焕新指南:从Legacy到UEFIGPT的无损迁移实战当你的老电脑开机速度越来越慢,或者被Windows 11的安装要求拒之门外时,很可能是因为它还在使用传统的Legacy启动方式和MBR分区表。本文将带你深入了解这两种启动方式的区别,并手把…...

智慧树自动刷课插件:3步安装指南,彻底解放学习时间

智慧树自动刷课插件:3步安装指南,彻底解放学习时间 【免费下载链接】zhihuishu 智慧树刷课插件,自动播放下一集、1.5倍速度、无声 项目地址: https://gitcode.com/gh_mirrors/zh/zhihuishu 还在为智慧树平台重复性的视频学习任务而烦恼…...

Token经济学正在重构芯片工程师的生存逻辑(万字长文深度拆解“token“这个计量单位的对于芯片工程师的意义)

英伟达CEO黄仁勋把AI产业分成五层:能源、芯片、基础设施、模型、应用。芯片在第二层,属于重资产制造业的核心环节。但问题来了,在 芯片(包括AI芯片)成本内卷时代,芯片工程师的技术,到底还能值多…...

以书香润心,借坚韧前行

一书一山海,一心一乾坤。身处车马喧嚣的世间,我们时常被生活的压力裹挟,被前路的未知困扰,在重复的日常里消磨热忱,在跌宕的波折中心生怯懦。而书籍,是治愈心灵、滋养成长的最好良方,于无声处给…...

从CentOS迁移到openEuler?手把手教你在vSphere ESXi 7.0上搭建测试环境

从CentOS迁移到openEuler:vSphere ESXi 7.0测试环境全指南当企业技术栈面临升级换代时,系统管理员往往需要在不影响生产环境的前提下进行充分验证。对于长期依赖CentOS/RHEL生态的用户而言,openEuler作为国产开源操作系统的代表,正…...

避坑指南:在openEuler 22.03上配置vsftpd虚拟用户,解决gdbm数据库和SELinux权限问题

openEuler 22.03虚拟用户FTP配置实战:从gdbm数据库到SELinux的完整解决方案当你在openEuler 22.03上尝试配置vsftpd虚拟用户时,是否遇到过这样的场景:按照CentOS教程一步步操作,却在PAM认证阶段卡壳,系统不断提示"…...

3.RAG

一、RAG初识: RAG(Retrieval-Augmented Generation,检索增强生成)是一种将 信息检索与文本生成 相结合的技术框架。它通过以下流程解决大模型(LLM)的“知识盲区”问题: 用户问题->从知识库检索相关文档->将文档作为上下文输入LLM->生成精准答…...

字节校招7000人转正率50%:大厂HR体系,正在“去经验化“

字节跳动刚刚用一组校招数据,扯下了大厂老兵最后一块遮羞布。 2026年春,ByteIntern规模狂飙至7000人,转正率史无前例地超过50%。 短短3到6个月,字节用远低于市场价的成本,批量生产出了3500个能够直接上岗的替代者。 同样的薪酬包,大厂宁愿招两个高潜应届生,也不愿意留…...

2026年学习Java还有前景吗?如何看待2026Java程序员就业难现状?

2026年Java的前景和就业情况,这是一个很现实的问题。我们直接来看核心。Java依然有前景,但“普通选手”的就业黄金期确实过去了,现在需要的是“高配选手”。所谓的“就业难”,本质不是Java不行了,而是行业对Java程序员…...

从 Session 到 JWT:Web 认证系统的发展与 JWT 原理详解

文章目录 前言一、Web 认证系统的发展史1.第一代认证方案:Cookie Session2.Session 方案的问题开始出现1. Session 存储压力大2. 分布式系统难处理3. 移动端时代到来 二、JWT 是什么三、JWT 的结构到底长什么样1.第一部分:Header(头部&#…...

匿名内部类的使用场景 java反射机制

一、匿名内部类的使用场景匿名内部类是一种没有显式类名、直接在创建对象时定义并实例化的内部类。它通常用于“一次性使用”的场景,让代码更简洁紧凑。主要使用场景包括:1. 事件监听器(GUI 编程)在 Swing、AWT 或 Android 开发中…...

小小屠龙原始火龙手游官网下载:小小屠龙原始火龙最新官方下载渠道

《小小屠龙原始火龙》又名《赤血火龙单职业》《龙城秘境移动版》,是由安徽游昕联合忆往游戏运营的正版 1.80 火龙复刻 MMORPG 手游。1:1 复刻比奇、盟重土城、祖玛寺庙、赤月峡谷、火龙神殿等经典场景,创新融合战法道三职业核心能力的单职业体系&#xf…...

IwaraDownloadTool:简单快速的Iwara视频下载神器

IwaraDownloadTool:简单快速的Iwara视频下载神器 【免费下载链接】IwaraDownloadTool Iwara 下载工具 | Iwara Downloader 项目地址: https://gitcode.com/gh_mirrors/iw/IwaraDownloadTool 你是否经常在Iwara平台发现精彩的视频内容,却苦于无法轻…...

Codex适配国产信创环境安装部署与技术适配全解析

随着国家信创产业持续落地推进,党政、金融、能源、工业等关键行业全面开启信息技术软硬件国产化替代工作。基于自主可控、安全可信的核心需求,传统国外架构软硬件体系逐步被国产操作系统、国产芯片硬件替代。Codex作为主流的智能代码辅助、自动化开发工具…...

FPGA在遥感机器学习中的优势与优化实践

1. FPGA在遥感机器学习中的核心优势解析 FPGA(现场可编程门阵列)在边缘计算场景中展现出独特的价值主张。与通用处理器不同,FPGA通过硬件级并行架构实现两个关键突破:首先是数据流驱动的计算模式,消除传统冯诺依曼架构…...

数据集上新:柬埔寨环境健康入户调查

本数据集基于柬埔寨马德望省约400户家庭的环境健康入户调查而成,包括基本社会经济信息、家庭成员结构、呼吸道健康信息、其他健康信息(包括部分测量信息)、营养信息、清洁炉灶和燃料使用、风险和时间偏好、调查员自观察信息等数百条子数据。如…...

卷积神经网络(CNN)与深度学习视觉应用综述

在深度学习领域,卷积神经网络(CNN)是实现计算机视觉任务的基石。通过对这些基础理论的学习,我们能够构建起从特征提取到复杂场景理解的知识体系。第一部分:卷积神经网络基础1. 全连接网络面临的挑战传统的全连接神经网…...

3分钟快速修复洛雪音乐播放问题:六音音源完整指南

3分钟快速修复洛雪音乐播放问题:六音音源完整指南 【免费下载链接】New_lxmusic_source 六音音源修复版 项目地址: https://gitcode.com/gh_mirrors/ne/New_lxmusic_source 你是否曾经在升级洛雪音乐后,发现心爱的歌单突然变成了灰色,…...

Go语言竞态检测:race条件

Go语言竞态检测:race条件 1. race检测 go test -race ./...2. 总结 -race检测器可以发现代码中的数据竞争。...

window11 恢复右键刷新

新建文本文档,粘贴下方代码,后缀改成 **.bat**,右键以管理员身份运行即可一键恢复传统右键菜单echo off reg add "HKCU\Software\Classes\CLSID\{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}\InprocServer32" /f /ve taskkill /f /im e…...