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

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. 错误处理

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

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

相关文章:

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

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

C# .NET Core HttpClient 和 HttpWebRequest 使用

HttpWebRequest 这是.NET创建者最初开发用于使用HTTP请求的标准类。HttpWebRequest是老版本.net下常用的,较为底层且复杂,访问速度及并发也不甚理想,但是使用HttpWebRequest可以让开发者控制请求/响应流程的各个方面,如 timeouts,…...

[3/11]C#性能优化-实现 IDisposable 接口-每个细节都有示例代码

[3]C#性能优化-实现 IDisposable 接口-每个细节都有示例代码 前言 在C#开发中,性能优化是提升系统响应速度和资源利用率的关键环节。 当然,同样是所有程序的关键环节。 通过遵循下述建议,可以有效地减少不必要的对象创建,从而减…...

Python的pdf2image库将PDF文件转换为PNG图片

您可以使用Python的pdf2image库将PDF文件转换为PNG图片。以下是一个完整的示例,包含安装步骤、代码示例和注意事项。 安装依赖库 首先,您需要安装pdf2image库: pip install pdf2imagepdf2image依赖于poppler库来解析PDF文件。 Windows系统…...

java2025热点面试题之springmvc

1. 请解释Spring MVC的工作原理。 答案: Spring MVC是一个基于Java的MVC框架,用于构建Web应用程序。其工作原理如下: 客户端发送请求到DispatcherServlet,它是Spring MVC的前端控制器。DispatcherServlet查询HandlerMapping&…...

第十三届蓝桥杯大赛软件赛决赛C/C++ 大学 B 组

A 【2022——暴力DP / 优雅背包】-CSDN博客 B 【钟表——类日期问题】-CSDN博客 C 【卡牌——二分】-CSDN博客 D 【最大数字——DFS】-CSDN博客 E 【出差——Dijkstra】-CSDN博客 F 【费用报销——01背包】-CSDN博客 G 【故障——条件概率】-CSDN博客 H 【机房—…...

C#上位机--关键字

引言 在 C# 上位机开发领域,关键字是构建程序的基石。它们是编程语言赋予的特殊词汇,每个关键字都有其独特的用途和功能。了解并熟练运用这些关键字,能够让开发者更加高效地编写代码,实现各种复杂的功能。本文将深入探讨 C# 中一…...

1.C语言初识

C语言初识 C语言初识基础知识hello world数据类型变量、常量变量命名变量分类变量的使用变量的作用域 常量字符字符串转义字符 选择语句循环语句 函数;数组函数数组数组下标 操作符操作符算术操作符移位操作符、位操作符赋值操作符单目操作符关系操作符逻辑操作符条…...

软件测试中的BUG

文章目录 软件测试的生命周期BugBug 的概念描述 Bug 的要素案例Bug 级别Bug 的生命周期与开发产生争执怎么办?【高频面试题】先检查自身,Bug 是否描述的不清楚站在用户角度考虑并抛出问题Bug 的定级要有理有据提⾼自身技术和业务水平,做到不仅…...

TinyEngine v2.2版本发布:支持页面嵌套路由,提升多层级路由管理能力开发分支调整

2025年春节假期已过,大家都带着慢慢的活力回到了工作岗位。为了让大家在新的一年继续感受到 Tiny Engine 的成长与变化,我们很高兴地宣布:TinyEngine v2.2版本正式发布!本次更新带来了重要的功能增强------页面支持嵌套路由&#…...

Web自动化之Selenium添加网站Cookies实现免登录

在使用Selenium进行Web自动化时,添加网站Cookies是实现免登录的一种高效方法。通过模拟浏览器行为,我们可以将已登录状态的Cookies存储起来,并在下次自动化测试或爬虫任务中直接加载这些Cookies,从而跳过登录步骤。 Cookies简介 …...

Storm实时流式计算系统(全解)——中

