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

Python利用pyobdc和tkinter框架连接数据库2-保存配置文件

为了实现保存用户输入的数据库连接信息,并在下次打开程序时自动加载这些信息,可以使用配置文件(如 .txt.json 文件)来存储这些信息。以下是一个完整的实现方案,结合了动态输入和自动加载配置文件的功能。

实现步骤

  1. 保存配置文件:当用户输入连接信息并成功连接后,将这些信息保存到一个配置文件中。
  2. 加载配置文件:程序启动时,检查配置文件是否存在。如果存在,则自动加载配置文件中的信息到输入框中。
  3. 提供手动输入和保存选项:用户可以选择手动输入新的连接信息,并保存这些信息供下次使用。

示例代码

以下代码展示了如何实现这一功能:

import tkinter as tk
from tkinter import messagebox
import pyodbc
import json
import os

# 配置文件路径
CONFIG_FILE = "db_config.json"

# 保存配置信息到文件
def save_config(config):
    with open(CONFIG_FILE, "w") as file:
        json.dump(config, file)
    messagebox.showinfo("保存成功", "连接信息已保存,下次打开时将自动加载。")

# 加载配置信息
def load_config():
    if os.path.exists(CONFIG_FILE):
        with open(CONFIG_FILE, "r") as file:
            return json.load(file)
    return None

# 连接数据库
def connect_to_database():
    try:
        # 获取用户输入的连接信息
        server = server_entry.get()
        database = database_entry.get()
        username = username_entry.get()
        password = password_entry.get()

        # 构建连接字符串
        connection_string = (
            f"DRIVER={{ODBC Driver 17 for SQL Server}};"
            f"SERVER={server};"
            f"DATABASE={database};"
            f"UID={username};"
            f"PWD={password}"
        )

        # 尝试连接数据库
        connection = pyodbc.connect(connection_string)
        messagebox.showinfo("成功", "数据库连接成功!")

        # 保存连接信息到配置文件
        config = {
            "server": server,
            "database": database,
            "username": username,
            "password": password
        }
        save_config(config)

        # 在这里可以添加后续操作,例如执行查询
        cursor = connection.cursor()
        cursor.execute("SELECT @@VERSION")  # 查询数据库版本
        result = cursor.fetchone()
        messagebox.showinfo("数据库版本", result[0])

        # 关闭连接
        connection.close()
    except pyodbc.Error as e:
        messagebox.showerror("错误", f"连接失败:{e}")

# 创建主窗口
root = tk.Tk()
root.title("动态连接数据库")

# 加载配置文件中的信息
config = load_config()
if config:
    server_default = config.get("server", "")
    database_default = config.get("database", "")
    username_default = config.get("username", "")
    password_default = config.get("password", "")
else:
    server_default = ""
    database_default = ""
    username_default = ""
    password_default = ""

# 创建输入框和标签
tk.Label(root, text="服务器地址:").grid(row=0, column=0, padx=10, pady=5)
server_entry = tk.Entry(root, width=30)
server_entry.grid(row=0, column=1, padx=10, pady=5)
server_entry.insert(0, server_default)  # 加载默认值

tk.Label(root, text="数据库名称:").grid(row=1, column=0, padx=10, pady=5)
database_entry = tk.Entry(root, width=30)
database_entry.grid(row=1, column=1, padx=10, pady=5)
database_entry.insert(0, database_default)  # 加载默认值

tk.Label(root, text="用户名:").grid(row=2, column=0, padx=10, pady=5)
username_entry = tk.Entry(root, width=30)
username_entry.grid(row=2, column=1, padx=10, pady=5)
username_entry.insert(0, username_default)  # 加载默认值

tk.Label(root, text="密码:").grid(row=3, column=0, padx=10, pady=5)
password_entry = tk.Entry(root, show="*", width=30)
password_entry.grid(row=3, column=1, padx=10, pady=5)
password_entry.insert(0, password_default)  # 加载默认值

# 创建连接按钮
connect_button = tk.Button(root, text="连接数据库", command=connect_to_database)
connect_button.grid(row=4, column=0, columnspan=2, pady=10)

# 运行主循环
root.mainloop()

功能说明

  1. 保存配置文件

    • 成功连接后,程序会将连接信息保存到 db_config.json 文件中。
    • 保存的配置信息包括服务器地址、数据库名称、用户名和密码。
  2. 加载配置文件

    • 程序启动时,会检查 db_config.json 文件是否存在。
    • 如果存在,会自动将配置文件中的信息加载到输入框中。
  3. 手动输入和保存

    • 用户可以选择手动输入新的连接信息。
    • 新的连接信息在成功连接后会覆盖原有的配置文件。

注意事项

  1. 安全性

    • 配置文件中存储了敏感信息(如用户名和密码)。在实际应用中,建议对密码进行加密处理,或者使用更安全的存储方式(如环境变量或加密的密钥管理工具)。
    • 如果不需要保存密码,可以在保存配置时忽略密码字段。
  2. 配置文件格式

    • 示例中使用了 .json 文件格式,因为它简单且易于解析。你也可以选择其他格式(如 .txt.ini 文件),但需要相应地调整代码。
  3. 错误处理

    • 示例代码中已经包含了基本的错误处理逻辑。你可以根据需要进一步扩展,例如处理文件读写错误。

通过这种方式,用户在第一次输入连接信息后,下次打开程序时无需重新输入,大大提高了用户体验。

相关文章:

  • 最新最详细的配置Node.js环境教程
  • shell脚本编程实践第6天
  • 【星云 Orbit • STM32F4】06. 串口密码:USART 数据传递
  • 论coding能力 new bing 对比 chatgpt
  • 安当防火墙登录安全解决方案:零信任认证+国密证书+动态口令构建全方位身份安全屏障
  • c语言中return 数字代表的含义
  • 2024 ChatGPT大模型技术场景与商业应用视频精讲合集(45课).zip
  • Playwright的测试定义为什么不写在测试类定义内部
  • C++二分图
  • Redis集群化方案对比:Codis、Twemproxy、Redis Cluster
  • Qt互斥锁(QMutex)的使用、QMutexLocker的使用
  • 基于单片机的GPS定位系统设计
  • 多线程经典案例
  • Vue3国际化开发实战:i18n-Ally + vue-i18n@next高效配置教程,项目中文显示
  • C 注释编写模版
  • redis的客户端连接的可视化管理工具
  • 基于 Ollama+Docker+OpenWebUI 的本地化部署deepseek流程
  • 高频 SQL 50 题(基础版)_626. 换座位
  • 6-2JVM解释器
  • 2025年企业网络安全实战指南:常见漏洞解析与全方位防御策略
  • 国台办:台湾自古属于中国,历史经纬清晰,法理事实清楚
  • 新能源汽车,告别混乱创新
  • 微软宣布将裁员3%
  • 首映|奥斯卡最佳国际影片《我仍在此》即将公映
  • 继71路之后,上海中心城区将迎来第二条中运量公交
  • 英国收紧移民政策,技术工作签证、大学招生面临更严要求