吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 14486|回复: 65
收起左侧

[Python 转载] tkinter的应用--mini级《仓库管理系统》

  [复制链接]
山野村夫-陈墨 发表于 2020-2-12 23:35
一、tkinter UI界面;

二、mysql、python;

三、python

四、功能:
    (1)采购管理:订货、收货、退货;
    (2)零售管理:零售结算;
    (3)仓库管理:库存查询;
    (4)结算管理:零售流水、购货账单查询;
    (5)管理员:操作员、管理员账号管理;
五、数据库:
    table:
        用户:         user: {user_name,id, password, reg_time}
        采购--进货:    purchase: {id,  name, price,  num, statu(定、收、退), shop,phone ,user_id}
        库存:         stock: {id, sum,  price, name, }
        流水账--卖出:    runuing: {id, stock_id, num, acount, time,  user_id}

六、运行截图:




七、源码:

(1)gui.py

[Python] 纯文本查看 复制代码
"""
    程序入口 :  界面调用其他模块
        (1)option.config : 配置文件
             ·init: False(默认), 未初始化数据库;  true,数据库已经建立。  程序自己完成。
             ·host:  主机;
             ·user:  数据库用户
             ·password:数据库密码
             ·database: 用户数据库( warehouse )
        (2)settings.py: 基础设置。
        (3)mysql_connnect.py: 实现对数据库的各种操作
        (4)gui.py:  程序UI设计, 程序入口
"""
import tkinter  as tk
import tkinter.messagebox
from    tkinter import Menu
from    tkinter import ttk
import  time
import  settings
import   mysql_connect  as  sql
import  re
# 登录类
class sign_frame( tk.Frame ):

    def __init__(self, **kwargs ):
        super().__init__( **kwargs)
        tk.Label( self, text="登录", width=10,height=2, font=("黑体",15),bg="cyan" ).place(x=250,y=10)
        self.place(x=160, y=40)

        tk.Label( self, text="账号: ", width= 14, height=2,  font=("楷体", 12),bg="palegreen",  anchor="w")\
            .place(x =150, y=100 )
        self.user_id = tk.Entry(self, width=20)
        self.user_id.place(x= 300, y=110)

        tk.Label( self, text="密码: ", width= 14, height=2,  font=("楷体", 12),bg="palegreen",anchor="w" )\
            .place(x =150, y=150 )
        self.user_pw = tk.Entry(self, width=20)
        self.user_pw.place(x= 300, y=160)

        tk.Label( self, text="重新输入密码: ", width= 14, height=2,  font=("楷体", 12),bg="palegreen",anchor="w" )\
            .place(x =150, y=200 )
        self.user_pw2 = tk.Entry(self, width=20)
        self.user_pw2.place(x= 300, y=210)

        tk.Button( self, text="登录", width=10,height=1, command=self.check).place(x=150, y=270 )
        tk.Button( self, text="退出", width=10,height=1, command=self.quit_user).place(x=365, y=270 )

    def check(self):
        user_id = self.user_id.get()
        user_pw = self.user_pw.get()
        user_pw2 = self.user_pw2.get()

        # Todo 测试结束后删除
        #user_id ="root"
        #user_pw = user_pw2 = "root"

        if(user_pw != user_pw2):
            tk.messagebox.showwarning(title='提示', message='密码不一致!')
        else:
            #  done   登录验证
            ans = sql.check_sign(user_id,  user_pw)
            if ans[0] :
                tk.messagebox.showinfo( title="提示",message="登陆成功!")
                settings.user["name"] = ans[1]
                settings.user["id"] = user_id
            else:
                 tk.messagebox.showwarning(title='提示', message='密码错误!')

        tk.Label( master=root ,text="昵称:{}\t\t账号:{}".format( settings.user["name"],   settings.user["id"] ))\
                .place(x=50, y=10)

    def quit_user(self):
        settings.user["name"] = ""
        settings.user["id"] = ""
        tk.Label( master=root ,text="昵称:{}\t\t账号:{}".format( settings.user["name"],   settings.user["id"] ),
                  width=200,  anchor="w")\
                .place(x=50, y=10)


