Python - 快递追踪管理系统



在这里,我们将学习如何使用 Python tkinter 库和 SQLite 数据库设计一个快递追踪管理系统,该系统具有用户注册、登录以及通过手机号码追踪货物状态等功能。

功能

此应用程序包含以下功能:

  • 重复注册和登录选项
  • 它还支持通过手机号码追踪货物。
  • 包括告知客户产品和目的地信息。

所需库

要创建快递追踪管理系统,您需要安装以下库:

  • tkinter − 它是一个 Python 的内置 GUI 接口,主要用于创建基于窗口的应用程序。它用于开发用户界面,以便用户能够与系统交互。
  • SQLite3 − SQLite 是一个 C 库,它以 x86 机器码实现,是一个轻量级的基于磁盘的数据库。它非常适合小型应用程序,在这种应用程序中不需要数据库服务器的全部服务。使用 SQLite 不需要单独安装,因为它包含在 Python 中。
  • random − random 模块用于获取产品的随机货物编号。此模块是 Python 的一部分,您无需安装它。

应用程序工作流程和功能组件

1. 数据库设置

首先创建一个 SQLite 数据库,并定义一个 user 表来存储用户的用户名、密码和手机号码。CREATE TABLE IF NOT EXISTS 查询确保表仅在不存在时才创建。

2. 类结构

程序的主要功能位于主类中。在这里,我们看到控制 GUI 行为和数据库交互的所有变量和方法。

3. 登录

login() 方法将用户输入的凭据与 SQLite 数据库中的记录进行比较。如果凭据匹配,则对用户进行身份验证并允许其追踪产品。

4. 新用户注册

new_user() 方法中,我们允许新用户通过输入用户名、密码和手机号码创建帐户。系统会在将新记录添加到数据库之前检查用户名是否存在。

5. 追踪快递

登录后,用户可以通过输入手机号并选择产品来追踪他们的快递。快递方法从数据库中检索快递详情,在UI中显示它们,并生成一个随机的产品ID。

6. GUI 组件

组件方法定义所有GUI组件,包括标签、输入字段、按钮和组合框。它创建登录、注册和货物追踪表单的主布局。

快递追踪管理系统 Python 代码

以下是设计此应用程序的完整代码:

from tkinter import *
from tkinter import messagebox as ms
from tkinter import ttk
import sqlite3
import random

# Database
with sqlite3.connect('Akash5.db') as db:
   c = db.cursor()
try:
   c.execute('CREATE TABLE IF NOT EXISTS user (username TEXT NOT NULL, password TEXT NOT NULL, mobile TEXT NOT NULL);')
except:
   pass
db.commit()
db.close()

