tkinter 是使用 python 进行窗口设计的模块。Tkinter模块(“Tk 接口”)是Python的标准Tk GUI工具包的接口。作为 python 特定的GUI界面,是一个图像的窗口,tkinter是python 自带的,可以编辑的GUI界面,我们可以用GUI 实现很多直观的功能,比如想开发一个计算器,如果只是一个程序输入,输出窗口的话,是没用用户体验的。所有开发一个图像化的小窗口,就是必要的。
如要找到更多具体信息请关注:tkinter窗口视窗教程大全.
前置知识
模块名 | 相关学习链接 |
---|---|
pickle | pickle学习链接 |
prettytable | python模块(美化库) |
以上是我在制作这个简易用户管理系统使用的模块,外加一个 tkinter 窗口设计模块
直接上代码
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()
# 在文件结尾一定要有这一句代码
代码内部没有过多的加注释,因为这里比较多的都是逻辑处理的内容,比如说一按下哪个按钮就会到达某某某地;
这里简单说明一下用到的元素以及部分函数
参数 | 作用 |
---|---|
root – 对话框 | 把按钮设置在哪个对话框内 |
text | 按钮上面附带的文本内容,也就是按钮提示信息 |
command | 按钮对应的效果,后面需要接一个函数 |
width | 按钮的宽度 |
这里是一些Button用的多的参数内容
简单题要一下,博主这里为了让每次只会存在需要的一个对话框的内容,所以 Button command 接的函数都是一个中间函数,内容是摧毁上一个对话框并开启下一段对话框的函数,这样就能保证每次对话框存在的数量不会过多。
参数 | 作用 |
---|---|
root | 元素所处哪一个对话框中 |
text | 也就是文本内容 |
参数 | 作用 |
---|---|
row | 行位置 |
column | 列位置 |
参数 | 作用 |
---|---|
row | 行位置 |
column | 列位置 |
padx | 左右边距 |
pady | 上下边距 |
pack 函数
不用带参数,它就会自动调整元素的位置,不过不太推荐使用。
这里博主参考其他博主发布的内容,使用pack函数的时候,设置的参数一直报错,我也不知道问题出在哪,所以这个方法使用得不多。
place 函数
这里也是设置元素位置的函数,还挺好用的,调整的位置会比grid 函数更加精确,因为其自带的参数是通过收入像素值来进行调整元素的位置的。
常用参数:
参数 | 作用 |
---|---|
x | 元素的水平位置 |
y | 元素的垂直位置 |
这是开始界面
直接进行一个管理员的登陆!
后面就是我们设置的一个效果了,后面直接对结果内容进行展示吧。
博客到这里就结束了,喜欢的就点个关注!
如果还有什么感兴趣的内容 欢迎来访 三创.
或者联系我!
下一篇 — Linux文本三剑客 二 : awk