# 购货管理
class  purchase_frame(  tk.Frame ):

    def __init__(self, **kwargs):
        super().__init__( **kwargs)
        tk.Label( self, text="购货管理", width=10,height=2, font=("黑体",15),bg="cyan" ).place(x=250,y=10)
        self.place(x=160, y=40)

        # 实现订货
        tk.Label( self, text="订货", width=10,height=2, font=("黑体",13),bg="palegreen" ).place(x=100,y=70)
        tk.Label( self, text="商品名:", width=10,height=2, font=("楷体",12),bg="palegreen",anchor="w" ).place(x=10,y=90)
        self.name = tk.Entry(self, width=18 )
        self.name.place(x=100,y=100 )
        tk.Label( self, text="数量 :", width=10,height=2, font=("楷体",12),bg="palegreen",anchor="w" ).place(x=10,y=120)
        self.num = tk.Entry( self, width=18)
        self.num.place(x=100, y=130)
        tk.Label( self, text="单价:", width=10,height=2, font=("楷体",12),bg="palegreen",anchor="w" ).place(x=10,y=150)
        self.price = tk.Entry( self, width=18)
        self.price.place(x=100, y=160)
        tk.Label( self, text="供货商:", width=10,height=2, font=("楷体",12),bg="palegreen",anchor="w" ).place(x=10,y=180)
        self.shop = tk.Entry( self, width=18)
        self.shop.place(x=100, y=190)
        tk.Label( self, text="联系方式:", width=10,height=2, font=("楷体",12),bg="palegreen",anchor="w" ).place(x=10,y=210)
        self.phone = tk.Entry( self, width=18)
        self.phone.place(x=100, y=220)
        tk.Button(self, text="确认订货", width=10,height=1, command=self.order_goods).place(x=10, y=270 )
        tk.Button(self, text="重置", width=10,height=1, command=self.set_entry).place(x=150, y=270 )

        # 实现收货和退货
        tk.Label( self, text="订货清单", width=10,height=2, font=("黑体",13),bg="palegreen" ).place(x=300,y=70)
        self.info_list = tk.Listbox(self, width=40, height=13, font=("宋体",12))
        self.info_list.place(x=250,y=100)
        self.add_inof_list()

        menu = Menu(root, tearoff=0)
        menu.add_command(label="收货", command=self.get_goods)
        menu.add_command(label="查看信息", command= self.show_info_selected)
        #menu.add_separator()
        menu.add_command(label="退货", command= self.return_goods)
        self.menu = menu
        # 鼠标右键弹出菜单
        self.info_list.bind("<Button-3>", self.popupmenu)

    # 收货
    def get_goods(self):
        loc =  self.info_list.curselection()[0]
        data  =  str( self.info_list.get(loc) ).split(" ")
        title = ['订单编号:','商品名:','供货商:','联系方式:']
        format_data = ""
        for index in range( len( title) ):
            format_data += str( title[index])+ str( data[index])+"\n"

        if  tk.messagebox.askyesno( title="确认收货", message=format_data):
            self.info_list.delete(loc)
            # done 数据库修改
            sql.change_goods_state_receving(data[0], data[1])

    # 退货处理
    def return_goods(self):
        loc =  self.info_list.curselection()[0]
        data  =  str( self.info_list.get(loc) ).split(" ")
        title = ['订单编号:','商品名:','供货商:','联系方式:']
        format_data = ""
        for index in range( len( title) ):
            format_data += str( title[index])+ str( data[index])+"\n"

        if  tk.messagebox.askyesno( title="确认退货", message=format_data):
            self.info_list.delete(loc)
            # done 数据库修改
            sql.change_goods_state_back(data[0])

    # 订货清单打开菜单
    def popupmenu(self,event):
        if  len ( self.info_list.curselection()) :
            self.menu.post(event.x_root, event.y_root)

    # 添加订货清单信息
    def add_inof_list(self):
        # done 获取数据库信息
        data = sql.get_goods_info_order()
        for item in data:
            self.info_list.insert('end', item )

    # 订货
    def order_goods(self):
        id = self.get_id()
        name =   self.name.get()
        num  =   self.num.get()
        price =  "%5.2f" % float( self.price.get())
        state = "订货"
        shop = self.shop.get()
        phone = self.phone.get()
        user_id = settings.user["id"]
        show_data = "{} {} {} {}".format(id,name,shop, phone)
        self.info_list.insert('end', show_data)
        # done 写入数据库
        sql.order_goods(id=id, name=name, num=num, price=price,shop=shop,phone=phone, user_id=user_id)

    # 计算订单编号
    def get_id(self):
        id_time = time.strftime('%Y-%m-%d',time.localtime(time.time()))
        # DOne 读取数据库今日订单数量
        id_num = int(sql.get_purchase_day_sum( id_time ))
        return  str(id_time)+( "_{:0>4d}".format(id_num) )

    # 清空订货信息(订货)
    def set_entry(self):
        self.name.delete(0,'end')
        self.num.delete(0,'end')
        self.price.delete(0,'end')
        self.shop.delete(0,'end')
        self.phone.delete(0,'end')

    # 显示订单详情( 状态 = ‘订货’)
    def show_info_selected(self):
        data = self.info_list.get(  self.info_list.curselection()[0])
        id  = data.split(" ")[0]
        #  done 查询订单的详细信息
        data = sql.get_goods_detailed_info( id )
        format_data = ""
        for item in   data:
            format_data += str(item)+"\n"
        tk.messagebox.showinfo( title="提示",message=format_data)


# 零售管理
class  running_frame(  tk.Frame ):

    def __init__(self, **kwargs):
        super().__init__( **kwargs)
        tk.Label( self, text="零售管理", width=10,height=2, font=("黑体",15),bg="cyan" ).place(x=250,y=10)
        self.place(x=160, y=40)

        # 添加商品
        tk.Label( self, text="商品名-编号", width=20,height=2, font=("楷体",12),bg="palegreen",anchor="w").place(x=20,y=70)
        tk.Label( self, text="单价", width=10,height=2, font=("楷体",12),bg="palegreen",anchor="w" ).place(x=250,y=70)
        tk.Label( self, text="数量", width=10,height=2, font=("楷体",12),bg="palegreen",anchor="w" ).place(x=350,y=70)
        tk.Label( self, text="合计", width=10,height=2, font=("楷体",12),bg="palegreen",anchor="w" ).place(x=450,y=70)
        self.name_id = ttk.Combobox(self,width=28)
        self.name_id.bind("<<ComboboxSelected>>",self.update_goods_info)
        self.name_id.place(x=20, y=100)
        self.set_value()
        self.price = tk.Spinbox(self,width=7, from_=0,to=100000,increment=1,command=self.change_num)
        self.price.place( x=250, y=100)
        self.num = tk.Spinbox(self,width=7, from_=0,to=100000,increment=1)
        self.num.place( x=350, y=100)
        self.account  = tk.Label(self, text="-----", width=10,height=1, font=("楷体",12),bg="palegreen",anchor="w" )
        self.account.place(x=450,y=100)
        tk.Button(self, text="单品合计", width=10,height=1, command=self.add_goods).place(x=510,y=90)

        # 商品展示
        self.goods_info = tk.Listbox(self, width=71,  height=9, font=("宋体", 12))
        self.goods_info.place(x=20,y=140)

        # 商品清除
        menu = Menu(root, tearoff=0)
        menu.add_command(label="删除", command=self.del_goods)
        self.menu = menu
        # 鼠标右键弹出菜单
        self.goods_info.bind("<Button-3>", self.popupmenu)
        #总额计算
        tk.Button( self,text="计算总和", width=10,height=1, command= self.all_account ).place(x=20, y=310)
        tk.Button( self,text="清空商品", width=10,height=1, command= self.del_goods_info ).place(x=510, y=310)
        self.money  = tk.Label(self, text="-----", width=10,height=1, font=("楷体",12),bg="palegreen",anchor="w" )
        self.money.place( x=200, y=310)

    # 设置商品信息
    def set_value(self):
        #  done 获取库存商品name id
        data = sql.get_stock_goods_name_id()
        self.name_id['value'] = data

    #选择商品后修改对应数据
    def update_goods_info(self,event):
        name_id  =  str ( self.name_id.get() ).split("  ")
        id = name_id[1]
        # done 读取商品的库存价格
        price = sql.get_stock_goods_price(id)
        self.price.delete(0,'end')
        self.price.insert(0, price)


    # 修改价格整数为小数
    def  change_num(self):
        data =  self.price.get()
        self.price.insert('end',".00")

    # 计算商品价格 加入购物车
    def add_goods(self):
        name_id =   self.name_id.get()
        price = self.price.get()
        num   =  self.num.get()

        account = eval(price) * eval(num)
        self.account['text'] = format(account, '>5.2f')

        data = "{}  {}/元  {}/个  {}元".format(name_id, str(price),  str(num),  format(account, '>5.2f'))
        self.goods_info.insert(0, data)

    # 商品清单打开菜单
    def popupmenu(self,event):
        if  len ( self.goods_info.curselection()) :
            self.menu.post(event.x_root, event.y_root)

    # 删除商品--商品栏中清除
    def del_goods(self):
        loc =  self.goods_info.curselection()[0]
        data  =  str( self.goods_info.get(loc) ).replace("  ","\n")
        if  tk.messagebox.askyesno( title="确认删除", message=data):
            self.goods_info.delete(loc)

    # 计算商品总和
    def all_account(self):
        data = self.goods_info.get(0,'end')
        money = float(0)
        for item in  data:
            money += float ( str(item).split(" ")[-1][:-1] )
        self.money['text'] = format( money, '<8.2f' )
        # DOne 流水账 输入数据库
        sql.write_running(  settings.user["id"] , data )

    # 清空商品
    def del_goods_info(self):
         if  tk.messagebox.askyesno( title="确认删除", message="清空商品栏?"):
            self.goods_info.delete(0,'end')
            self.money['text'] = "-----"



