|
发表于 2024-6-17 13:06:46
|
显示全部楼层
听上去你遇到了一个非常有意思的问题。可以理解为你希望通过共享Excel文件的方式来实现数据的实时更新和访问,但WPS的云文档显然无法很好地支持这个需求。那么,我们可以考虑换个方案,用数据库来解决这个问题。
为什么会推荐数据库呢?数据库天生就是用来存储和管理数据的,并且支持多用户同时访问和修改数据。我们可以使用SQLite、MySQL或其他数据库来实现你的需求。
这里我们用SQLite来做一个简单的示例,因为它是一个轻量级的嵌入式数据库,无需安装服务器,非常适合小型或个人项目。
首先,我们要定义如何在Python中使用SQLite。我们需要`sqlite3`库,另一个重要的库是`pandas`,用于处理表格数据。
### 1. 初始化数据库
首先要建立一个数据库和一张表。
- import sqlite3
- import pandas as pd
- # 创建数据库连接
- conn = sqlite3.connect('shared_data.db')
- cursor = conn.cursor()
- # 创建一个示例表
- cursor.execute('''
- CREATE TABLE IF NOT EXISTS employees (
- id INTEGER PRIMARY KEY,
- name TEXT,
- department TEXT,
- salary REAL
- )
- ''')
- # 提交并关闭连接
- conn.commit()
- conn.close()
复制代码
### 2. 插入数据到数据库
- def insert_data():
- # 创建数据库连接
- conn = sqlite3.connect('shared_data.db')
- cursor = conn.cursor()
- # 插入一些示例数据
- cursor.execute("INSERT INTO employees (name, department, salary) VALUES ('Alice', 'HR', 5000)")
- cursor.execute("INSERT INTO employees (name, department, salary) VALUES ('Bob', 'IT', 6000)")
- cursor.execute("INSERT INTO employees (name, department, salary) VALUES ('Charlie', 'Finance', 7000)")
- # 提交并关闭连接
- conn.commit()
- conn.close()
- insert_data()
复制代码
### 3. 读取数据
- def fetch_data():
- # 创建数据库连接
- conn = sqlite3.connect('shared_data.db')
- df = pd.read_sql_query("SELECT * FROM employees", conn)
- print(df)
- conn.close()
- fetch_data()
复制代码
### 4. 更新数据
- def update_data(employee_id, new_salary):
- # 创建数据库连接
- conn = sqlite3.connect('shared_data.db')
- cursor = conn.cursor()
- # 更新数据
- cursor.execute("UPDATE employees SET salary = ? WHERE id = ?", (new_salary, employee_id))
- # 提交并关闭连接
- conn.commit()
- conn.close()
- update_data(1, 5500)
- fetch_data() # 重新读取数据以查看更新结果
复制代码
### 5. 用Tkinter创建简单的GUI
最后,我们将这些功能整合到一个简单的Tkinter界面中。
- import tkinter as tk
- from tkinter import messagebox
- class App:
- def __init__(self, root):
- self.root = root
- self.root.title("Employee Management")
-
- self.name_label = tk.Label(root, text="Name")
- self.name_label.pack()
- self.name_entry = tk.Entry(root)
- self.name_entry.pack()
- self.dept_label = tk.Label(root, text="Department")
- self.dept_label.pack()
- self.dept_entry = tk.Entry(root)
- self.dept_entry.pack()
- self.salary_label = tk.Label(root, text="Salary")
- self.salary_label.pack()
- self.salary_entry = tk.Entry(root)
- self.salary_entry.pack()
- self.submit_button = tk.Button(root, text="Add Employee", command=self.add_employee)
- self.submit_button.pack()
- self.view_button = tk.Button(root, text="View Employees", command=self.view_employees)
- self.view_button.pack()
- def add_employee(self):
- name = self.name_entry.get()
- dept = self.dept_entry.get()
- salary = self.salary_entry.get()
- if not name or not dept or not salary:
- messagebox.showwarning("Input Error", "All fields are required!")
- return
- conn = sqlite3.connect('shared_data.db')
- cursor = conn.cursor()
- cursor.execute("INSERT INTO employees (name, department, salary) VALUES (?, ?, ?)", (name, dept, float(salary)))
- conn.commit()
- conn.close()
- messagebox.showinfo("Success", "Employee added successfully!")
- def view_employees(self):
- conn = sqlite3.connect('shared_data.db')
- df = pd.read_sql_query("SELECT * FROM employees", conn)
- messagebox.showinfo("Employees", df.to_string())
- conn.close()
- root = tk.Tk()
- app = App(root)
- root.mainloop()
复制代码
通过这种方式,你不需要再担心文件锁定、冲突等问题了。数据库可以很好地解决并发访问的问题。希望这能帮到你!如果有其他问题,不妨再问我~
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 |
|