用Tkinter库实现一个管理系统的可视化界面

实验题目:

1.写一个管理系统,实现录入,查询,删除,修改,转账,关于这六个界面。

2.使用Tkinter库,实现可视化界面。

3.点到不同的选项,要能够实现画面的跳转。

效果图如下:

dc1f4f8bc4d741149f019e6e0a5fb068.png

 录入功能:

        可以根据提示信息输入正确的信息,就会将其储存在{user.json}中,通过查询就会显示出来。

 

f23ecee02cad4bbe8efdbe4afb23012b.png

 查询功能:

        可以查询到{user.json}中储存的所有用户信息。

 

f5a3da9a82674c56bf37318a525325c3.png

 删除功能:

        可以根据用户的id删除储存在{user.json}中对应的用户数据。

 68792d682eb84efdbb8a655b647ca3c0.png

 转账功能:

        根据所提示的信息,实现转账和被转账。

a21aeac072c5441cb861ec16fc7da8b8.png

关于功能:

        可以写一些自己想要显示的内容。 

 3d67b9a8c91548b4ab100f53a779d65e.png

 

 实现源代码:

{user.json}:

//用列表储存

[{"id": "1001","name":"小黄","code": "210110","money": "1000"},
{"id": "1002","name":"小晴","code": "2003","money": "1100"},
{"id": "1003","name":"小牛","code": "2002","money": "1200"}]

mainpage.py:

import tkinter as tk
from views import InsertFrame,SearchFrame,DelectFrame,AboutFrame,ChangeFrame,TransferFrame

class mainpage:
def __init__(self,master:tk.Tk):
self.root =master
self.root.title('学生信息管理系统 v0.0.1')
self.root.geometry('600x400')
# 调用
self.creat_page()
# 创建第二页的界面
def creat_page(self):
# 创建一个录入页面
self.insert_frame = InsertFrame(self.root)
# 创建一个查询页面
self.search_frame = SearchFrame(self.root)
# 创建一个删除页面
self.delect_frame = DelectFrame(self.root)
# 创建一个修改页面
self.change_frame = ChangeFrame(self.root)
# tk.Label(self.change_frame, text='修改页面').pack()
#转账
self.transfer_frame = TransferFrame(self.root)
# 创建一个关于的页面
self.about_frame = AboutFrame(self.root)

# Menu创建menubar顶级菜单、filemenu 下拉菜单和弹出菜单(放置时是使用post放置)
menubar = tk.Menu(self.root)

# command=self.show_change绑定事件的意思
menubar.add_command(label='录入',command=self.show_insert)
menubar.add_command(label='查询',command=self.show_search)
menubar.add_command(label='删除',command=self.show_delect)
menubar.add_command(label='修改',command=self.show_change)
menubar.add_command(label='转账',command=self.show_transfer)
menubar.add_command(label='关于',command=self.show_about)
# 绑定到root对象
self.root['menu'] = menubar

def show_insert(self):
self.insert_frame.pack()
self.search_frame.pack_forget()
self.delect_frame.pack_forget()
self.change_frame.pack_forget()
self.about_frame.pack_forget()
self.transfer_frame.pack_forget()

def show_search(self):
self.search_frame.pack()
self.insert_frame.pack_forget()
self.delect_frame.pack_forget()
self.change_frame.pack_forget()
self.about_frame.pack_forget()
self.transfer_frame.pack_forget()

def show_delect(self):
self.delect_frame.pack()
self.insert_frame.pack_forget()
self.search_frame.pack_forget()
self.change_frame.pack_forget()
self.about_frame.pack_forget()
self.transfer_frame.pack_forget()

def show_change(self):
self.change_frame.pack()
# 实现本界面时,遗忘下面的界面
self.insert_frame.pack_forget()
self.search_frame.pack_forget()
self.delect_frame.pack_forget()
self.about_frame.pack_forget()
self.transfer_frame.pack_forget()

def show_transfer(self):
self.transfer_frame.pack()
self.insert_frame.pack_forget()
self.search_frame.pack_forget()
self.delect_frame.pack_forget()
self.change_frame.pack_forget()
self.about_frame.pack_forget()

def show_about(self):
self.about_frame.pack()
self.insert_frame.pack_forget()
self.search_frame.pack_forget()
self.insert_frame.pack_forget()
self.change_frame.pack_forget()
self.transfer_frame.pack_forget()


if __name__ == '__main__':
root = tk.Tk()
mainpage(root)
root.mainloop()

login.py:

import tkinter as tk
from tkinter import messagebox
from db import db
from mainpage import mainpage

class LoginPage:
def __init__(self,master):
self.root = master
self.root.geometry('300x180')
self.root.title('登录项')