class main:
   def __init__(self, master):
      self.master = master

      self.username = StringVar()
      self.password = StringVar()
      self.n_username = StringVar()
      self.n_password = StringVar()
      self.n_reg = StringVar()
      self.n_mobile = StringVar()
      self.mobile11 = StringVar()
      self.destination = StringVar()
      self.selected_product = StringVar()
      self.widgets()

   def login(self):
      with sqlite3.connect('Akash5.db') as db:
         c = db.cursor()

         find_user = ('SELECT * FROM user WHERE username = ? and password = ?')
         c.execute(find_user, [(self.username.get()), (self.password.get())])
         result = c.fetchall()

      if result:
         self.track()
      else:
         ms.showerror('Oops!', 'Username Not Found.')

   def new_user(self):
      with sqlite3.connect('Akash5.db') as db:
         c = db.cursor()
      if self.n_username.get() != ' ' and self.n_password.get() != ' ' and self.n_mobile.get() != ' ':
         find_user = ('SELECT * FROM user WHERE username = ?')
         c.execute(find_user, [(self.n_username.get())])

      if c.fetchall():
         ms.showerror('Error!', 'Username Taken. Try a Different One.')
      else:
         insert = 'INSERT INTO user(username, password, mobile) VALUES(?, ?, ?)'
         c.execute(insert, [(self.n_username.get()), (self.n_password.get()), (self.n_mobile.get())])
         db.commit()

         ms.showinfo('Success!', 'Account Created!')
         self.log()
      else:
         ms.showerror('Error!', 'Please Enter the details.')

   def consignment(self):
      try:
         with sqlite3.connect('Akash5.db') as db:
            c = db.cursor()

         find_user = ('SELECT * FROM user WHERE mobile= ?')
         c.execute(find_user, [(self.mobile11.get())])
         result = c.fetchall()

         if result:
            self.track()
            self.crff.pack_forget()
            self.head['text'] = self.username.get() + '\n Your Product Details'

            # Get the latest value of destination before packing the frame
            destination_value = self.destination.get()

            # Update product details in consi frame
            self.consi.pack()
            for widget in self.consi.winfo_children():
               widget.destroy()  # Clear previous widgets in consi frame

               Label(self.consi, text='Product ID:', font=('Arial', 15), pady=5, padx=5, fg="white", bg="black").grid(sticky=W)
               Label(self.consi, text=random.randint(565154, 99994216), font=('Arial', 13), pady=5, padx=5, fg="white", bg="black").grid(row=0, column=1)

               Label(self.consi, text='Product Name:', font=('Arial', 15), pady=5, padx=5, fg="white", bg="black").grid(sticky=W)
               Label(self.consi, text=self.selected_product.get(), font=('Arial', 13), pady=5, padx=5, fg="white", bg="black").grid(row=1, column=1)

               Label(self.consi, text='Destination:', font=('Arial', 15), pady=5, padx=5, fg="white", bg="black").grid(sticky=W)
               Label(self.consi, text=destination_value, font=('Arial', 13), pady=5, padx=5, fg="white", bg="black").grid(row=2, column=1)

               Label(self.consi, text='Product Status: Pending', font=('Arial', 15), pady=5, padx=5, fg="white", bg="black").grid(row=3, column=1)

               Button(self.consi, text='Back', bd=2, font=('Arial', 13), padx=6, pady=6, command=self.track1, bg="gray").grid(row=4, column=0)
         else:
            ms.showerror('Oops!', 'Mobile Number Not Found.')
      except:
         ms.showerror('Oops!', 'Mobile Number Not Found.')

   def track1(self):
      self.consi.pack_forget()
      self.head['text'] = self.username.get() + '\n Track your Product'
      self.crff.pack()

   def log(self):
      self.username.set('')
      self.password.set('')
      self.crf.pack_forget()
      self.head['text'] = 'Login'
      self.logf.pack()

   def cr(self):
      self.n_username.set('')
      self.n_password.set('')
      self.logf.pack_forget()
      self.head['text'] = 'Create Account'
      self.crf.pack()

   def track(self):
      self.logf.pack_forget()
      self.head['text'] = self.username.get() + '\n Track your Product'
      self.crff.pack()

   def widgets(self):
      self.head = Label(self.master, text='LOGIN', font=('Arial', 20), pady=10, fg="white", bg="black")
      self.head.pack()

      self.logf = Frame(self.master, padx=10, pady=10, bg="black")

      Label(self.logf, text='Username:', font=('Arial', 15), pady=5, padx=5, fg="white", bg="black").grid(sticky=W)
      Entry(self.logf, textvariable=self.username, bd=3, font=('Arial', 15)).grid(row=0, column=1)
      Label(self.logf, text='Password:', font=('Arial', 15), pady=5, padx=5, fg="white", bg="black").grid(sticky=W)
      Entry(self.logf, textvariable=self.password, bd=3, font=('Arial', 15), show='*').grid(row=1, column=1)
      Button(self.logf, text=' Login ', bd=2, font=('Arial', 13), padx=6, pady=6, command=self.login, bg="gray").grid(row=8, column=0)
      Button(self.logf, text=' New user ', bd=2, font=('Arial', 13), padx=6, pady=6, command=self.cr, bg="gray").grid(row=8, column=1)

      self.logf.pack()

      self.crf = Frame(self.master, padx=10, pady=10, bg="black")
      Label(self.crf, text='Username:', font=('Arial', 15), pady=5, padx=5, fg="white", bg="black").grid(sticky=W)
      Entry(self.crf, textvariable=self.n_username, bd=3, font=('Arial', 15)).grid(row=0, column=1)

      Label(self.crf, text='Password:', font=('Arial', 15), pady=5, padx=5, fg="white", bg="black").grid(sticky=W)
      Entry(self.crf, textvariable=self.n_password, bd=3, font=('Arial', 15), show='*').grid(row=1, column=1)

      Label(self.crf, text='Mobile No.:', font=('Arial', 15), pady=5, padx=5, fg="white", bg="black").grid(sticky=W)
      Entry(self.crf, textvariable=self.n_mobile, bd=3, font=('Arial', 15)).grid(row=5, column=1)

      Button(self.crf, text='Create Account', bd=2, font=('Arial', 13), padx=6, pady=6, command=self.new_user, bg="gray").grid(row=11, column=0)
      Button(self.crf, text='Go to Login', bd=2, font=('Arial', 13), padx=6, pady=6, command=self.log, bg="gray").grid(row=11, column=1)

      self.crff = Frame(self.master, padx=10, pady=10, bg="black")
      Label(self.crff, text='Consignment No:', font=('Arial', 15), pady=5, padx=5, fg="white", bg="black").grid(sticky=W)
      Entry(self.crff, bd=3, font=('Arial', 15)).grid(row=0, column=1)
      Label(self.crff, text='Mobile no:', font=('Arial', 15), pady=5, padx=5, fg="white", bg="black").grid(sticky=W)
      Entry(self.crff, bd=3, textvariable=self.mobile11, font=('Arial', 15)).grid(row=1, column=1)

      Label(self.crff, text="Select Product:", font=('Arial', 15), pady=5, padx=5, fg="white", bg="black").grid(sticky=W)
      self.selected_product.set("Bag")
      products = ["Bag", "Colgate", "Shoe", "Redmi 2", "Jeans", "Mac", "Ipad", "Pen", "Book", "Shirt"]
      product_menu = ttk.Combobox(self.crff, textvariable=self.selected_product, values=products, font=('Arial', 13))
      product_menu.grid(row=2, column=1)

      Label(self.crff, text="Destination:", font=('Arial', 15), pady=5, padx=5, fg="white", bg="black").grid(sticky=W)
      Entry(self.crff, textvariable=self.destination, bd=3, font=('Arial', 15)).grid(row=3, column=1)

      Button(self.crff, text='Track', bd=2, font=('Arial', 13), padx=6, pady=6, command=self.consignment, bg="gray").grid(row=4, column=0)

      self.consi = Frame(self.master, padx=10, pady=10, bg="black")
      Label(self.consi, text='Product ID:', font=('Arial', 15), pady=5, padx=5, fg="white", bg="black").grid(sticky=W)
      Label(self.consi, text=random.randint(565154, 99994216), font=('Arial', 13), pady=5, padx=5, fg="white", bg="black").grid(row=0, column=1)

      Label(self.consi, text='Product Name:', font=('Arial', 15), pady=5, padx=5, fg="white", bg="black").grid(sticky=W)
      Label(self.consi, text=self.selected_product.get(), font=('Arial', 13), pady=5, padx=5, fg="white", bg="black").grid(row=1, column=1)

      Label(self.consi, text='Destination:', font=('Arial', 15), pady=5, padx=5, fg="white", bg="black").grid(sticky=W)
      Label(self.consi, text=self.destination.get(), font=('Arial', 13), pady=5, padx=5, fg="white", bg="black").grid(row=2, column=1)

      Label(self.consi, text='Product Status: Pending', font=('Arial', 15), pady=5, padx=5, fg="white", bg="black").grid(row=3, column=1)

      Button(self.consi, text='Back', bd=2, font=('Arial', 13), padx=6, pady=6, command=self.track1, bg="gray").grid(row=4, column=0)

