python最强实训程序(增删改查)机房收费管理系统-基于tkinter的图形化界面(附详细代码)

这是一个基于Python的机房收费管理系统,采用Tkinter作为图形界面,结合Pandas进行数据处理。系统实现了用户登录、用户登记、结算下机、信息修改和查询等功能。通过时间差算法计算上机费用,并具备数据增删改查操作。源代码中包括详细的函数实现,如数据录入、查询、修改和删除。

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()



评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值