self.administrator = tk.StringVar()
self.password = tk.StringVar()

self.page = tk.Frame(root)
self.page.pack()

tk.Label(self.page).grid(row=0, column=0)

tk.Label(self.page, text='用户登录:').grid(row=1, column=1)
tk.Entry(self.page, textvariable=self.administrator).grid(row=1, column=2)

tk.Label(self.page, text='密码:').grid(row=2, column=1, pady=10)
tk.Entry(self.page, textvariable=self.password).grid(row=2, column=2)

tk.Button(self.page, text='登录:', command=self.login).grid(row=3, column=1, pady=10)
tk.Button(self.page, text='退出:', command=self.page.quit).grid(row=3, column=3)

def login(self):
adm = self.administrator.get()
pas = self.password.get()
flag,message = db.check_login(adm,pas)
#登录页面的跳转
if flag:
# destroy销毁上一个页面
self.page.destroy()
mainpage(self.root)
else:
messagebox.showwarning(title = '警告',message= message)

if __name__ == '__main__':
root = tk.Tk()
LoginPage(master=root)
root.mainloop()

db.py:

import json

class MysqlDatabases:
def __init__(self):
self.user = json.loads(open('user.json', mode='r', encoding='utf-8').read())
self.administrator = json.loads(open('administrator.json', mode='r', encoding='utf-8').read())

def check_login(self, administrator, password):
# 遍历所有用户
for adm in self.administrator:
if administrator == adm['administrator']:
if password == adm['password']:
return True, '登录成功'
else:
return False, '登录失败,密码错误'
return False, '登录失败,用户不存在'

def all(self):
return self.user

def insert(self, use):
self.user.append(use)

def delect_by_administrator(self, id):
for use in self.user:
print(use)
if use['id'] == id:
self.user.remove(use)
return True, f'{id}用户删除成功'
return False, f'{id}用户不存在'

def search_by_administrator(self,id):
#拿到所有学生数据
for use in self.user:
if use['id'] ==id:
return True,use
return False, f'{id}用户不存在'

def update(self, user):
for use in self.user:
if use['id'] == user['id']:
use.update(user)
return True, f'{user["id"]}用户数据修改成功'
return False, f'{user["id"]}用户不存在'

# def transfer1_by_user(self,user):
# for use in self.user:
# if use['id'] == user['id']:
# use.update(user)
# return True, f'{user["id"]}用户存在'
# return False, f'{user["id"]}用户不存在'

def transfer2_by_user(self,id,id1,count):
for use in self.user:
if use['id'] == id['id']:
a = int(use['money'])
if a >= count:
for use1 in self.user:
if use1['id'] == id1['id']:
b = int(use1['money'])
a -= count
b += count
return a,b
else:
return False,f"{id}账户钱不够"

db = MysqlDatabases()
if __name__ == '__main__':
print(db.all())

db = MysqlDatabases()
if __name__ == '__main__':
print(db.all())

views.py:

import tkinter as tk
from tkinter import ttk
from db import db

class SearchFrame(tk.Frame):
def __init__(self,root):
# 重写了master
super().__init__(root)

self.table_view = tk.Frame()
self.table_view.pack()

self.creat_page()
def creat_page(self):
columns = ("id", "name", "code", "money")
columns_values = ("id", "姓名", "密码", "金额")
# headings 表格的样式 ,columns列,self.tree_view树式结构
self.tree_view = ttk.Treeview(self, show='headings', columns=columns)
self.tree_view.column('id', width=80, anchor='center')
self.tree_view.column('name', width=80, anchor='center')
self.tree_view.column('code', width=80, anchor='center')
self.tree_view.column('money', width=80, anchor='center')
self.tree_view.heading('id', text='id')
self.tree_view.heading('name', text='姓名')
self.tree_view.heading('code', text='密码')
self.tree_view.heading('money', text='金额')

self.tree_view.pack(fill=tk.BOTH,expand=True)

#调用
self.show_data_frame()
#刷新页面
tk.Button(self,text='刷新数据',command=self.show_data_frame).pack(anchor=tk.E,pady = 5)
#拿到所有student中的数据
def show_data_frame(self):
#删除旧的阶段,意思是遍历每一个tree_view.get_children(''),把他放到tree_view.delect中删除
for _ in map(self.tree_view.delete,self.tree_view.get_children('')):
pass
user = db.all()
index = 0
for use in user:
print(use)
#显示到界面上
self.tree_view.insert('',index+1,values=(
use['id'],use['name'],use['code'],use['money']
)
)



class InsertFrame(tk.Frame):
def __init__(self,root):
# 重写了master
super().__init__(root)
# tk.Label(self, text='录入页面').pack()