# 仓库管理
class  warehouse_frame(  tk.Frame ):

    def __init__(self, **kwargs):
        super().__init__( **kwargs)
        tk.Label( self, text="仓库管理", width=10,height=2, font=("黑体",15),bg="cyan" ).place(x=250,y=10)
        self.place(x=160, y=40)

        # 查看存货
        tk.Label( self, text="商品名", width=20,height=2, font=("楷体",12),bg="palegreen",anchor="w").place(x=20,y=70)
        self.name = ttk.Combobox( self, width=20 )
        self.name.place( x=20,y=100 )
        self.set_name()

        tk.Label( self, text="数量", width=10,height=2, font=("楷体",12),bg="palegreen",anchor="w" ).place(x=250,y=70)
        self.num_type = ttk.Combobox( self, width=1 )
        self.num_type['value'] = ['>','=',"<"]
        self.num_type.current(0)
        self.num_type.place( x=250,y=100 )
        self.num_value = tk.Spinbox(self,width=4, from_=0,to=9999999,increment=1)
        self.num_value.place( x=280,y=100 )

        tk.Label( self, text="价格", width=10,height=2, font=("楷体",12),bg="palegreen",anchor="w" ).place(x=350,y=70)
        self.price_type = ttk.Combobox( self, width=1 )
        self.price_type['value'] = ['>','=',"<"]
        self.price_type.current(0)
        self.price_type.place( x=350,y=100 )
        self.price_value = tk.Spinbox(self,width=4, from_=0,to=9999999,increment=1,command= self.set_price_value)
        self.price_value.place( x=380,y=100 )

        tk.Button(self, text="条件查询", font=("楷体",12), command= self.find_stock).place(x=430,y=95)
        tk.Button(self, text="查询全部", bg="gold",font=("楷体",12), command=self.find_all_stock).place(x=510,y=95)

        # 库存显示
        self.stock_info =  tk.Listbox(self,  width=80, height=10)
        self.stock_info.place( x=20, y=150)



    # 读取库存商品名
    def set_name(self):
        #  done 读取数据库库存商品名
        data = sql.get_stock_goods_name_id()
        self.name['value'] = data

    # 按条件查询库存
    def  find_stock(self):
        name = str ( self.name.get()).split(" ")[0]
        num =  self.num_type.get() + self.num_value.get()
        price =  self.price_type.get() + self.price_value.get()
        # done 按条件查询库存
        data = sql.get_stock_goods_price_and_num( name, num, price )
        self.stock_info.delete(0,'end')
        for  item in data:
            self.stock_info.insert('end',  item )



    # 查询所有库存
    def find_all_stock(self):
        # done  查询全部库存
        data = sql.get_all_stock_info()
        self.stock_info.delete(0,'end')
        for  item in data:
            self.stock_info.insert('end',  item )

    #   格式化价格设置
    def  set_price_value(self):
        self.price_value.insert('end','.00')


