Python GUI --- 使用 tkinter 模块制作可视用户管理系统

tkinter 模块介绍

tkinter 是使用 python 进行窗口设计的模块。Tkinter模块(“Tk 接口”)是Python的标准Tk GUI工具包的接口。作为 python 特定的GUI界面,是一个图像的窗口,tkinter是python 自带的,可以编辑的GUI界面,我们可以用GUI 实现很多直观的功能,比如想开发一个计算器,如果只是一个程序输入,输出窗口的话,是没用用户体验的。所有开发一个图像化的小窗口,就是必要的。
如要找到更多具体信息请关注:tkinter窗口视窗教程大全.

用到的模块

前置知识

模块名 相关学习链接
pickle pickle学习链接
prettytable python模块(美化库)

以上是我在制作这个简易用户管理系统使用的模块,外加一个 tkinter 窗口设计模块

简单的对该程序的要求进行介绍

  • 要有管理员用户和普通用户;
  • 管理员用户可以更改普通用户的密码和爱好;
  • 普通用户只能更改自己的爱好;
  • 管理员的 id:admin 密码:admin。

直接上代码

import pickle
from tkinter import *
from prettytable import PrettyTable as PT

pickle_file_a = open('admin.pkl','rb')
pickle_file_u = open('user.pkl','rb')
pickle_file_h = open('user_hobby.pkl','rb')
# 这里的文件都是提前设置好的文件内容  admin 是管理员用户 user是普通用户 
# 这里使用的方法是 user.pkl 储存一个字典,一个用户 id 对应一个用户的密码
# user_hobby.pkl 储存的是另一个字典,一个用户 id 为 key 对应的爱好为 value
admin_list = pickle.load(pickle_file_a)
ord_list = pickle.load(pickle_file_u)
ord_dict = pickle.load(pickle_file_h)
# pickle.load() 是将文件加载成python的容器格式


def chuchun():
    pickle_file_a = open('admin.pkl', 'wb')
    pickle_file_u = open('user.pkl', 'wb')
    pickle_file_h = open('user_hobby.pkl', 'wb')
    pickle.dump(admin_list, pickle_file_a)
    pickle.dump(ord_list, pickle_file_u)
    pickle.dump(ord_dict, pickle_file_h)

def admin_show_to_check():
    windows.destroy()
    admin_check()



def user_hobby():
    def back():
        package.destroy()
        show_menu()

    def back_save():
        chuchun()
        change_tk.destroy()
        show_menu()

    def change():
        global change_tk
        hobby_new = e3.get()
        ord_dict[name] = hobby_new
        package.destroy()
        change_tk = Tk()
        table = PT(['账号', '密码', '爱好'])
        for temp in ord_list:
            if temp[0] == name:
                table.add_row([temp[0], temp[1], ord_dict[name]])

        Label(change_tk,text='您修改后的账号情况如下:').grid(row=0,column=0)
        Label(change_tk,text=table).grid(row=1,column=1)

        Button(change_tk, text='取消保存并退出', width=20, command=quit).grid(row=2, column=0)
        Button(change_tk, text='保存并返回上一级菜单', width=20, command=back_save).grid(row=2, column=1)

    windows.destroy()
    package = Tk()
    Label(package,text=f'您当前的爱好是:{ord_dict[name]} ').grid(row=0,column=0)
    Label(package,text='请输入您的新爱好').grid(row=1,column=0)

    e3 = Entry(package)
    e3.grid(row=1,column=1)

    Button(package, text='确定', width=20,command=change).grid(row=2,column=0)
    Button(package, text='取消并返回上一级菜单', width=20,command=back).grid(row=2,column=1)