self.id = tk.StringVar()
self.name = tk.StringVar()
self.code = tk.StringVar()
self.money = tk.StringVar()
self.status= tk.StringVar()
self.create_page()


def create_page(self):
tk.Label(self).grid(row = 0,pady=10)
# 创建一个输入id的框框
tk.Label(self,text = 'id').grid(row = 1,column= 1,pady=10)
tk.Entry(self,textvariable=self.id).grid(row = 1,column= 2,pady=10)

tk.Label(self, text='姓 名').grid(row=2, column=1, pady=10)
tk.Entry(self, textvariable=self.name).grid(row=2, column=2, pady=10)

tk.Label(self, text='密 码').grid(row=3, column=1, pady=10)
tk.Entry(self, textvariable=self.code).grid(row=3, column=2, pady=10)

tk.Label(self, text='金 额').grid(row=4, column=1, pady=10)
tk.Entry(self, textvariable=self.money).grid(row=4, column=2, pady=10)

tk.Button(self, text = '录入',command=self.recode_info).grid(row=5, column=2, pady=10)
# 使录入显示在右下角
tk.Label(self, textvariable=self.status).grid(row=6, column=2, pady=10,stick=tk.E)

#记录一下录入的信息
def recode_info(self):
use = {"id":self.id.get(),"name":self.name.get(),"code":self.code.get(),
"money":self.money.get()
}
# 第二次运行时,使上一次录入的数据为空,不会被保存下来
self.id.set('')
self.name.set('')
self.code.set('')
self.money.set('')
db.insert(use)
self.status.set('提交数据成功')

class DelectFrame(tk.Frame):
def __init__(self,root):
# 重写了master
super().__init__(root)
self.id = tk.StringVar()
self.status = tk.StringVar()
tk.Label(self, text='根据id删除数据').pack()
tk.Entry(self, textvariable=self.id).pack()
tk.Button(self, text='删除',command=self.delete).pack()
tk.Label(self, textvariable=self.status).pack()

def delete(self):
#获取数据
id = self.id.get()
flag,message=db.delect_by_administrator(id)
self.status.set(message)

# 继承
class AboutFrame(tk.Frame):
def __init__(self,root):
# 重写了master
super().__init__(root)
tk.Label(self, text='关于作品:本作品由tkinter制作').pack()
tk.Label(self, text='关于作者:群里最弱的萌新').pack()

class ChangeFrame(tk.Frame):
def __init__(self,root):
# 重写了master
super().__init__(root)
self.id = tk.StringVar()
self.name = tk.StringVar()
self.code = tk.StringVar()
self.money = tk.StringVar()
self.status = tk.StringVar()
self.create_page()
def create_page(self):
tk.Label(self).grid(row=0, pady=10)
# 创建一个输入姓名的框框
tk.Label(self, text='id').grid(row=1, column=1, pady=10)
tk.Entry(self, textvariable=self.id).grid(row=1, column=2, pady=10)

tk.Label(self, text='姓 名').grid(row=2, column=1, pady=10)
tk.Entry(self, textvariable=self.name).grid(row=2, column=2, pady=10)

tk.Label(self, text='密 码').grid(row=3, column=1, pady=10)
tk.Entry(self, textvariable=self.code).grid(row=3, column=2, pady=10)

tk.Label(self, text='金 额').grid(row=4, column=1, pady=10)
tk.Entry(self, textvariable=self.money).grid(row=4, column=2, pady=10)

tk.Button(self, text='查询', command=self.search_user).grid(row=5, column=1, pady=10)
tk.Button(self, text='修改', command=self.change_user).grid(row=5, column=2, pady=10)
# 使录入显示在右下角
tk.Label(self, textvariable=self.status).grid(row=6, column=2, pady=10, stick=tk.E)

def search_user(self):
flag, info = db.search_by_administrator(self.id.get())
if flag:
self.id.set(info['id'])
self.name.set(info['name'])
self.code.set(info['code'])
self.money.set(info['money'])
self.status.set('数据查询成功')
else:
self.status.set(info)

def change_user(self):
use = {"id": self.id.get(), "name": self.name.get(), "code": self.code.get(),
"money": self.money.get()
}
# 第二次运行时,使上一次录入的数据为空,不会被保存下来
self.id.set('')
self.name.set('')
self.code.set('')
self.money.set('')
db.update(use)
self.status.set('修改数据成功')

