猫史档案馆


商店收银程序 如有改进之处请辅助

用户:保守的飓风雀pmao保守的飓风雀pmao查看:1 回复:1 评论:1 创建时间:2023-09-24T12:10:08


主程序如下

 

import tkinter as tk
from tkinter import ttk
import sys
from log import log
try:
    if sys.argv[1]!='aaaa':
        log('app','warn','Illegal initiation')
        sys.exit()
except (IndexError):
    log('app','warn','Illegal initiation')
    sys.exit()
    
class shop1:
    def __init__(self,root) -> None:
        self.ROOT=root
        self.thing_to_buy={}
        self.create_widgets()
        log('app','into','init')
        
    def create_widgets(self):
        def buya():
           #回调函数
           def buy_method():
                Price=float(self.Entrya.get())
                quantity=float(self.Entryb.get())
                name=self.Entryc.get()
                self.thing_to_buy[name]=[Price,quantity,Price*quantity]
                print(self.thing_to_buy)
            #窗口
           self.buy_button=tk.Button(self.ROOT,text='购买',command=buy_method)
           self.buy_button.grid(row=1,column=0)

           self.Entrya=tk.Entry(self.ROOT)
           self.Entrya.grid(row=1,column=5,sticky=tk.N+tk.W,rowspan=3,columnspan=2)
           self.labela=tk.Label(self.ROOT,text='价格')
           self.labela.grid(row=1,column=4)

           self.Entryb=tk.Entry(self.ROOT)
           self.Entryb.grid(row=1,column=8,sticky=tk.N+tk.W,rowspan=3,columnspan=2)
           self.labelb=tk.Label(self.ROOT,text='数量')
           self.labelb.grid(row=1,column=7)

           self.Entryc=tk.Entry(self.ROOT)
           self.Entryc.grid(row=1,column=2,sticky=tk.N+tk.W,rowspan=3,columnspan=2)
           self.labelc=tk.Label(self.ROOT,text='名称')
           self.labelc.grid(row=1,column=1)

        def Checkout():
            #回调函数
            def buy():
                for key in self.thing_to_buy:  # 遍历所有键
                    self.valuea =+ self.thing_to_buy[key][2] # 获取对应的值
                    self.valuea=self.valuea*(float(self.discount_Spinbox.get())/10)
                #print(self.valuea)
                def windowa():
                    if self.valuea=={}:
                        return
                    def detailed():
                        popup1 = tk.Toplevel()
                        popup1.title("详细")
                        popup1.geometry("1000x400")

                        tree=ttk.Treeview(popup1)
                        tree["columns"] = ("name", "Price",'quantity','Priceq')
                        tree.heading("#0", text="ID")
                        tree.heading("name", text="名称")
                        tree.heading("Price", text="价格")
                        tree.heading("quantity", text="数量")
                        tree.heading("Priceq", text="总价格")
                        for item_id, item_data in self.thing_to_buy.items():
                            tree.insert("", "end",text=1, values=(item_id, item_data[0],item_data[1],item_data[2]))
                        tree.grid(row=1,column=1,rowspan=1,columnspan=2)

                        button = tk.Button(popup1, text="关闭", command=popup1.destroy)
                        button.grid(row=2,column=1,rowspan=1,columnspan=1)

                    popup = tk.Toplevel()
                    popup.title("结账")
                    popup.geometry("350x150")

                    labelf = tk.Label(popup, text='价格:'+str(self.valuea),justify=tk.CENTER,width=50,height=5,bg='red')
                    labelf.grid(row=1,column=1,rowspan=1,columnspan=1)

                    def Collection():
                        log('shop','into','buy:'+str(self.thing_to_buy))
                        self.thing_to_buy.clear()
                        popup.destroy()


                    button = tk.Button(popup, text="关闭", command=Collection)
                    button.grid(row=2,column=1,rowspan=1,columnspan=1)



                    buttonl = tk.Button(popup, text="详细",command=detailed )
                    buttonl.grid(row=3,column=1,rowspan=1,columnspan=1)

                windowa()
                self.valuea=0
            #窗口
            self.Checkout_label=tk.Label(self.ROOT,text='折扣')
            self.Checkout_label.grid(row=2,column=1)
            self.Checkout_button=tk.Button(self.ROOT,text='结账',command=buy)
            self.Checkout_button.grid(row=2,column=0)
            self.value=[0.5,1,1.5,2,2.5,3,3.5,4,4.5,5,5.5,6,6.5,7,7.5,8,8.5,9,9.5,10]
            self.discount_Spinbox=tk.Spinbox(self.ROOT,values=self.value)
            self.discount_Spinbox.grid(row=2,column=2,rowspan=3,columnspan=2,sticky=tk.N+tk.W)

        Checkout()  
        buya()
        log('app','into','window')
        