def admin_check():
    def del_user():
        def del_backto_check():
            admin_del.destroy()
            admin_check()


        def del_save():
            def del_to_back():
                admin_del.destroy()
                admin_del_s1.destroy()
                admin_check()

            def del_backto_check2():
                admin_del_s.destroy()
                admin_check()

            def del_to_save():
                for i in range(len(ord_list)):
                    if ord_list[i][0] == names:
                        del ord_list[i]
                        ord_dict.pop(names)
                        chuchun()
                        admin_del_s.destroy()
                        admin_check()

            names = e11.get()
            flagx = 0
            for temp in ord_list:
                if temp[0] == names:
                    flagx = 1
                    admin_del.destroy()
                    admin_del_s = Tk()
                    Label(admin_del_s, text=f'确定删除用户 {names} 吗').grid(row=0, column=0)

                    Button(admin_del_s, text='确定', width=20, command=del_to_save).grid(row=2, column=0)
                    Button(admin_del_s, text='取消', width=20, command=del_backto_check2).grid(row=2, column=1)

            if flagx == 0:
                admin_del_s1 = Tk()
                Label(admin_del_s1, text='您想要删除的用户不存在或已经删除').grid()
                Button(admin_del_s1, text='返回', width=20, command=del_to_back).grid(row=2, column=0)


        admin_begin.destroy()
        admin_del = Tk()
        Label(admin_del, text='删除用户').grid(row=0, column=0)
        Label(admin_del, text='请输入你想要删除的账户id:').grid(row=1, column=0)

        e11 = Entry(admin_del)
        e11.grid(row=1, column=1)

        Button(admin_del, text='确定', width=20, command=del_save).grid(row=2, column=0)
        Button(admin_del, text='取消', width=20, command=del_backto_check).grid(row=2, column=1)


    def admin_alter_user():
        def alter_backto_check():
            admin_alter.destroy()
            admin_check()

        def alter_save():
            named1 = e7.get()
            paswd1 = e8.get()
            hobby1 = e9.get()

            flag1 = 0
            for temp in ord_list:
                if temp[0] == named1:
                    flag1 = 1
                    temp[1] = paswd1
                    ord_dict[named1] = hobby1


            if flag1 == 0:
                ord_list.append([named1,paswd1])
                ord_dict[named1] = hobby1

            chuchun()
            admin_alter.destroy()
            admin_check()

        global named1,paswd1,hobby1
        admin_begin.destroy()
        admin_alter = Tk()
        admin_alter.geometry('600x500')
        Label(admin_alter, text='修改账户(若不存在则新建用户)').place(x=50, y=50)
        Label(admin_alter, text='请输入你想要修改账户id:').place(x=100, y=100)
        Label(admin_alter, text='请输入该用户的新密码:').place(x=100, y=200)
        Label(admin_alter, text='请输入该用户的新爱好:').place(x=100, y=300)

        e7 = Entry(admin_alter, width=20)
        e8 = Entry(admin_alter, width=20)
        e9 = Entry(admin_alter, width=20)
        e7.place(x=300, y=100)
        e8.place(x=300, y=200)
        e9.place(x=300, y=300)


        Button(admin_alter, text='确定', width=20, command=alter_save).place(x=100, y=400)
        Button(admin_alter, text='取消', width=20, command=alter_backto_check).place(x=300, y=400)



    def admin_add():
        def aback_to_show():
            admin_app.destroy()
            show_menu()

        def check_save():
            def back_to_add():
                check_a.destroy()
                admin_check()

            names = e4.get()
            for temp in ord_list:
                if names == temp[0]:
                    admin_app.destroy()
                    check_a = Tk()
                    Label(check_a, text='该用户已存在,请检查后重新输入').grid(row=0, column=0)
                    Button(check_a, text='确定', width=20, command=back_to_add).grid(row=1, column=0)

            paswd = e5.get()
            hobby = e6.get()
            ord_list.append([names,paswd])
            ord_dict[names] = hobby
            chuchun()
            admin_app.destroy()
            admin_check()

        admin_begin.destroy()
        admin_app = Tk()
        Label(admin_app, text='请在对应位置输入新的用户信息').grid(row=0, column=0)
        Label(admin_app, text='请输入新的用户账号').grid(row=1, column=0)
        Label(admin_app, text='请输入新的用户密码').grid(row=2, column=0)
        Label(admin_app, text='请输入新的用户爱好').grid(row=3, column=0)

        e4 = Entry(admin_app)
        e5 = Entry(admin_app)
        e6 = Entry(admin_app)

        e4.grid(row=1, column=1)
        e5.grid(row=2, column=1)
        e6.grid(row=3, column=1)

        Button(admin_app, text='确定', width=20, command=check_save).grid(row=4, column=0)
        Button(admin_app, text='取消', width=20, command=aback_to_show).grid(row=4, column=1)

    def aback_to_show0():
        admin_begin.destroy()
        show_menu()

    table = PT(['账号', '密码', '爱好'])
    for temp in ord_list:
        table.add_row([temp[0], temp[1], ord_dict[temp[0]]])

    admin_begin = Tk()
    Label(admin_begin, text='当前文件下所有用户如下:').grid(row=0,column=0)
    Label(admin_begin, text=table).grid(row=1,column=0)

    Button(admin_begin, text='新建账号', width=20, command=admin_add).grid(row=2, column=1)
    Button(admin_begin, text='修改账号', width=20, command=admin_alter_user).grid(row=3, column=1)
    Button(admin_begin, text='删除账号', width=20, command=del_user).grid(row=4, column=1)
    Button(admin_begin, text='返回上一级菜单', width=20, command=aback_to_show0).grid(row=5, column=1)
    Button(admin_begin, text='退出程序', width=20, command=quit).grid(row=6, column=1)


def show_menu():
    global windows
    windows = Tk()
    windows.geometry('500x150')
    Label(windows, text='请选择你下一步想要执行的操作').grid(column=0)
    if flag == 1:
        Button(windows, text='查看所有人员名单', width=20,command=admin_show_to_check).grid(column=1)
        Button(windows, text='返回上一级菜单', width=20,command=land).grid(column=1)
        Button(windows, text='退出', width=20, command=quit).grid(column=1)

    else:
        Button(windows, text='修改当前爱好', width=20,command=user_hobby).grid(column=1)
        Button(windows, text='返回上一级菜单', width=20,command=land).grid(column=1)
        Button(windows, text='退出', width=20, command=quit).grid(column=1)


def land0():
	# land0这里是用作摧毁上一个对话框,并执行登陆函数
	# 中间为了一直只存在一个对话框,用了多个 destroy 函数
	# 这个是用来删除多余的对话框的
    root.destroy()
    land()

