使用Python实现一个网址管理小工具

 更新时间:2025年10月31日 09:17:50   作者:学习&实践爱好者  
这篇文章主要介绍了如何使用Python实现一个网址管理小工具,主要用途是帮助用户整理、存储和快速访问常用网站信息,适合需要管理多个常用网站的用户,相当于一个个性化的 网站收藏夹,比浏览器自带收藏夹更灵活,需要的朋友可以参考下

这个程序是一个网址管理工具,主要用途是帮助用户整理、存储和快速访问常用网站信息,具体功能包括:

  • 集中管理网站信息:可记录网站名称、URL 地址和备注(如网站用途、账号信息等),避免零散记忆或查找的麻烦。
  • 便捷操作:支持添加、编辑、删除网站信息,选中网站后可直接在浏览器中打开。
  • 数据本地保存:所有信息存储在本地 JSON 文件中,无需联网,保护隐私且数据不会丢失(除非手动删除文件)。

适合需要管理多个常用网站(如学习平台、工作工具、常用服务等)的用户,相当于一个个性化的 “网站收藏夹”,比浏览器自带收藏夹更灵活(可添加自定义备注)。

特别说明:第一次运行时,由于websites.json不存在,会自动加载预设的默认网站数据。当新增、编辑、删除网站,会于当前目录下建立本地文件:websites.json。之后就会加载使用websites.json的数据。

本程序需要的模块tkinter、webbrowser、json、os是 Python 默认包含的基础库,安装 Python 时已自动附带,无需额外安装。

运行界面如下:

源码如下:

import tkinter as tk
from tkinter import ttk, messagebox   #, scrolledtext
import webbrowser
import json
import os
 