# 结算管理
class  acount_frame(  tk.Frame ):

    def __init__(self, **kwargs):
        super().__init__( **kwargs)
        tk.Label( self, text="结算管理", width=10,height=2, font=("黑体",15),bg="cyan" ).place(x=250,y=10)
        self.place(x=160, y=40)

        # 查询条件
        tk.Label( self, text="查询类型:", width=20,height=2, font=("楷体",12),bg="palegreen",anchor="w").place(x=10,y=70)
        self.type = ttk.Combobox(self, width=15 ,height=2)
        self.type['value'] = ['购货账目','零售账目']
        self.type.place(x=90, y=75)
        self.type.current(0)

        tk.Label( self, text="开始时间:", width=20,height=2, font=("楷体",12),bg="palegreen",anchor="w").place(x=10,y=100)
        self.y1 = tk.Spinbox(self,width=6, from_=0,to=2050,increment=1, command= self.set_y1 )
        self.y1.place(x=90,y=107)
        self.y1.delete(0,'end')
        self.y1.insert(0,'2020年')
        self.m1 = tk.Spinbox(self,width=3, from_=1,to=12,increment=1, command= self.set_m1)
        self.m1.place(x=145,y=107)
        self.m1.delete(0,'end')
        self.m1.insert(0,'1月')
        self.d1 = tk.Spinbox(self,width=3, from_=1,to=31,increment=1, command= self.set_d1)
        self.d1.place(x=180,y=107)
        self.d1.delete(0,'end')
        self.d1.insert(0,'1日')

        tmp_time = time.strftime('%Y-%m-%d',time.localtime(time.time())).split("-")
        tk.Label( self, text="结束时间:", width=20,height=2, font=("楷体",12),bg="palegreen",anchor="w").place(x=10,y=130)
        self.y2 = tk.Spinbox(self,width=6, from_=0,to=2050,increment=1, command= self.set_y2 )
        self.y2.place(x=90,y=137)
        self.y2.delete(0,'end')
        self.y2.insert(0,'{}年'.format(tmp_time[0]))
        self.m2 = tk.Spinbox(self,width=3, from_=1,to=12,increment=1, command= self.set_m2)
        self.m2.place(x=145,y=137)
        self.m2.delete(0,'end')
        self.m2.insert(0,'{}月'.format(tmp_time[1]))
        self.d2 = tk.Spinbox(self,width=3, from_=1,to=31,increment=1, command= self.set_d2)
        self.d2.place(x=180,y=137)
        self.d2.delete(0,'end')
        self.d2.insert(0,'{}日'.format(tmp_time[2]))

        tk.Label( self, text="操作员:", width=20,height=2, font=("楷体",12),bg="palegreen",anchor="w").place(x=10,y=160)
        self.user = ttk.Combobox(self, width=15 ,height=2)
        self.user.place(x=90, y=165)
        self.set_user_val()

        tk.Button(self, text="查询", width=28,height=1, command=self.find_info).place(x=10, y=240 )

        # 查询结果显示
        self.ans_info = tk.Listbox(self, width=45,height=15,  font=('宋体',12))
        self.ans_info.place( x=220, y=70)
        self.ans_info.bind("<Double-Button-1>", self.show_detailed_ans_info)

    # 显示详细信息
    def show_detailed_ans_info(self,event):
        type = self.ans_info.curselection()
        if type and   type[0]>0:
            id = self.ans_info.get( type[0] )
            # todo 获取详细信息
            data = sql.get_detailed_info( str( self.ans_info.get(0)).strip(), str(id).split(" ")[0] )
            tk.messagebox.showinfo(title= str( self.ans_info.get(0) ).strip(), message=data )

    # 设置查询条件--操作员
    def set_user_val(self):
        # DOne 获取操作员id_name
        data = sql.get_user_name_id()
        self.user['value'] = data

    # 查询信息
    def find_info(self):
        type = self.type.get()
        start_time = re.sub( r"[年月日]","","%s-%03s-%03s" % ( str(self.y1.get()),str( self.m1.get()),str(self.d1.get() )) )
        end_time = re.sub( r"[年月日]","","%s-%03s-%03s" % ( str(self.y2.get()), str(self.m2.get()),str(self.d2.get()) ) )
        start_time.replace(" ",'0')
        end_time.replace(" ",'0')
        try:
            user_id =  str( self.user.get() ).split("__")[1]
        except Exception as e:
            user_id = ""
        # done  读取数据库
        data  = sql.find_running_or_purchase( type, start_time, end_time, user_id)
        self.ans_info.delete(0,'end')
        for  item in data:
            self.ans_info.insert('end', item )

    # 设置伪日历
    def set_y1(self):
        self.y1.insert('end','年')
    def set_m1(self):
        self.m1.insert('end','月')
    def set_d1(self):
        self.d1.insert('end','日')
    def set_y2(self):
        self.y2.insert('end','年')
    def set_m2(self):
        self.m2.insert('end','月')
    def set_d2(self):
        self.d2.insert('end','日')