storm编程的基本概念-topo-spout-bolt 例如下: storm 编程接口-spout的结构及组件实现 storm编程案例-spout组件-实现 这是我的第一个组件(spout组件继承BaseRichSput)所有重写内部的三个方法,用于接收数据(这里数据是…...

【算法工程】大模型局限性新发现之解决能连github但无法clone项目的问题

最近,linux服务器遇到一个奇怪的问题,能ping通github,但是无法clone git项目,尝试了各种大模型,都提到代理啥的问题,发现没有一个能解决问题。 后来尝试设置 http.sslVerify 为 false,才解决问题…...

让deepseek更专业的提示词教程

一、明确需求和目标 在使用DeepSeek之前,首先要明确你的需求和目标。例如,你是要生成一篇学术论文的摘要,还是一个商业文案的大纲,亦或是一段技术分析。明确的目标可以帮助你更有针对性地编写提示词。 二、使用专业术语和结构化…...

《Python实战进阶》No 9:使用 Celery 实现异步任务队列

第9集:使用 Celery 实现异步任务队列 引言 在现代 Web 应用中,许多操作(如发送邮件、处理文件上传、执行复杂计算等)可能需要耗费较长时间。如果这些操作直接在主线程中执行,会导致用户请求阻塞,降低用户体…...

【Mark】记录用宝塔+Nginx+worldpress+域名遇到的跨域,301,127.0.0.1,CSS加载失败问题

背景 想要用宝塔搭建worldpress,然后用域名直接转https,隐藏掉ipport。 结果被折磨了1天,一直在死活在301,127.0.0.1打转 还有css加载不了的情况 因为worldpress很多是301重定向的,所以改到最后我都不知道改了什么&am…...

Linux | Ubuntu 与 Windows 双系统安装 / 高频故障 / UEFI 安全引导禁用

注:本文为 “buntu 与 Windows 双系统及高频故障解决” 相关文章合辑。 英文引文,机翻未校。 How to install Ubuntu 20.04 and dual boot alongside Windows 10 如何将 Ubuntu 20.04 和双启动与 Windows 10 一起安装 Dave’s RoboShack Published in…...

计算机毕业设计SpringBoot+Vue.js手机商城 (源码+文档+PPT+讲解)

温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…...

CSS—隐藏元素:1分钟掌握与使用隐藏元素的方法

个人博客:haichenyi.com。感谢关注 1. 目录 1–目录2–display:none3–visibility: hidden4–opacity: 05–position: absolute;与 left: -9999px;6–z-index 和 position7–clip-path: circle(0%) 2. display:none 标签会挂载在html中,但是不会在页面上…...

EtherCAT总线学习笔记

一、EtherCAT的概述: EtherCAT是由德国BECKHOFF自动化公司于2003年提出的 实时工业以太网技术。它具有高速和高数据有效率的特点,支持多种设备连接拓扑结构。其 从站节点使用专用控制芯片,主站使用标准的以太网控制器。 EtherCAT的主要特点如…...

自学微信小程序的第八天

DAY8 1、使用动画API即可完成动画效果的制作,先通过wx.createAnimation()方法获取Animation实例,然后调用Animation实例的方法实现动画效果。 表40:wx.createAnimation()方法的常用选项 选项 类型 说明 duration number 动画持续时间,单位为毫秒,默认值为400毫秒 timing…...

WebRTC与PJSIP:呼叫中心系统技术选型指南

助力企业构建高效、灵活的通信解决方案 在数字化时代,呼叫中心系统的技术选型直接影响客户服务效率和业务扩展能力。WebRTC与PJSIP作为两大主流通信技术,各有其核心优势与适用场景。本文从功能、成本、开发门槛等维度为您深度解析,助您精准匹…...

Vue-Flow绘制流程图(Vue3+ElementPlus+TS)简单案例

本文是vue3Elementplusts框架编写的简单可拖拽绘制案例。 1.效果图&#xff1a; 2.Index.vue主代码&#xff1a; <script lang"ts" setup> import { ref, markRaw } from "vue"; import {VueFlow,useVueFlow,MarkerType,type Node,type Edge } fro…...

PDF文件转换为PNG图像

要实现将PDF文件转换为PNG图像&#xff0c;可以使用Python的pdf2image库。pdf2image是一个基于poppler和Pillow&#xff08;PIL&#xff09;的库&#xff0c;可以将PDF页面转换为图像。 首先&#xff0c;需要安装必要的库&#xff1a; pip install pdf2image在安装pdf2image时…...

c++中的静态多态和动态多态简介

在 C 中&#xff0c;多态性&#xff08;Polymorphism&#xff09; 分为 静态多态&#xff08;Static Polymorphism&#xff09; 和 动态多态&#xff08;Dynamic Polymorphism&#xff09;&#xff0c;二者通过不同的机制实现代码的灵活性。以下是详细对比和核心要点&#xff1…...

如何通过 LlamaIndex 将数据导入 Elasticsearch

作者&#xff1a;来自 Elastic Andre Luiz 逐步介绍如何使用 RAG 和 LlamaIndex 提取数据并进行搜索。 在本文中&#xff0c;我们将使用 LlamaIndex 来索引数据&#xff0c;从而实现一个常见问题搜索引擎。 Elasticsearch 将作为我们的向量数据库&#xff0c;实现向量搜索&am…...

Boosting

Boosting 学习目标 知道boosting集成原理和实现过程知道bagging和boosting集成的区别知道AdaBoost集成原理 Boosting思想 Boosting思想图 每一个训练器重点关注前一个训练器不足的地方进行训练通过加权投票的方式&#xff0c;得出预测结果串行的训练方式 1 什么是boosting 随着…...

【通俗讲解电子电路】——从零开始理解生活中的电路(一)

导言&#xff1a;电子电路为什么重要&#xff1f; ——看不见的“魔法”&#xff0c;如何驱动你的生活&#xff1f; 清晨&#xff0c;当你的手机闹钟响起时&#xff0c;你可能不会想到&#xff0c;是电子电路在精准控制着时间的跳动&#xff1b;当你用微波炉加热早餐时&#…...

LeetCode72编辑距离(动态规划)

给你两个单词 word1 和 word2&#xff0c; 请返回将 word1 转换成 word2 所使用的最少操作数 。 你可以对一个单词进行如下三种操作&#xff1a; 插入一个字符 删除一个字符 替换一个字符 示例 1&#xff1a; 输入&#xff1a;word1 “horse”, word2 “ros” 输出&#xf…...

rabbitmq单向ssl认证配置与最佳实践(适用于各大云厂商)

背景 这里后补直接上代码 最佳实践 主要从两个方面保证消息不丢失 RabbitMQ方面 创建队列时开启持久化创建交换器时开启持久化创建镜像队列&#xff08;可选&#xff09;开启延迟队列&#xff08;可选&#xff09; 代码层面 开启生产者到交换器回调参数开启交换器到队列…...