我是图书馆管理者平常很多人值班遇到有人请假、换班我需要改值班表而且请假、换班需要我的审批审批通过后才能换班、请假如果不通过则需要返回重做。需要用Python写一个图书馆志愿者值班、换班、调班、请假的代码尽可能详细我有日常值班表是表格我需要直接导入表格你在代码上要进行标注说明每一步是干啥的。我不懂Python所以安装数据库、第三方包等你需要进行详细说明而且这个系统需要联网。
首先需要安装Python的一些第三方库,如pandas、numpy、tkinter、sqlite3等,可通过以下命令进行安装:
pip install pandas numpy tkinter sqlite3
然后,需要创建一个数据库来存储值班信息,可以使用sqlite3库来创建一个数据库文件,并创建一个值班表来存储值班信息。
import sqlite3
conn = sqlite3.connect('duty.db')
cursor = conn.cursor()
cursor.execute('''CREATE TABLE duty_table
(id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT,
date TEXT,
time TEXT,
reason TEXT,
status TEXT)''')
conn.commit()
conn.close()
这里创建了一个名为"duty.db"的数据库文件,并在其中创建了一个名为"duty_table"的表格,它包含了值班人员的姓名、值班日期、值班时间、请假/换班原因以及审核状态。
接下来,我们可以通过pandas库来读取日常值班表,并将其导入到数据库中。
import pandas as pd
import sqlite3
conn = sqlite3.connect('duty.db')
cursor = conn.cursor()
df = pd.read_excel('duty_schedule.xlsx')
for index, row in df.iterrows():
name = row['姓名']
date = row['日期']
time = row['时间']
reason = ''
status = '待审核'
cursor.execute("INSERT INTO duty_table (name, date, time, reason, status) VALUES (?, ?, ?, ?, ?)", (name, date, time, reason, status))
conn.commit()
conn.close()
这里假设我们的日常值班表格为"duty_schedule.xlsx",它包含了值班人员的姓名、值班日期、值班时间。我们使用pandas库来读取这个表格,并通过循环将每一行数据插入到数据库中。
接下来,我们需要编写一些函数来实现值班、请假、换班和调班的操作。
值班操作:
import tkinter as tk
import sqlite3
def add_duty(name, date, time):
conn = sqlite3.connect('duty.db')
cursor = conn.cursor()
reason = ''
status = '待审核'
cursor.execute("INSERT INTO duty_table (name, date, time, reason, status) VALUES (?, ?, ?, ?, ?)", (name, date, time, reason, status))
conn.commit()
conn.close()
def duty():
def submit():
name = name_entry.get()
date = date_entry.get()
time = time_entry.get()
add_duty(name, date, time)
duty_window.destroy()
duty_window = tk.Toplevel()
duty_window.title('值班')
name_label = tk.Label(duty_window, text='姓名:')
name_label.grid(row=0, column=0)
name_entry = tk.Entry(duty_window)
name_entry.grid(row=0, column=1)
date_label = tk.Label(duty_window, text='日期:')
date_label.grid(row=1, column=0)
date_entry = tk.Entry(duty_window)
date_entry.grid(row=1, column=1)
time_label = tk.Label(duty_window, text='时间:')
time_label.grid(row=2, column=0)
time_entry = tk.Entry(duty_window)
time_entry.grid(row=2, column=1)
submit_button = tk.Button(duty_window, text='提交', command=submit)
submit_button.grid(row=3, column=1)
这里我们定义了一个add_duty函数用于将值班信息插入到数据库中,然后定义了一个duty函数用于创建一个新窗口,并在窗口中添加姓名、日期、时间的输入框和一个提交按钮。当用户点击提交按钮时,我们将获取到的值班信息传递给add_duty函数进行插入操作。
请假操作:
def ask_leave(id, reason):
conn = sqlite3.connect('duty.db')
cursor = conn.cursor()
cursor.execute("UPDATE duty_table SET reason=?, status=? WHERE id=?", (reason, '待审核', id))
conn.commit()
conn.close()
def leave():
def submit():
index = listbox.curselection()
if len(index) > 0:
id = int(listbox.get(index[0]).split()[0])
reason = reason_entry.get()
ask_leave(id, reason)
leave_window.destroy()
conn = sqlite3.connect('duty.db')
cursor = conn.cursor()
cursor.execute("SELECT * FROM duty_table WHERE status='已通过' OR status='待审核'")
rows = cursor.fetchall()
leave_window = tk.Toplevel()
leave_window.title('请假')
listbox = tk.Listbox(leave_window)
for row in rows:
listbox.insert(tk.END, '{} {} {} {}'.format(row[0], row[1], row[2], row[3]))
listbox.pack()
reason_label = tk.Label(leave_window, text='请假原因:')
reason_label.pack()
reason_entry = tk.Entry(leave_window)
reason_entry.pack()
submit_button = tk.Button(leave_window, text='提交', command=submit)
submit_button.pack()
conn.close()
这里我们定义了一个ask_leave函数用于将请假信息更新到数据库中,然后定义了一个leave函数用于创建一个新窗口,并在窗口中添加一个列表框,用于显示当前已经通过或待审核的值班信息。当用户选择一条值班信息并输入请假原因后,我们将调用ask_leave函数更新该值班信息的请假原因和审核状态。
换班操作:
def change(id1, id2):
conn = sqlite3.connect('duty.db')
cursor = conn.cursor()
cursor.execute("SELECT * FROM duty_table WHERE id=?", (id1,))
row1 = cursor.fetchone()
cursor.execute("SELECT * FROM duty_table WHERE id=?", (id2,))
row2 = cursor.fetchone()
cursor.execute("UPDATE duty_table SET name=?, date=?, time=? WHERE id=?", (row2[1], row2[2], row2[3], row1[0]))
cursor.execute("UPDATE duty_table SET name=?, date=?, time=? WHERE id=?", (row1[1], row1[2], row1[3], row2[0]))
conn.commit()
conn.close()
def change_duty():
def submit():
index1 = listbox1.curselection()
index2 = listbox2.curselection()
if len(index1) > 0 and len(index2) > 0:
id1 = int(listbox1.get(index1[0]).split()[0])
id2 = int(listbox2.get(index2[0]).split()[0])
change(id1, id2)
change_window.destroy()
conn = sqlite3.connect('duty.db')
cursor = conn.cursor()
cursor.execute("SELECT * FROM duty_table WHERE status='已通过'")
rows = cursor.fetchall()
change_window = tk.Toplevel()
change_window.title('换班')
label1 = tk.Label(change_window, text='选择值班人员1:')
label1.grid(row=0, column=0)
listbox1 = tk.Listbox(change_window)
for row in rows:
listbox1.insert(tk.END, '{} {} {} {}'.format(row[0], row[1], row[2], row[3]))
listbox1.grid(row=1, column=0)
label2 = tk.Label(change_window, text='选择值班人员2:')
label2.grid(row=0, column=1)
listbox2 = tk.Listbox(change_window)
for row in rows:
listbox2.insert(tk.END, '{} {} {} {}'.format(row[0], row[1], row[2], row[3]))
listbox2.grid(row=1, column=1)
submit_button = tk.Button(change_window, text='提交', command=submit)
submit_button.grid(row=2, column=1)
conn.close()
这里我们定义了一个change函数用于交换两个值班人员的值班信息,然后定义了一个change_duty函数用于创建一个新窗口,并在窗口中添加两个列表框,用于选择要交换的两个值班人员。当用户选择好要交换的两个值班人员后,我们将调用change函数进行交换操作。
调班操作:
def adjust(id1, id2):
conn = sqlite3.connect('duty.db')
cursor = conn.cursor()
cursor.execute("SELECT * FROM duty_table WHERE id=?", (id1,))
row1 = cursor.fetchone()
cursor.execute("SELECT * FROM duty_table WHERE id=?", (id2,))
row2 = cursor.fetchone()
cursor.execute("UPDATE duty_table SET date=? WHERE id=?", (row2[2], row1[0]))
cursor.execute("UPDATE duty_table SET date=? WHERE id=?", (row1[2], row2[0]))
conn.commit()
conn.close()
def adjust_duty():
def submit():
index1 = listbox1.curselection()
index2 = listbox2.curselection()
if len(index1) > 0 and len(index2) > 0:
id1 = int(listbox1.get(index1[0]).split()[0])
id2 = int(listbox2.get(index2[0]).split()[0])
adjust(id1, id2)
adjust_window.destroy()
conn = sqlite3.connect('duty.db')
cursor = conn.cursor()
cursor.execute("SELECT * FROM duty_table WHERE status='已通过'")
rows = cursor.fetchall()
adjust_window = tk.Toplevel()
adjust_window.title('调班')
label1 = tk.Label(adjust_window, text='选择值班人员1:')
label1.grid(row=0, column=0)
listbox1 = tk.Listbox(adjust_window)
for row in rows:
listbox1.insert(tk.END, '{} {} {} {}'.format(row[0], row[1], row[2], row[3]))
listbox1.grid(row=1, column=0)
label2 = tk.Label(adjust_window, text='选择值班人员2:')
label2.grid(row=0, column=1)
listbox2 = tk.Listbox(adjust_window)
for row in rows:
listbox2.insert(tk.END, '{} {} {} {}'.format(row[0], row[1], row[2], row[3]))
listbox2.grid(row=1, column=1)
submit_button = tk.Button(adjust_window, text='提交', command=submit)
submit_button.grid(row=2, column=1)
conn.close()
这里我们定义了一个adjust函数用于调换两个值班人员的值班日期,然后定义了一个adjust_duty函数用于创建一个新窗口,并在窗口中添加两个列表框,用于选择要调换的两个值班人员。当用户选择好要调换的两个值班人员后,我们将调用adjust函数进行调换操作。
以上就是一个简单的图书馆志愿者值班、换班、调班、请假系统的代码,其中涉及到了创建数据库、读取表格、插入数据、更新数据等操作。通过这个系统,管理者可以方便地管理志愿者的值班情况,并且可以快速响应志愿者的请假、换班、调班请求。
原文地址: https://www.cveoy.top/t/topic/b7Aj 著作权归作者所有。请勿转载和采集!