# 管理员
class  manger_frame(  tk.Frame ):

    def __init__(self, **kwargs):
        super().__init__( **kwargs)
        tk.Label( self, text="管理员", width=10,height=2, font=("黑体",15),bg="cyan" ).place(x=250,y=10)
        self.place(x=160, y=40)

         # 实现 添加账号
        tk.Label( self, text="添加账号", width=10,height=2, font=("黑体",13),bg="palegreen" ).place(x=90,y=60)
        tk.Label( self, text="昵称:", width=10,height=2, font=("楷体",12),bg="palegreen",anchor="w" ).place(x=10,y=90)
        self.name = tk.Entry(self, width=18 )
        self.name.place(x=120,y=100 )
        tk.Label( self, text="账号 :", width=10,height=2, font=("楷体",12),bg="palegreen",anchor="w" ).place(x=10,y=120)
        self.id = tk.Entry( self, width=18)
        self.id.place(x=120, y=130)
        tk.Label( self, text="密码:", width=10,height=2, font=("楷体",12),bg="palegreen",anchor="w" ).place(x=10,y=150)
        self.pw = tk.Entry( self, width=18)
        self.pw.place(x=120, y=160)
        tk.Label( self, text="再次输入密码:", width=13,height=2, font=("楷体",12),bg="palegreen",anchor="w" ).place(x=10,y=180)
        self.pw2 = tk.Entry( self, width=18)
        self.pw2.place(x=120, y=190)
        tk.Label( self, text="等级:", width=10,height=2, font=("楷体",12),bg="palegreen",anchor="w" ).place(x=10,y=210)
        self.grade = ttk.Combobox( self, width=16)
        self.grade.place(x=120, y=220)
        self.grade['value'] = ['管理员','普通操作员']
        self.grade.current(1)
        tk.Button(self, text="添加账号", width=10,height=1, command=self.add_account).place(x=10, y=270 )
        tk.Button(self, text="重置", width=10,height=1, command=self.reset_entry).place(x=170, y=270 )

        # 实现删除和修改信息
        tk.Label( self, text="账号", width=10,height=2, font=("黑体",13),bg="palegreen" ).place(x=300,y=60)
        self.account_list = tk.Listbox(self, width=35, height=13, font=("宋体",12))
        self.account_list.place(x=280,y=100)
        self.add_account_list()


        menu = Menu(root, tearoff=0)
        menu.add_command(label="修改信息", command=self.change_pw)
        menu.add_command(label="删除账号", command= self.del_account)

        self.menu = menu
        # 鼠标右键弹出菜单
        self.account_list.bind("<Button-3>", self.popupmenu)

    # 商品清单打开菜单
    def popupmenu(self,event):
        if  len ( self.account_list.curselection()) :
            self.menu.post(event.x_root, event.y_root)

     # 添加账号
    def add_account(self):
        name = self.name.get()
        id = self.id.get()
        pw = self.pw.get()
        pw2 = self.pw2.get()
        grade = self.grade.get()

        # done 添加账号,写入数据库
        if name=="" or  id=="" or grade=="":
            tk.messagebox.showwarning( title="添加账号", message="请填入正确的数据!")
        else:
            if  not pw==pw2:
                tk.messagebox.showwarning( title="密码", message="密码不一致!")

            else:
                if sql.add_user(name,  id, pw, grade):
                    tk.messagebox.showinfo(title="添加账号" ,message="添加成功!")
                    info = "{}  {}  {}  {}".format(name, id, pw,grade)
                    self.account_list.insert('end', info )
                else:
                    tk.messagebox.showerror(title="添加账号", message="账号已存在,请修改账号!")

    # 修改信息界面
    def change_pw(self):
        # 获取数据
        data =  str ( self.account_list.get( self.account_list.curselection()[0]  ) )
        data = data.split("  ")
        print( data )
        # 界面
        child = tk.Toplevel()
        child.geometry("280x210+100+100")
        child.config( bg="palegreen")
        child.title("修改账号信息")

        tk.Label( child, text="昵称:", width=10,height=2, font=("楷体",12),bg="palegreen",anchor="w" ).place(x=10,y=20)
        name = tk.Entry(child, width=18 )
        name.place(x=120,y=30 )
        name.insert(0,  data[0] )

        tk.Label( child, text="账号 :", width=10,height=2, font=("楷体",12),bg="palegreen",anchor="w" ).place(x=10,y=50)
        id = tk.Label( child, width=18, text=str(data[1]), anchor="w" )
        id.place(x=120, y=60)

        tk.Label( child, text="密码:", width=10,height=2, font=("楷体",12),bg="palegreen",anchor="w" ).place(x=10,y=80)
        pw = tk.Entry( child, width=18)
        pw.insert( 0,data[2][2:] )
        pw.place(x=120, y=90)

        tk.Label( child, text="等级:", width=10,height=2, font=("楷体",12),bg="palegreen",anchor="w" ).place(x=10,y=110)
        grade = ttk.Combobox( child, width=16)
        grade.place(x=120, y=120)
        grade['value'] = ['管理员','普通操作员']
        grade.current(1)
        if data[3] == "管理员":
            grade.current(0)

        tk.Button(child, text="修改信息", width=10,height=1, command=lambda :self.change_account(str(data[1]), name, pw,grade)).place(x=10, y=170 )
        tk.Button(child, text="退出", width=10,height=1, command=child.destroy ).place(x=170, y=170 )
        child.mainloop()



    # 修改信息
    def change_account(self, id, name,pw, grade):
        name = name.get()
        pw = pw.get()
        grade = grade.get()

        if name==""  or  pw==""  or  grade=="":
            tk.messagebox.showwarning(title="修改用户信息", message="请正确填写相关数据!")
        else:
            #  done 修改用户信息
            sql.update_user_info(id, name, pw, grade)
            self.account_list.delete(0,'end')
            self.add_account_list()


    # 删除账号
    def del_account(self):
        loc =  self.account_list.curselection()[0]
        data  =  str( self.account_list.get(loc) ).split("  ")
        title = ['昵称:','账号:','密码:','登记:']
        format_data = ""
        for index  in range( len(data) ):
            format_data += title[ index]+data[index]+"\n"
        if  tk.messagebox.askyesno( title="确认删除", message=data):
            self.account_list.delete(loc)
            # done 数据库修改
            sql.del_user( data[1] )

    # 获取已存在账号信息
    def add_account_list(self):
        # done 获取管理员信息
        data = sql.get_user_info()
        self.account_list.delete(0,'end')
        for  item in  data:
            self.account_list.insert('end', item)


    # 重置输入框
    def reset_entry(self):
        self.name.delete(0,'end')
        self.id.delete(0,'end')
        self.pw.delete(0,'end')
        self.pw2.delete(0,'end')
        self.grade.current(0)



# 管理员登录 - settings.manger_signing( False/ True)
def  manger_sign( frame, tmp_frame):
    child = tk.Toplevel( )
    child.geometry("300x230+100+100")
    child.config( bg="palegreen")
    child.title("管理员登录")

    #  管理员登录信息
    tk.Label(child, width=10, height=2, text="账号: ",  anchor="w",bg="palegreen",  font=("黑体", 12) ).place(x=20, y=20)
    user_id = tk.Entry( child, width=20 )
    user_id.place(x=130, y=25 )

    tk.Label(child, width=10, height=2, text="密码: ",  anchor="w",bg="palegreen",  font=("黑体", 12) ).place(x=20, y=60)
    user_pw = tk.Entry( child, width=20 )
    user_pw.place(x=130, y=65 )

    tk.Label(child, width=13, height=2, text="再次输入密码: ",  anchor="w",bg="palegreen",  font=("黑体", 12) ).place(x=20, y=100)
    user_pw2 = tk.Entry( child, width=20 )
    user_pw2.place(x=130, y=105 )

    # 操作
    tk.Button(child,  width=10, height=1, text="登录", command=lambda : manger_sign_check( frame, tmp_frame, child, user_id.get(), user_pw.get(), user_pw2.get())).place(x=20, y=165)
    tk.Button(child,  width=10, height=1, text="重置", command=lambda : reset_manger_sign_info( user_id, user_pw, user_pw2)).place(x=190, y=165)
    child.mainloop()

#  管理员登录
def manger_sign_check(frame, tmp_frame, child, user_id, user_pw, user_pw2 ):
    if not user_pw==user_pw2:
        print( user_pw, user_pw2)
        tk.messagebox.showwarning( title="管理员登录", message="密码不一致!")
    else:
        # done 管理员登录
        data,name = sql.manger_sign( user_id,  user_pw)
        if data :
            tk.messagebox.showinfo(title="提示", message="管理员:{}\n \t\t登录成功!".format(name))
            child.destroy()
            settings.manger_signing = True
            frame.destroy()
            frame = exec(tmp_frame+"(master=root,width=600, height=350,bg='palegreen' )")
        else:
            tk.messagebox.showwarning(title="警告", message="管理员 登录失败!")


