python最强实训程序(增删改查)机房收费管理系统-基于tkinter的图形化界面(附详细代码)
最近学校实训,用两天时间做了一个python小程序*机房收费管理系统*,一款基于tkinter使用pandas库的dataframe处理数据的实训小程序,先来看效果图:


开发过程中最难搞的应该就是时间差算法,其它的增删改查都是对dataframe的基本操作,着手先用基本python语法写完整个流程以及涉及到的数据处理算法,之后再带入dataframe代码实例化,再加之tkinter的点缀,打完收工!!!(运行时记得安装对应的库)
下面是 文件地址:
链接:https://pan.baidu.com/s/1V18TFfhbZYGbw05qoeczYQ
提取码:icah
下面是 详细代码:
代码比较简单,学过tkinter和pandas的都能看懂
from tkinter import *
from tkinter import messagebox
import pandas as pd
import numpy as np
from datetime import datetime, date
df = pd.DataFrame(index=range(20), columns=["学号", "班级", "姓名", "上机时间", "下机时间"])
df.loc[0:] = pd.read_csv(r'test01.csv', index_col=0, dtype=object)
df = df.dropna(how='all')
class Application(Frame):
def __init__(self, master=None):
super().__init__(master)
self.master = master
root.iconbitmap('1.ico')
root.attributes('-alpha', '0.9')
self.pack()
self.createWidget()
def createWidget(self):
# 创建用户名框
self.label01 = Label(self, text="用户名")
self.label01.pack()
v1 = StringVar()
self.entry01 = Entry(self, textvariable=v1)
self.entry01.pack()
# self.btn01 = Button(self, text="登陆", command=self.login)
# self.btn01.pack()
# 创建密码框
self.label02 = Label(self, text="密码")
self.label02.pack()
v2 = StringVar()
self.entry02 = Entry(self, textvariable=v2, show="*")
self.entry02.pack()
self.btn01 = Button(self, text="登陆", command=self.login, font="黑体", activeforeground="green", activebackground="pink", bg="grey")
self.btn01.pack()
global photo
photo = PhotoImage(file="login.gif")
self.btn07 = Button(root, image=photo,relief="groove")
self.btn07.pack()
# self.btn07.config(state="disabled") # 设置按钮禁用
def login(self):
username = self.entry01.get()
pwd = self.entry02.get()
if username == "admin" and pwd == "123456":
self.label01.destroy()
self.entry01.destroy()
self.label02.destroy()
self.entry02.destroy()
self.btn01.destroy()
root.geometry("1165x150+400+300")
messagebox.showinfo("机房收费管理系统", "欢迎登陆机房收费管理系统")
Button(self, text="用户登记", command=self.denji, width=35, font="黑体", activeforeground="green", activebackground="pink", bg="grey").grid(row=0, column=0)
Button(self, text="结算下机", command=self.jiesuan, width=35, font="黑体", activeforeground="green", activebackground="pink", bg="grey").grid(row=0, column=1)
Button(self, text="信息修改", command=self.xiugai, width=35, font="黑体", activeforeground="green", activebackground="pink", bg="grey").grid(row=0, column=2)
Button(self, text="信息查询", command=self.chaxun, width=35, font="黑体", activeforeground="green", activebackground="pink", bg="grey").grid(row=0, column=3)
else:
messagebox.showinfo("机房收费管理系统", "您输入的密码或者账号有误,请重试!")
def denji(self):
top = Toplevel()
top.title("用户登记")
top.geometry("235x175+400+400")
self.label01 = Label(top, text="学号")
self.label01.grid(row=0, column=1)
v1 = StringVar()
self.entry01 = Entry(top, textvariable=v1)
self.entry01.grid(row=0, column=2)
self.label02 = Label(top, text="班级")
self.label02.grid(row=1, column=1)
v1 = StringVar()
self.entry02 = Entry(top, textvariable=v1)
self.entry02.grid(row=1, column=2)
self.label03 = Label(top, text="姓名")
self.label03.grid(row=2, column=1)
v1 = StringVar()
self.entry03 = Entry(top, textvariable=v1)
self.entry03.grid(row=2, column=2)
self.label04 = Label(top, text="上机时间")
self.label04.grid(row=3, column=1)
v1 = StringVar()
self.entry04 = Entry(top, textvariable=v1)
self.entry04.grid(row=3, column=2)
self.label05 = Label(top, text="下机时间")
self.label05.grid(row=4, column=1)
v1 = StringVar()
self.entry05 = Entry(top, textvariable=v1)
self.entry05.grid(row=4, column=2)
self.label19 = Label(top, text="机器号(1-20):")
self.label19.grid(row=5, column=1)
v1 = StringVar()
self.entry19 = Entry(top, textvariable=v1)
self.entry19.grid(row=5, column=2)
self.btn02 = Button(top, text='登记', command=self.denji_data, font="黑体", activeforeground="green", activebackground="pink", bg="grey")
self.btn02.grid(row=6, column=2, sticky=E)
def denji_data(self):
global df
number = self.entry19.get()
data_one = self.entry01.get()
data_two = self.entry02.get()
data_three = self.entry03.get()
data_four = self.entry04.get()
data_five = self.entry05.get()
if number != '':
if int(number) <= len(df):
df1 = df.loc[:int(number)].copy()
df2 = df.loc[int(number):].copy()
df1.loc[df1.index.max() + 1] = [data_one, data_two, data_three, data_four, data_five]
df = pd.concat([df1,df2])
print(df)
else:
messagebox.showinfo('提示', "无此机器")
else:
df.loc[df.index.max() + 1] = [data_one, data_two, data_three, data_four, data_five]
def insert(df, i, df_add):
# 指定第i行插入一行数据
df1 = df.iloc[:i, :]
df2 = df.iloc[i:, :]
df_new = pd.concat([df1, df_add, df2], ignore_index=True)
return df_new
def jiesuan(self):
top = Toplevel()
top.title("结算下机")
top.geometry("240x80+400+400")
self.label06 = Label(top, text="姓名")
self.label06.grid(row=0, column=0)
v1 = StringVar()
self.entry06 = Entry(top, textvariable=v1)
self.entry06.grid(row=0, column=1)
self.label07 = Label(top, text="当前费率(元):")
self.label07.grid(row=1, column=0)
v1 = StringVar()
self.entry07 = Entry(top, textvariable=v1)
self.entry07.grid(row=1, column=1)
self.btn02 = Button(top, text='结算', command=self.jiesuan_data, font="黑体", activeforeground="green", activebackground="pink", bg="grey")
self.btn02.grid(row=2, column=1, sticky=E)
def jiesuan_data(self):
global df
_name = self.entry06.get() # 结算人姓名
_rate = self.entry07.get() # 结算费率
if _rate != '' and _name != '':
num_index = df[(df["姓名"] == str(_name))].index.tolist()
num_time = pd.DataFrame(
(pd.to_datetime(df['下机时间'][num_index]) - pd.to_datetime(df['上机时间'][num_index])) / pd.Timedelta(1,
'H')).fillna(
0).astype(
float)
cost = float(_rate) * float(num_time.loc[num_index[0]][0]) # 结算费用
messagebox.showinfo("谢谢使用", "上机时长:" + str(
(pd.DataFrame(pd.to_datetime(df['下机时间'][num_index]) - pd.to_datetime(df['上机时间'][num_index]))).loc[
num_index[0]][0]) + "\n本次消费:" + str("%.2f" % cost) + "元\n欢迎下次使用")
df = df.drop(num_index[0])
else:
messagebox.showinfo("通知", "请输入姓名和费率")
def xiugai(self):
top = Toplevel()
top.title("结算下机")
top.geometry("1200x80+400+400")
self.label12 = Label(top, text="请输入所需修改(删除)信息使用者的机器号:")
self.label12.grid(row=0, column=0)
v1 = StringVar()
self.entry12 = Entry(top, textvariable=v1)
self.entry12.grid(row=0, column=1)
self.btn04 = Button(top, text="确定修改", command=self.xiugai_data, font="黑体", activeforeground="green", activebackground="pink", bg="grey")
self.btn04.grid(row=0, column=2)
self.btn05 = Button(top, text="确定删除", command=self.shanchu_data, font="黑体", activeforeground="green", activebackground="pink", bg="grey")
self.btn05.grid(row=0, column=3, sticky=W)
self.label18 = Label(top, text="请输入修改后的信息:")
self.label18.grid(row=1, column=0)
self.label13 = Label(top, text="学号")
self.label13.grid(row=2, column=0, sticky=E)
v1 = StringVar()
self.entry13 = Entry(top, textvariable=v1)
self.entry13.grid(row=2, column=1)
self.label14 = Label(top, text="班级")
self.label14.grid(row=2, column=2)
v1 = StringVar()
self.entry14 = Entry(top, textvariable=v1)
self.entry14.grid(row=2, column=3)
self.label15 = Label(top, text="姓名")
self.label15.grid(row=2, column=4)
v1 = StringVar()
self.entry15 = Entry(top, textvariable=v1)
self.entry15.grid(row=2, column=5)
self.label16 = Label(top, text="上机时间")
self.label16.grid(row=2, column=6)
v1 = StringVar()
self.entry16 = Entry(top, textvariable=v1)
self.entry16.grid(row=2, column=7)
self.label17 = Label(top, text="下机时间")
self.label17.grid(row=2, column=8)
v1 = StringVar()
self.entry17 = Entry(top, textvariable=v1)
self.entry17.grid(row=2, column=9)
def xiugai_data(self):
number = self.entry12.get()
data_one = self.entry13.get()
data_two = self.entry14.get()
data_three = self.entry15.get()
data_four = self.entry16.get()
data_five = self.entry17.get()
if int(number) <= len(df):
if data_one != "":
df.loc[int(number)]['学号'] = data_one
if data_two != "":
df.loc[int(number)]['班级'] = data_two
if data_three != "":
df.loc[int(number)]['姓名'] = data_three
if data_four != "":
df.loc[int(number)]['上机时间'] = data_four
if data_five != "":
df.loc[int(number)]['下机时间'] = data_five
print(123)
messagebox.showinfo("修改结果","修改成功")
else:
messagebox.showinfo("修改结果", "该机器无信息")
def shanchu_data(self):
global df
number = self.entry12.get()
if int(number) <= len(df):
df = df.drop(int(number))
messagebox.showinfo("删除结果", "删除成功")
else:
messagebox.showinfo("删除结果", "该机器无信息")
def chaxun(self):
top = Toplevel()
top.title("信息查询")
top.geometry("775x100+400+400")
self.label08 = Label(top, text="您可以按以下信息查询(任选一项):")
self.label08.grid(row=0, column=0)
self.label09 = Label(top, text="学号")
self.label09.grid(row=1, column=0, sticky=E)
v1 = StringVar()
self.entry09 = Entry(top, textvariable=v1)
self.entry09.grid(row=1, column=1)
self.label10 = Label(top, text="班级")
self.label10.grid(row=1, column=2)
v1 = StringVar()
self.entry10 = Entry(top, textvariable=v1)
self.entry10.grid(row=1, column=3)
self.label11 = Label(top, text="姓名")
self.label11.grid(row=1, column=4)
v1 = StringVar()
self.entry11 = Entry(top, textvariable=v1)
self.entry11.grid(row=1, column=5)
self.btn03 = Button(top,text="开始查询", command=self.chaxun_data, font="黑体", activeforeground="green", activebackground="pink", bg="grey")
self.btn03.grid(row=1, column=6)
self.btn06 = Button(top, text="显示所有", command=self.show_all, font="黑体", activeforeground="green", activebackground="pink", bg="grey")
self.btn06.grid(row=2, column=0)
def show_all(self):
messagebox.showinfo("查询结果", str(df))
def chaxun_data(self):
data_one = self.entry09.get()
data_two = self.entry10.get()
data_three = self.entry11.get()
result = ""
if data_one != "":
result = df.loc[df[(df["学号"] == str(data_one))].index.tolist()]
if len(result) == 0:
messagebox.showinfo("查询结果", "抱歉没有查到!")
else:
messagebox.showinfo("查询结果", str(result))
elif data_two != "":
result = df.loc[df[(df["班级"] == str(data_two))].index.tolist()]
if len(result) == 0:
messagebox.showinfo("查询结果", "抱歉没有查到!")
else:
messagebox.showinfo("查询结果", str(result))
elif data_three != "":
result = df.loc[df[(df["姓名"] == str(data_three))].index.tolist()]
if len(result) == 0:
messagebox.showinfo("查询结果", "抱歉没有查到!")
else:
messagebox.showinfo("查询结果", str(result))
else:
messagebox.showinfo("查询结果", "请输入相关信息")
if __name__ == '__main__':
root = Tk()
root.geometry("400x220+400+400")
root.title("机房收费管理系统")
app = Application(master=root)
root.mainloop()
这是一个基于Python的机房收费管理系统,采用Tkinter作为图形界面,结合Pandas进行数据处理。系统实现了用户登录、用户登记、结算下机、信息修改和查询等功能。通过时间差算法计算上机费用,并具备数据增删改查操作。源代码中包括详细的函数实现,如数据录入、查询、修改和删除。