class WebsiteManager:
    def __init__(self, root):
        self.root = root
        self.root.title("网址管理器")
        self.root.geometry("900x600")  # 增加宽度以容纳备注列
        
        # 存储网站数据
        self.websites = []
        
        # 加载保存的数据
        self.load_data()
        
        # 创建界面
        self.create_widgets()
        
    def create_widgets(self):
        # 顶部标题
        title_label = tk.Label(self.root, text="网址管理器", font=("Arial", 16, "bold"))
        title_label.pack(pady=10)
        
        # 允许编辑复选框
        self.edit_var = tk.BooleanVar()
        self.edit_check = tk.Checkbutton(self.root, text="允许编辑", variable=self.edit_var, 
                                        command=self.toggle_editing)
        self.edit_check.pack(anchor="w", padx=20)
        
        # 输入区域框架
        input_frame = tk.Frame(self.root)
        input_frame.pack(fill="x", padx=20, pady=10)
        
        # 网站名称
        tk.Label(input_frame, text="网站名称:").grid(row=0, column=0, sticky="w", pady=5)
        self.name_entry = tk.Entry(input_frame, width=42)
        self.name_entry.grid(row=0, column=1, sticky="w", pady=5, padx=5)
        
        # URL
        tk.Label(input_frame, text="URL:").grid(row=1, column=0, sticky="w", pady=5)
        self.url_entry = tk.Entry(input_frame, width=84)
        self.url_entry.grid(row=1, column=1, sticky="w", pady=5, padx=5)
        
        # 备注
        tk.Label(input_frame, text="备注").grid(row=2, column=0, sticky="nw", pady=5)
        # self.notes_text = scrolledtext.ScrolledText(input_frame, width=30, height=4)
        self.notes_text = tk.Entry(input_frame, width=84)
        self.notes_text.grid(row=2, column=1, sticky="w", pady=5, padx=5)
        
        # 网站列表框架
        list_frame = tk.Frame(self.root)
        list_frame.pack(fill="both", expand=True, padx=20, pady=10)
        
        # 创建Treeview来显示网站列表,增加备注列
        columns = ("名称", "URL", "备注")  # 增加备注列
        self.website_list = ttk.Treeview(list_frame, columns=columns, show="headings", height=10)
        
        # 设置列标题
        self.website_list.heading("名称", text="网址名称")
        self.website_list.heading("URL", text="URL")
        self.website_list.heading("备注", text="备注")  # 增加备注列标题
        
        # 设置列宽,调整宽度总和超过列表框宽度以激活水平滚动
        self.website_list.column("名称", width=150, minwidth=150)
        self.website_list.column("URL", width=450, minwidth=450)
        self.website_list.column("备注", width=400, minwidth=400)  # 增加备注列
        
        # 添加滚动条
        v_scrollbar = ttk.Scrollbar(list_frame, orient="vertical", command=self.website_list.yview)
        h_scrollbar = ttk.Scrollbar(list_frame, orient="horizontal", command=self.website_list.xview)
        self.website_list.configure(yscrollcommand=v_scrollbar.set, xscrollcommand=h_scrollbar.set)
        
        # 布局Treeview和滚动条
        self.website_list.grid(row=0, column=0, sticky="nsew")
        v_scrollbar.grid(row=0, column=1, sticky="ns")
        h_scrollbar.grid(row=1, column=0, sticky="ew")
        
        # 配置网格权重
        list_frame.grid_rowconfigure(0, weight=1)
        list_frame.grid_columnconfigure(0, weight=1)
        
        # 绑定选择事件
        self.website_list.bind("<<TreeviewSelect>>", self.on_select)
        
        # 按钮框架
        button_frame = tk.Frame(self.root)
        button_frame.pack(fill="x", padx=20, pady=10)
        
        # 左侧按钮
        tk.Button(button_frame, text="打开选定网站", command=self.open_website).pack(side="left", padx=5)
        tk.Button(button_frame, text="清空", command=self.clear_fields).pack(side="left", padx=5)
        tk.Button(button_frame, text="帮助", command=self.show_help).pack(side="left", padx=5)
        
        # 右侧按钮
        tk.Button(button_frame, text="添加", command=self.add_website).pack(side="right", padx=5)
        tk.Button(button_frame, text="编辑", command=self.edit_website).pack(side="right", padx=5)
        tk.Button(button_frame, text="删除", command=self.delete_website).pack(side="right", padx=5)
        
        # 初始化网站列表
        self.refresh_list()
        
        # 初始状态设置为不可编辑
        self.toggle_editing()
        
    def toggle_editing(self):
        state = "normal" if self.edit_var.get() else "disabled"
        self.name_entry.config(state=state)
        self.url_entry.config(state=state)
        self.notes_text.config(state=state)
        
    def on_select(self, event):
        selected = self.website_list.selection()
        if selected:
            item = selected[0]
            values = self.website_list.item(item, "values")
            # 调整查询条件,包含备注字段
            website = next((w for w in self.websites if w["name"] == values[0] and w["url"] == values[1]), None)
            if website:
                self.name_entry.config(state="normal")
                self.url_entry.config(state="normal")
                self.notes_text.config(state="normal")
                
                self.name_entry.delete(0, tk.END)
                self.name_entry.insert(0, website["name"])
                
                self.url_entry.delete(0, tk.END)
                self.url_entry.insert(0, website["url"])
                
                #self.notes_text.delete(1.0, tk.END)
                #self.notes_text.insert(1.0, website.get("notes", ""))
                self.notes_text.delete(0, tk.END)
                self.notes_text.insert(0, website["notes"])
                
                self.toggle_editing()
                
    def clear_fields(self):
        self.name_entry.delete(0, tk.END)
        self.url_entry.delete(0, tk.END)
        #self.notes_text.delete(1.0, tk.END)
        self.notes_text.delete(0, tk.END)
        
    def open_website(self):
        selected = self.website_list.selection()
        if selected:
            item = selected[0]
            url = self.website_list.item(item, "values")[1]
            webbrowser.open(url)
        else:
            messagebox.showwarning("警告", "请先选择一个网站")
            
    def add_website(self):
        name = self.name_entry.get().strip()
        url = self.url_entry.get().strip()
        #notes = self.notes_text.get(1.0, tk.END).strip()
        notes = self.notes_text.get().strip()
        
        if not name or not url:
            messagebox.showwarning("警告", "网站名称和URL不能为空")
            return
            
        # 检查URL是否已存在
        if any(w["url"] == url for w in self.websites):
            messagebox.showwarning("警告", "该URL已存在")
            return
            
        self.websites.append({
            "name": name,
            "url": url,
            "notes": notes
        })
        
        self.refresh_list()
        self.clear_fields()
        self.save_data()
        messagebox.showinfo("成功", "网站已添加")
        
    def edit_website(self):
        selected = self.website_list.selection()
        if not selected:
            messagebox.showwarning("警告", "请先选择一个网站进行编辑")
            return
            
        name = self.name_entry.get().strip()
        url = self.url_entry.get().strip()
        notes = self.notes_text.get(1.0, tk.END).strip()
        
        if not name or not url:
            messagebox.showwarning("警告", "网站名称和URL不能为空")
            return
            
        item = selected[0]
        old_values = self.website_list.item(item, "values")
        old_url = old_values[1]
        
        # 检查URL是否已存在(排除自己)
        if any(w["url"] == url and w["url"] != old_url for w in self.websites):
            messagebox.showwarning("警告", "该URL已存在")
            return
            
        # 更新网站信息
        for website in self.websites:
            if website["url"] == old_url:
                website["name"] = name
                website["url"] = url
                website["notes"] = notes
                break
                
        self.refresh_list()
        self.save_data()
        messagebox.showinfo("成功", "网站信息已更新")
        
    def delete_website(self):
        selected = self.website_list.selection()
        if not selected:
            messagebox.showwarning("警告", "请先选择一个网站")
            return
            
        if messagebox.askyesno("确认", "确定要删除选定的网站吗?"):
            item = selected[0]
            url = self.website_list.item(item, "values")[1]
            
            # 从列表中删除
            self.websites = [w for w in self.websites if w["url"] != url]
            
            self.refresh_list()
            self.clear_fields()
            self.save_data()
            messagebox.showinfo("成功", "网站已删除")
            
    def refresh_list(self):
        # 清空列表
        for item in self.website_list.get_children():
            self.website_list.delete(item)
            
        # 添加网站到列表,包含备注信息
        for website in self.websites:
            self.website_list.insert("", "end", values=(
                website["name"], 
                website["url"], 
                website.get("notes", "")  # 增加备注显示
            ))
            
    def show_help(self):
        help_text = """
网站管理器使用说明:
1. 勾选"允许编辑"复选框后,可以编辑网站名称、URL和备注字段
2. 在右侧列表中选择一个网站,其信息将显示在左侧
3. 点击"打开选定网站"将在浏览器中打开选中的网站
4. 点击"清空"将清除所有输入字段
5. 点击"添加"将新网站添加到列表中(URL不能重复)
6. 点击"编辑"将修改选中的网站信息
7. 点击"删除"将从列表中移除选中的网站
注意:第一次运行时,由于websites.json不存在,会自动加载预设的默认网站数据。当新增、编辑、删除网站,会于当前目录下建立本地文件:websites.json。之后就会加载使用websites.json的数据。
        """
        messagebox.showinfo("帮助", help_text)
        
    def save_data(self):
        with open("websites.json", "w", encoding="utf-8") as f:
            json.dump(self.websites, f, ensure_ascii=False, indent=2)
            
    def load_data(self):
        # 如果文件存在,加载数据
        if os.path.exists("websites.json"):
            try:
                with open("websites.json", "r", encoding="utf-8") as f:
                    self.websites = json.load(f)
            except:
                # 若文件损坏或格式错误,初始化空列表
                self.websites = []
        else:
            # 否则使用默认数据
            self.websites = [
                {"name": "百度AI", "url": "https://chat.baidu.com", "notes": "百度智能对话平台"},
                {"name": "deepseekAI", "url": "https://chat.deepseek.com", "notes": "深度求索deepseekAI网页版入口 "},
                {"name": "豆包AI", "url": "https://www.doubao.com/chat", "notes": "字节跳动旗下AI 助手网页版入口"},
                {"name": "B站", "url": "https://www.bilibili.com", "notes": "视频分享平台,有很多学习资源"}
            ]
 