#  重置管理员登录信息
def reset_manger_sign_info( user_id, user_pw, user_pw2 ):
    user_id.delete(0,'end')
    user_pw.delete(0,'end')
    user_pw2.delete(0,'end')


#  实现页面切换
def  change_frame(  frame, tmp_frame ):
     if settings.user["name"] == '':
         tk.messagebox.showerror(title="提示",message="请您登录")
     else:
         if tmp_frame == "manger_frame":# 管理员登录
             manger_sign( frame, tmp_frame)

         else:
            if isinstance(frame, manger_frame):
                settings.manger_signing = False
            frame.destroy()
            frame = exec(tmp_frame+"(master=root,width=600, height=350,bg='palegreen' )")



if __name__ == '__main__':
    root =  tk.Tk()
    root.title("售货管理系统")
    root.geometry("800x400")


    tk.Label( master=root ,text="昵称:{}\t账号:{}".format( settings.user["name"],   settings.user["id"] ))\
        .place(x=50, y=10)

    frame = sign_frame( master=root,width=600, height=350,bg="palegreen")

    purchase_button = tk.Button(master=root, text="登录", width=10,  height=2,
                                command= lambda : change_frame(frame, "sign_frame"))
    purchase_button.place(x=50,  y=40)

    purchase_button = tk.Button(master=root, text="购货管理", width=10,  height=2,
                                command= lambda : change_frame(frame, "purchase_frame"))
    purchase_button.place(x=50,  y=100)

    running_button = tk.Button(master=root, text="零售管理", width=10,  height=2,
                               command= lambda : change_frame(frame, "running_frame") )
    running_button.place(x=50,  y=160)

    warehouse_button = tk.Button(master=root, text="仓库管理", width=10,  height=2,
                                 command= lambda : change_frame(frame, "warehouse_frame" ) )
    warehouse_button.place(x=50,  y=220)

    acount_button = tk.Button(master=root, text="结算管理", width=10,  height=2,
                              command= lambda : change_frame(frame,  "acount_frame" ) )
    acount_button.place(x=50,  y=280)


    manger_button = tk.Button(master=root, text="管理员", width=10,  height=2,
                              command= lambda :  change_frame( frame, "manger_frame" )  )
    manger_button.place(x=50,  y=340)



    root.mainloop()


(2)mysql_conn.py:  数据库操作

[Python] 纯文本查看 复制代码
# -*- coding: UTF-8 -*-
import  settings
import  re
import  time
sql = settings.mysql_conn
cur  =  sql.cursor()

"""
    登录界面
"""
# 验证登录: 成功,返回True,用户姓名;  失败, 返回False,""
def  check_sign(id,  pw):
    code="select  name from users where id='{}'and pw='{}' ".format(id, pw)
    if  cur.execute( code ):
        return  True,cur.fetchall()[0][0]
    else:
        return  False,""

"""
    购货管理
"""
# 获取订单信息( 状态 =“订货”), id name shop phone
def get_goods_info_order():
    code = "select id, name, shop,phone from purchase where state='订货'"
    data = []
    if  cur.execute( code ):
        cur_data = cur.fetchall()
        for item in  cur_data:
            tmp = ""
            for i in  item :
                tmp += str(i)+" "
            data.append( tmp )
    return data


# 获取某订单的详细信息( 状态 =“订货”)
def  get_goods_detailed_info(id): # 订单id
    code  = "SELECT  purchase.*, users.name FROM purchase,users  WHERE purchase.id='{}' AND purchase.user_id=users.id ".format( id )
    data = []
    title = ['订单号:','名字:','价格:','数量:','状态:','店铺名称:','联系方式:','操作员id:','操作员:']
    if cur.execute(code ):
        cur_data = cur.fetchall( )[0]
        for index in  range (len(cur_data) ):
            #print( cur_data, index, len( cur_data))
            data.append(  str( title[ index ]) + str( cur_data[index]) )
    return data


# 订单收货- (1)状态修改为收货; (2)库存修改
def change_goods_state_receving(id, name):
    #  (1)修改状态
    code = "update purchase set  state='收货' where id='{}'".format(id)
    cur.execute( code )
    #  (2)库存修改
    code = "select id from stock where name='{}'".format( name )
    if cur.execute( code ):
        code = "update stock  set sum= sum+( select num from purchase where id='{}') where  id='{}' ".format(id, cur.fetchall()[0][0])
    else:
        cur.execute("select count(*) from  stock")
        s_id = "%06d" % cur.fetchall()[0][0]
        name = name
        cur.execute("select num,  price  from  purchase where id='{}'".format(id))
        num, price  =  cur.fetchall()[0]
        code = "insert into stock(id,name,sum,price) values('{}','{}','{}','{}')".format( s_id, name, num, price)
    print(code )
    cur.execute( code )


# 订单退货- (1)状态修改为 退货 ;
def change_goods_state_back(id):
    code = "update purchase set  state='退货' where id='{}'".format(id)
    cur.execute( code )


# 订货
def order_goods(id, name, num, price,shop,phone, user_id):
    code = "insert into purchase(id,name,num,price,shop,phone,user_id,state) values('{}','{}','{}',{},'{}','{}','{}','订货')".format(id, name, num, price,shop,phone, user_id)
    cur.execute( code )
    print( code )

#  获取当天订单数量
def get_purchase_day_sum( id_time ):
    code = "select count(*) from purchase where id like '{}%'".format( id_time )
    cur.execute(code)
    return  cur.fetchall()[0][0] + 1


"""
    零售管理
"""
#   获取库存商品的name id
def get_stock_goods_name_id():
    code = "select name, id  from  stock"
    cur.execute( code )
    data  = []
    tmp_data= cur.fetchall()
    for item in  tmp_data:
        data_str  = ""
        for i in item :
            data_str += str(i)+"  "
        data.append( data_str )
    return data