class TransferFrame(tk.Frame):
def __init__(self, root):
# 重写了master
super().__init__(root)
self.id1 = tk.StringVar()
self.id2 = tk.StringVar()
# self.name = tk.StringVar()
self.code = tk.StringVar()
self.money = tk.StringVar()
self.status = tk.StringVar()
self. creat_page()
#创建转账的页面
def creat_page(self):
#Label显示输入框 Entry显示提示信息
# self, textvariable=self.id1意思是赋值
tk.Label(self).grid(row=0, pady=10)
tk.Label(self, text='转账id').grid(row=1, column=1, pady=10)
tk.Entry(self, textvariable=self.id1).grid(row=1, column=2, pady=10)
tk.Label(self, text='被转账id1').grid(row=2, column=1, pady=10)
tk.Entry(self, textvariable=self.id2).grid(row=2, column=2, pady=10)
tk.Label(self, text='转账id的密码').grid(row=3, column=1, pady=10)
tk.Entry(self, textvariable=self.code).grid(row=3, column=2, pady=10)

tk.Label(self, text='转账金额').grid(row=4, column=1, pady=10)
tk.Entry(self, textvariable=self.money).grid(row=4, column=2, pady=10)
#command=self.recode_info 赋值:即调用该方法时 当用户按下按钮时修改账户余额
tk.Button(self, text='确认转账', command=self.recode_info).grid(row=5, column=1, pady=10)
tk.Label(self, textvariable=self.status).grid(row=6, column=2, pady=10, stick=tk.E)

def recode_info(self):
person1 ={"id":self.id1.get()}
person2 ={"id":self.id2.get()}
#检查转账双方是否均为合法用户
flag, info = db.search_by_administrator(self.id1.get())
if flag:
flag, info = db.search_by_administrator(self.id2.get())
if flag:
count = int(self.money.get())
c, d = db.transfer2_by_user(person1, person2, count)
if c:
person1 ={"id":self.id1.get(),'money':c}
person2 ={"id":self.id2.get(),'money':d}
# 更新转账后的余额信息到json中
# 第二次运行时,使上一次录入的数据为空,不会被保存下来
self.money.set('')
db.update(person1)
db.update(person2)
self.status.set('转账成功')
else:
self.status.set(d)
else:
# 将实例对象的 status 属性值设置为 info。
self.status.set(info)


 

 

 

 

 

 

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
这是一个VB6的IDE插件(Addin),使用VB6的IDE直接设计Python界面Python和VB都是能让人快乐的编程语言,我使用了Python之后,很多自己使用的工具都使用Python开发或改了,因为最终实现Python代码实在太短了(相比VB),有时候Python一行代码就可以实现VB一个函数的功能。 Python就是这种让人越用越开心的语言。 不过说实在,使用Python开发GUI界面还是麻烦了一些了,自带的标准Tkinter使用起来非常简单,不过对于习惯了VB拖放控件完成界面设计的偶来说,还是不够人性化。TK也有一个工具叫GUI Builder,不过它使用Layout布局,不够直观,而且用起来很不爽。。 至于PyQt/wxPython等GUI,尽管有可视化设计工具,但总感觉做一般的轻量级应用是杀鸡用牛刀, 而且不够环保,不够低碳,要带一个很大的,需要目标机器上夜同样安装了PyQt/wxPython,做不了绿色软件。 所以最终的结果是我更喜欢Tkinter,用起来很简单,绿色环保,真正的跨平台,一个py文件到处运行(担心泄密就编译成pyc)。 很多人都认为TK界面不够美观,不过我经过多次实验后发现导入Python自带的标准TTK主题界面非常Native,不输PyQt/wxPython。 此Addin默认启用TTK支持,也可选择关闭。 总而言之,轻量级GUI,TK+TTK足够。 使用此Addin,你可以不用一句代码就可以生成一个完整可运行的Python的GUI界面,支持2.X和3.X。 安装方法:将压缩包解压到你希望的目录,然后执行Setup.exe完成注册插件过程,打开VB6就可以用了。 在VB窗体上设计完成界面后(你可以大胆的设置各控件的属性,Addin尽量将其翻译为tkinter的控件属性),点工具栏上的VisualTkinter(图标为一片羽毛),再点'生成代码'按钮,即可生成可运行的Python代码,可以拷贝至剪贴板或保存至文件。 一般情况下你可以不用再改变tkinter的控件属性,但是如果你熟悉tkinter,需要更多的控制,可以一一核对各属性,并且修改,再生成代码。 当然除了用来设计界面外,此ADDIN内置的各控件属性列表可以做为编程参考,比较完整,除了极少数我认为大多数人都不用的属性外,属性定义基本上是我从官方的tkinter文档直接翻译的。 如果还没有VB6,网上找一个VB6精简版即可,不到20M,小巧玲珑。 代码已经在Github上托管,更新的版本可以在这上面找到,需求也可以在上面提: https://github.com/cdhigh/Visual-Tkinter-for-Python

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值