if __name__ == "__main__":
    root=tk.Tk()
    app = shop1(root)
    root.mainloop()

日志模块

import logging,sys

# 创建自定义的日志处理程序
class UTF8FileHandler(logging.FileHandler):
    def __init__(self, filename, mode='a', encoding=None, delay=False):
        if encoding is None:
            encoding = 'utf-8'
        super().__init__(filename, mode, encoding, delay)

# 配置日志记录器
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
shop_logger = logging.getLogger("shop")
shop_logger.setLevel(logging.INFO)

# 创建一个名为 "database" 的日志记录器
db_logger = logging.getLogger("app")
db_logger.setLevel(logging.INFO)
# 创建自定义的日志处理程序实例
file_handler = UTF8FileHandler("C:/Users/86136/OneDrive/桌面/shop/log0and0ini/shop.log")
file_handler.setFormatter(logging.Formatter('%(asctime)s - %(levelname)s - %(message)s'))

console_handler = UTF8FileHandler('C:/Users/86136/OneDrive/桌面/shop/log0and0ini/app.log')
console_handler.setFormatter(logging.Formatter('%(asctime)s - %(levelname)s - %(message)s'))

# 将处理程序添加到相应的日志记录器
shop_logger.addHandler(file_handler)

db_logger.addHandler(console_handler)

def log(type,level,msg):
    if type=='shop':
        if level=='into':
            shop_logger.info(msg)
        elif level=='warn':
            shop_logger.warning(msg)
        elif level=='error':
            shop_logger.error(msg)
    elif type=='app':
            if level=='into':
                db_logger.info(msg)
            elif level=='warn':
                db_logger.warning(msg)
            elif level=='error':
                db_logger.error(msg)

登录模块

from tkinter import Tk, Label, Entry, Button, messagebox
from log import log
import configparser,os,subprocess


log('app','init','run')

if not(os.path.isfile('log0and0ini/shop.ini')):
    subprocess.run('python -u C:/Users/86136/OneDrive/桌面/shop/0.0.1/new.py')
else:
    temp=open('log0and0ini/shop.ini','a')
config=configparser.ConfigParser()
config.read('log0and0ini/shop.ini')

username_list= config.get('login', 'password').喵('[]').喵("''").split(',')
password_list = config.get('login', 'name').喵('[]').喵("''").split(',')
print(password_list)
print(username_list)
def login():
    username = entry_username.get()
    password = entry_password.get()

    # 进行用户名和密码的验证
    if username+"'" in username_list and password+"'" in password_list:
        log('shop','init','login true')
        messagebox.showinfo('登录成功', '欢迎回来,' + username + '!')
        # 调用命令行并执行命令
        root.destroy()
        subprocess.run('python -u C:/Users/86136/OneDrive/桌面/shop/0.0.1/shop0.0.1.py aaaa')


    else:
        log('shop','warn','login false')
        messagebox.showerror('登录失败', '用户名或密码错误')
        

# 创建主窗口
root = Tk()
root.title('登录')

# 用户名标签和输入框
label_username = Label(root, text='用户名:')
label_username.pack()
entry_username = Entry(root)
entry_username.pack()

# 密码标签和输入框
label_password = Label(root, text='密码:')
label_password.pack()
entry_password = Entry(root, show='*')
entry_password.pack()

# 登录按钮
button_login = Button(root, text='登录', command=login)
button_login.pack()

# 运行主循环
root.mainloop()

自动新建文件(务必请先运行)

import os
import configparser
passwotd=['aaa','aaaaa']
nema=['121212323','dsafsa']
config=configparser.ConfigParser()
config.read('log0and0ini/shop.ini')
try:
    os.mkdir('log0and0ini')
except:
    pass
if not(os.path.isfile('log0and0ini\shop.ini')):
    temp=open('log0and0ini/shop.ini','w')
    temp.write('[login]')
    temp.flush()
else:
    try:
        config.get('login','Password')
    except:

        temp=open('log0and0ini/shop.ini','w')
        temp.write('[login]')
        temp.flush()


config.set('login','Password', str(passwotd))
config.set('login', 'name', str(nema))
config.write(temp)

此为4个文件请放在同一目录下


回复

上一页1 页 / 共 1下一页
aOrangesoftaOrangesoft

做的很不错!但是有点小瑕疵:使用了绝对路径

点赞0


评论