#  获取库存商品价格---利润值相加
def get_stock_goods_price(id):
    code = "select  price  from stock where id='{}'".format( id )
    cur.execute( code )
    return "%.2f" % (float (cur.fetchall()[0][0]) * (1+settings.profit))

#  流水账写入数据库
def write_running(  user_id , data ):
    id_time = time.strftime('%Y-%m-%d',time.localtime(time.time()))

    for  item in data:
        cur.execute("select count(*) from running where id like '{}%'".format(id_time))
        id_num = cur.fetchall()[0][0]
        id = str( id_time) +"_"+ "{:0>4d}".format( int( id_num) )

        item = re.sub(r" +"," ",str(item) ).split(" ")
        name = item[0]
        stock_id = item[1]
        price = item[2][:-2]
        num = item[3][:-2]

        # 添加流水账
        code = "insert into running(id, stock_id, num, account, user_id)  values('{}','{}','{}','{}','{}')".format( id,stock_id,num, price,user_id  )
        cur.execute( code )
        # 修改库存
        code = "update stock set sum=sum-{}  where id='{}'".format(num, stock_id )
        cur.execute( code )

"""
    仓库管理
"""
#  获取符合条件的库存信息
def get_stock_goods_price_and_num( name, num, price ):
    code = "select name, id, price,sum from stock where  name like '%{}%' and  sum{} and  price{} order by id asc".format(name, num, price)
    cur.execute( code )
    data = []
    title= ['商品名','编号','价格/元','数量/个']
    data.append( "%-25s%-25s%-25s%-25s" % (title[0],  title[1], title[2],title[3] ))
    ans =  cur.fetchall()
    for item in ans:
        tmp_item = ""
        for i in item:
            tmp_item +=  str(i)+ " "*(25-len( str(i)))
        data.append(tmp_item )
    return  data

# 获取所有库存信息
def get_all_stock_info():
    code = "select name, id, price,sum from  stock order by id asc "
    cur.execute( code )
    data = []
    title= ['商品名','编号','价格/元','数量/个']
    data.append( "%-25s%-25s%-25s%-25s" % (title[0],  title[1], title[2], title[3] ))
    ans =  cur.fetchall()
    for item in ans:
        tmp_item = ""
        for i in item:
            tmp_item += str(i)+ " "*(25-len( str(i)))
        data.append(tmp_item )
    return  data

"""
    结算管理
"""
# 获取管理员name_id
def get_user_name_id():
    code = "select name, id  from users"
    cur.execute( code )
    data = []
    cur_data = cur.fetchall()
    for item in  cur_data:
       data.append( str( item[0] ) + "__" + str( item[1] ) )
    return data

# 获取流水账单或者购货账单
def find_running_or_purchase( type, start_time, end_time, user_id):
    data = []
    if type=="购货账目":
            data.append( " "*10 + "购货账目")
            code = "select id, name, shop ,state from purchase where id>='{}_0000' and  id<='{}_9999' and user_id like '%{}%' ".format( start_time,end_time, user_id)
    else:
            data.append( " "*10 + "零售账目")
            code = "select running.id, stock.name, running.num, running.time from running, stock where  running.stock_id=stock.id and running.id>='{}_0000' and  running.id<='{}_9999' and running.user_id like '%{}%'  ".format(start_time,end_time, user_id)

    # print(code)
    if  cur.execute( code ):
        cur_data = cur.fetchall()
        for item in  cur_data:
            tmp = ""
            for i in  item :
                tmp += str(i)+ "  "
            data.append( tmp )
    return data

# 查看查询数据的详细信息
def  get_detailed_info( type, id ):
    print( type, id )
    data = ""
    if type=="购货账目":
            title = ['购物编号:','商品名:','订单数量:','单价:','状态:','供货商:','联系方式:','操作员:']
            code = "select p.id, p.name,p.num, p.price,p.state, p.shop,p.phone,u.name  from purchase p,users u where p.id='{}' and  p.user_id=u.id ".format( id )

    else:
            title = ['流水编号:','商品名:','销售数量:','价格:','结单时间:','操作员:']
            code = "select r.id, s.name, r.num,r.account, r.time, u.name from running r, stock s, users u where r.id='{}' and s.id=r.stock_id and u.id=r.user_id".format(id)
    cur.execute( code )
    cur_data = cur.fetchall()[0]
    for index  in range( len(title) ):
        data += str( title[index]) + str( cur_data[index] ) + "\n"
    return data


"""
    管理员
"""
# 添加账号
def  add_user(name,  id, pw, grade):
      code = " insert into users(name, id, pw, grade) values('{}','{}','{}','{}')".format( name,  id, pw,grade)
      try:
          cur.execute( code )
          return  True
      except Exception:
          return False

# 删除账号
def del_user( id ):
    code = "delete from  users where id='{}'".format( id )
    cur.execute( code )

# 获取管理员信息
def  get_user_info():
    code = "select name,id,pw,grade from users "
    cur.execute( code )
    data = []
    cur_data = cur.fetchall()

    for item in  cur_data:
        tmp_code = "{}  {}  p:{}  {}".format(  str(item[0]), str(item[1]), str(item[2]),str(item[3]) )
        data.append( tmp_code )
    return data

# 修改用户信息
def update_user_info(id, name, pw, grade):
    code = "update users set name='{}',pw='{}',grade='{}'  where id='{}' ".format(name,pw,grade,id )
    cur.execute( code )


# 管理员登录
def manger_sign( user_id,  user_pw):
    code = "select name from users where id='{}' and pw='{}'".format( user_id, user_pw)
    if cur.execute( code ):
        return True, cur.fetchall()[0][0]
    return False,""


(3)option.config: 配置文件,

[Python] 纯文本查看 复制代码
{'init': 'true', 'host': 'localhost', 'user': 'root', 'password': 'root', 'database': 'warehouse'}


(4)settings.py

[Python] 纯文本查看 复制代码
'''
    设置
        1、数据库信息  set{}
        2、用户信息( 当前登录 ) user{}
        3、设置数据库:
            (1)未设置, 设置;
            (2)已设置, 跳过。
        4、连接数据库  mysql_conn
        5、利润设置    profit
'''