if __name__ == "__main__":
    root = tk.Tk()
    app = WebsiteManager(root)
    root.mainloop()

到此这篇关于使用Python实现一个网址管理小工具的文章就介绍到这了,更多相关Python网址管理工具内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • python使用正则表达式匹配反斜杠\遇到的问题

    python使用正则表达式匹配反斜杠\遇到的问题

    在学习Python正则式的过程中,有一个问题一直困扰我,如何去匹配一个反斜杠(即“\”),下面这篇文章主要给大家介绍了关于python使用正则表达式匹配反斜杠\的相关资料,需要的朋友可以参考下
    2022-09-09
  • 使用pandas read_table读取csv文件的方法

    使用pandas read_table读取csv文件的方法

    今天小编就为大家分享一篇使用pandas read_table读取csv文件的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-07-07
  • Centos下实现安装Python3.6和Python2共存

    Centos下实现安装Python3.6和Python2共存

    这篇文章主要介绍了Centos下实现安装Python3.6和Python2共存,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-08-08
  • Python实现在PDF中插入单图像水印和平铺图像水印

    Python实现在PDF中插入单图像水印和平铺图像水印

    这篇文章主要为大家详细介绍了如何使用Python实现在PDF中插入单图像水印和平铺图像水印,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-04-04
  • python中numpy数组与list相互转换实例方法

    python中numpy数组与list相互转换实例方法

    在本篇文章里小编给大家整理的是一篇关于python中numpy数组与list相互转换实例方法,对此有兴趣的朋友们可以学习下。
    2021-01-01
  • TensorFlow2.0矩阵与向量的加减乘实例

    TensorFlow2.0矩阵与向量的加减乘实例

    今天小编就为大家分享一篇TensorFlow2.0矩阵与向量的加减乘实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-02-02
  • 利用Python实现个性化日历

    利用Python实现个性化日历

    虽然市面上已经存在现成的日历功能,并且有第三方库可以直接调用实现,但我们仍然希望通过自己编写日历程序来引出我认为好用的日历实现,所以下面就跟随小编一起学习一下如何使用Python编写一个简单的日历程序吧
    2024-02-02
  • Python数据分析处理(三)--运动员信息的分组与聚合

    Python数据分析处理(三)--运动员信息的分组与聚合

    这篇文章主要介绍了Python数据清洗与处理 运动员信息的分组与聚合,根据Python数据清洗与处理 的相关资料展开运动员信息的分组与聚合的文章内容,需要的朋友可以参考一下
    2021-12-12
  • 详解Python locals()的陷阱

    详解Python locals()的陷阱

    这篇文章主要介绍了详解Python locals()的陷阱,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-03-03
  • Python pyautogui模拟键盘输入操作的示例详解

    Python pyautogui模拟键盘输入操作的示例详解

    在自动化办公和提高工作效率的今天,Python的pyautogui库成为了我们模拟键盘和鼠标操作的得力助手,下面我们看看如何使用pyautogui来模拟键盘输入吧
    2025-03-03

最新评论