if __name__ == '__main__':
   root = Tk()
   root.title('Track Consignment')
   root.geometry('800x450+300+300')
   root.configure(bg='black')  # Set background to black
   main(root)
   root.mainloop()

应用程序说明及输出截图

1. 登录界面

这是用户启动应用程序时看到的第一个界面。登录界面包括:用户名和密码输入字段,登录和新用户注册按钮。

Courier Tracking Management System 1

2. 新用户注册界面

当用户点击“新用户”按钮时,他们将进入注册界面。我们创建了新用户名“Rama DAS”并添加了密码和手机号。此表单要求用户提供:

Courier Tracking Management System 2

3. 快递追踪界面

用户成功登录后,将进入货物追踪界面。他们可以输入手机号查找与其关联的货物。选择产品并查看其详细信息,例如目的地和状态。

Courier Tracking Management System 3

4. 快递详情输出

输入手机号和产品后,系统将显示快递详情,例如:产品ID(随机生成)、产品名称、目的地、状态(默认为待处理)。

Courier Tracking Management System 4

代码说明

  • 导入库 - 脚本首先导入一些模块,主要用于Tkinter中的GUI开发,sqlite3中的数据库操作以及random中的随机数获取。
  • 数据库设置 - 它创建一个名为“Akash5.db”的新SQLite数据库,如果不存在,它还会设置用户表,用于存储用户信息,例如凭据和/或手机号。
  • 类定义 - 这是一个主类,包含所有应用程序逻辑、数据库连接和GUI管理。
  • 初始化 - 在__init__方法中,类创建StringVar变量,用于存储用户的输入和产品详细信息。
  • 登录方法 - 登录方法检查用户输入与数据库中存储的数据是否一致。如果找到,它将调用track()方法;如果没有找到,则显示错误消息。
  • 新用户方法 - 称为new_user的方法负责创建帐户。它首先验证给定的用户名是否在数据库中可用,然后为新用户创建一个新条目。
  • 货物追踪方法 - 在此方法中,用户可以通过输入手机号作为代码来追踪货物。如果找到手机号,则显示货物信息。
  • Track1 方法 - 通过这种方式,货物详细信息框架被最小化,而产品追踪界面出现在屏幕上。
  • Log 方法 - log方法清除登录文本字段并切换到登录界面。
  • Cr 方法 - cr方法清除注册字段并转到帐户创建屏幕。
  • Track 方法 - 此方法将GUI切换到货物追踪框架。
  • Widgets 方法 - 此方法显示整个GUI,包括登录、注册、货物追踪和产品详情框架。
  • 登录框架 - 它包含登录框架(logf),其中包含用于输入用户名和密码的框,以及“登录”和“创建帐户”按钮。
  • 注册框架 - 注册框架 (crf) 包含用户名、密码和手机号,以及创建新帐户和转到登录的选项。
  • 货物追踪框架 - 在货物追踪框架 (crff) 中,有一些字段,例如货物编号、用于识别客户的手机号和产品选择,以及用于追踪货物的目的地货物按钮。
  • 货物详情框架 - 货物详情框架 (consi) 显示货物的详细信息,包括产品的ID、名称和目的地。
  • 随机产品ID - randint() 方法为货物详情选择一个随机产品ID。
  • 产品选择 - 对于允许用户选择产品的字段,这里使用的是下拉列表(借助ttk.combobox)。
  • 错误处理 - 使用最简单的异常处理形式,其中使用消息框显示无效输入或未找到手机号的错误消息。
  • 主执行 - 脚本是第一个TI-Kinter脚本,它通过提供标题和大小创建了一个GUI窗口,并通过创建主类的实例来启动应用程序。
python_reference.htm
广告