import  pymysql
# -*- coding: UTF-8 -*-

# 利润设置
profit = 0.1

# 数据库设置
set =  dict()
set = { "init":"",
        "host":"",
        "user":"",
        "password":"",
        "database":""
        }

# 当前登录用户
user = {
     "name":"",
     "id":""
}

# 管理员是否登录
manger_signing = False

def read_con():
    with open("option.config", "r")  as f:
        ret = eval(  f.read() )

    for item in ret:
        set[item] = ret[item]

def init_database():
     conn = pymysql.connect(set["host"], set["user"],  set["password"]  )
     cursor = conn.cursor()
     # 创建数据库
     try:
        cursor.execute("create  database warehouse")
        set["database"] = "warehouse"
     except Exception as e :
         print("数据库:", e )
     cursor.close()
     conn.close()

     # 重新连接数据库
     conn = pymysql.connect(set["host"], set["user"],  set["password"] , "warehouse" )
     cursor = conn.cursor()

     # 创建用户表
     # # 用户: 		user: {user_name,id, password, reg_time}
     try:
         cursor.execute("""
                     create table users ( 
                     name varchar(20), 
                     id varchar(20) primary key,
                     pw varchar(20), 
                     grade varchar(20) check( grade in ('管理员','普通操作员')),
                     seg timestamp )
                    """)
     except Exception  as e:
         print("用户表:", e )

     # 添加管理员账号
     # # 账号: root , 密码: toor
     try:
         code = "insert into  users(name,id,pw,grade) values('终极Boss','root','toor','管理员')"
         cursor.execute( code )
     except Exception  as e:
         print("操作员: " , e)

     #创建购货表
     #  # 采购--进货:	purchase: {id,  name, price,  num, statu(定、收、退), shop,phone ,user_id}
     try:
         cursor.execute("""
            create table purchase(
                id      varchar(20) primary key,
                name    varchar(20),
                price   double,
                num     int,
                state   varchar(15) check( state in('定货','收货','退货') ),
                shop    varchar(20),
                phone   varchar(20),
                user_id varchar(20) )
            """ )
     except  Exception  as e:
         print("购货表: ",e)

	 #库存:
     #  # stock: {id, sum,  price, name, }
     try:
         cursor.execute("""
                    create  table stock(
                        id      varchar(20)  primary key,
                        sum     int,
                        price   double,
                        name    varchar(20)
                    )
                    """)
     except  Exception as e:
         print("库存表: ", e)

	 #账目表
     #  # 流水账--卖出:	runuing: {id, stock_id, num, account, time,  user}

     try:
         cursor.execute("""
                    create  table running(
                        id  varchar(20)  primary key,
                        stock_id varchar(20),
                        num  int,
                        account  double,
                        time timestamp,
                        user_id varchar(20) 
                    )
                    """)
     except Exception  as e:
         print("账目表: ", e)


     cursor.close()
     conn.close()


def main():
    read_con()
    if set["init"] == "False":
        init_database()
        set["init"] = "true"
        with  open("option.config","w")  as  f:
            f.write( str( set ))

    return  pymysql.connect(set["host"], set["user"],  set["password"], set["database"] )

# 数据库连接
mysql_conn = main()

'''
if __name__ == "__main__":
    conn = main().cursor()
    conn.close()
'''

图片5.png
图片3.png
图片2.png
图片1.png

免费评分

参与人数 17吾爱币 +18 热心值 +13 收起 理由
zhu1979 + 1 谢谢@Thanks!
sohu-Scass + 1 热心回复!
hxm5201314 + 1 我很赞同!
xccxvb + 2 好大的代码量,厉害了
vethenc + 1 + 1 谢谢@Thanks!
huangxw + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
Miraitowa. + 1 谢谢@Thanks!
wjxlkj + 1 + 1 谢谢@Thanks!
ilove52 + 1 + 1 谢谢@Thanks!
hanna518 + 1 + 1 谢谢@Thanks!
lhnhm00 + 1 + 1 我很赞同!
wushaominkk + 3 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
Fullmoonbaka + 1 + 1 个人感觉tkinter写gui的话,还是写点简单的好,这种就有点太费力了。事件都.
wei00514 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
随梦期初 + 1 + 1 用心讨论,共获提升!
hedy168 + 1 + 1 我很赞同!
hetian + 1 我很赞同!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| 山野村夫-陈墨 发表于 2020-7-13 17:05
随遇而安8 发表于 2020-7-8 15:10
有两处不是很明白,来请教一下@山野村夫-陈墨 ,如下图

701这个意思是,  现在的frame对象是不是 manager_frame类的实例化对象,  如果是那么就证明管理员已经登陆了。 不需要再次登录。   
704这个你可以试试, 我觉得是不行的。 这是我第一次下 tk的多个界面,有些东西我也吃不透 。   
不过我觉得修改为  exec( "frame="+tmp_frame+"( ............)"  ).
 楼主| 山野村夫-陈墨 发表于 2020-7-13 16:55
随遇而安8 发表于 2020-7-8 15:10
有两处不是很明白,来请教一下@山野村夫-陈墨 ,如下图

不好意思。
mysql_conn.py这个文件的 253行修改成下面这样就好了 。
code = "select name from users where id='{}' and pw='{}'  and   grade=';管理员'".format( user_id, user_pw)   。
这是你私信我的问题 。
随梦期初 发表于 2020-2-13 00:00
frefre520 发表于 2020-2-13 00:09
谢谢分享!简单实用!
精妹 发表于 2020-2-13 00:21
这个真的要好好学习下
pwp 发表于 2020-2-13 00:38
谢谢大佬分享。
wahx1314 发表于 2020-2-13 01:07
可以导出报表吗?
a2523188267 发表于 2020-2-13 03:04
很厉害。 这个仓库管理系统很棒
dszsdyx 发表于 2020-2-13 05:51
真的很不错,这个看起来很厉害。我是一是谢谢啦!
头像被屏蔽
poemrain 发表于 2020-2-13 08:48
提示: 作者被禁止或删除 内容自动屏蔽
斌斌A 发表于 2020-2-13 10:23
学习啦!感谢楼主~
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 18:25

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表