def land():
    def land1():
        def landc():
            root0.destroy()
            root3.destroy()
            land()

        def ord_user():
            root2.destroy()
            root0.destroy()
            show_menu()

        def admin_user():
            root1.destroy()
            root0.destroy()
            show_menu()

        global flag,name
        name = e1.get()
        pswd = e2.get()

        if (name, pswd) in admin_list:
            flag = 1
            root1 = Tk()
            Label(root1, text="管理员登陆成功!").pack()
            Button(root1, text='完成', width=20, command=admin_user).pack()

        elif [name, pswd] in ord_list:
            flag = 0
            root2 = Tk()
            Label(root2, text=f"用户 {name} 登陆成功").grid()
            Button(root2, text='完成', width=20, command=ord_user).grid()


        else:
            root3 = Tk()
            Label(root3, text="登陆失败!请检查用户名和密码的输入").pack()
            Button(root3, text='重新登陆', width=20, command=landc).pack()

	# land的主函数内容
    root0 = Tk()
    root0.title('用户管理系统')
    root0.geometry('500x150')

    Label(root0, text='用户名 :').grid(row=2, column=0)
    Label(root0, text='密 码 :').grid(row=3, column=0)

    e1 = Entry(root0)
    e2 = Entry(root0)
    # 这里的Entry是输入框

    e1.grid(row=2, column=1)
    e2.grid(row=3, column=1)
    # 设置输入框的位置,row是第几行,column是第几列

    Button(root0, text='登陆', width=20, command=land1).grid(row=5, column=0, sticky=W, padx=10, pady=10)
    # 这里的command连接的是下一个函数 - land1()
    Button(root0, text='退出', width=20, command=root.quit).grid(row=5, column=1, sticky=W, padx=10, pady=10)

if __name__== 'main':
	root = Tk()
	# 创建初始窗口
	root.title('用户管理系统')
	Label(root, text='欢迎来到用户管理系统,请输入您的用户名和密码').pack()
	Button(root, text='开始程序', width=20, command=land0).pack()
	# 点击开始程序之后,就会跳到 land0 登陆函数
	mainloop()
	# 在文件结尾一定要有这一句代码

代码内部没有过多的加注释,因为这里比较多的都是逻辑处理的内容,比如说一按下哪个按钮就会到达某某某地;
这里简单说明一下用到的元素以及部分函数

  • Button 里面的参数有:
参数 作用
root – 对话框 把按钮设置在哪个对话框内
text 按钮上面附带的文本内容,也就是按钮提示信息
command 按钮对应的效果,后面需要接一个函数
width 按钮的宽度

这里是一些Button用的多的参数内容
简单题要一下,博主这里为了让每次只会存在需要的一个对话框的内容,所以 Button command 接的函数都是一个中间函数,内容是摧毁上一个对话框并开启下一段对话框的函数,这样就能保证每次对话框存在的数量不会过多。

  • Label 元素
    Lable元素实际上就是一个文本元素,能够直接展示text的值
参数 作用
root 元素所处哪一个对话框中
text 也就是文本内容
  • Entry 元素
    Entry 元素是输入框,用户可以在输入框中输入内容,使用 Entry.get() 便可以获取到用户的输入内容。
参数 作用
row 行位置
column 列位置
  • grid 函数
    grid 是用来调整 Button 等元素位置的一个函数,里面有的参数为:
参数 作用
row 行位置
column 列位置
padx 左右边距
pady 上下边距
  • pack 函数
    不用带参数,它就会自动调整元素的位置,不过不太推荐使用。
    这里博主参考其他博主发布的内容,使用pack函数的时候,设置的参数一直报错,我也不知道问题出在哪,所以这个方法使用得不多。

  • place 函数
    这里也是设置元素位置的函数,还挺好用的,调整的位置会比grid 函数更加精确,因为其自带的参数是通过收入像素值来进行调整元素的位置的。
    常用参数:

参数 作用
x 元素的水平位置
y 元素的垂直位置

后面直接进行成果展示

Python GUI --- 使用 tkinter 模块制作可视用户管理系统_第1张图片
这是开始界面
Python GUI --- 使用 tkinter 模块制作可视用户管理系统_第2张图片
直接进行一个管理员的登陆!
Python GUI --- 使用 tkinter 模块制作可视用户管理系统_第3张图片
后面就是我们设置的一个效果了,后面直接对结果内容进行展示吧。
Python GUI --- 使用 tkinter 模块制作可视用户管理系统_第4张图片
Python GUI --- 使用 tkinter 模块制作可视用户管理系统_第5张图片
Python GUI --- 使用 tkinter 模块制作可视用户管理系统_第6张图片
Python GUI --- 使用 tkinter 模块制作可视用户管理系统_第7张图片
博客到这里就结束了,喜欢的就点个关注!
如果还有什么感兴趣的内容 欢迎来访 三创.
或者联系我!
下一篇 — Linux文本三剑客 二 : awk

你可能感兴趣的:(python,gui,python,tkinter,gui,可视化)