You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Python与Tkinter的GUI开发:实现客户ID自动生成并每次提交后递增1

Solution for Auto-Incrementing Unique Customer IDs

Got it, let's fix that auto-incrementing customer ID feature for your Tkinter app. The key here is to make sure the ID persists even when you close and reopen the program—so we'll read the last used ID from your customer.txt file, or start fresh with CUS1001 if the file is new/empty.

Step-by-Step Changes:

  • Add ID tracking: We'll create a helper function to fetch the next valid ID by checking existing entries in your CSV.
  • Modify storage: Update the CSV writing logic to include the generated ID with each customer entry.
  • Handle edge cases: Make sure we handle empty files or missing files gracefully to avoid errors.

Modified Full Code:

from tkinter import *
import tkinter.simpledialog
import csv
from tkinter import messagebox
import os

def get_next_customer_id():
    # Check if the customer file exists and isn't empty
    if not os.path.exists('customer.txt') or os.path.getsize('customer.txt') == 0:
        return "CUS1001"
    
    # Read the last line to get the highest existing ID
    with open('customer.txt', 'r') as csvfile:
        reader = csv.reader(csvfile)
        last_id = None
        for row in reader:
            if row:  # Skip any empty rows in the file
                last_id = row[0]
        
        if not last_id:
            return "CUS1001"
        
        # Extract and increment the numeric part of the ID
        numeric_part = int(last_id[3:])  # Grab "1001" from "CUS1001"
        next_numeric = numeric_part + 1
        return f"CUS{next_numeric:04d}"  # Ensure 4-digit formatting, e.g., CUS1002

def store_member():
    # Generate the next unique ID first
    customer_id = get_next_customer_id()
    
    afirstname = firstname.get()
    asurname = surname.get()
    aemail = email.get()
    aemailaddress = emailaddress.get()
    fullemail = aemail + aemailaddress
    aday = day.get()
    amonth = month.get()
    ayear = year.get()
    date_of_birth = aday + "." + amonth + "." + ayear
    agender_choice = gender_choice.get()
    amobile = mobile.get()
    fullmobile = "44" + amobile
    
    # Validation checks (refined for clarity)
    if afirstname == "" or asurname == "" or aemail == "" or amobile == "":
        messagebox.showerror("Error", "Please fill in all required fields (First Name, Last Name, Email, Mobile)")
        clear_enter_screen()
        return
    elif agender_choice not in [1, 2]:
        messagebox.showerror("Error", "Please select a gender option")
        clear_enter_screen()
        elif(len(fullmobile)!=12):
        messagebox.showerror("Error", "Mobile number must be 10 digits (without the +44 prefix)")
        clear_enter_screen()
        return
    
    # Confirm submission with the generated ID
    result = messagebox.askquestion("Submit", 
                                    f"You are about to save this customer:\nID: {customer_id}\nName: {afirstname} {asurname}\nEmail: {fullemail}")
    if(result == 'yes'):
        # Write ID + customer data to CSV
        with open('customer.txt' , 'a', newline='') as csvfile:
            writer = csv.writer(csvfile)
            writer.writerow([customer_id, afirstname, asurname, fullemail, date_of_birth, agender_choice, amobile])
        messagebox.showinfo("Success", f"Customer {customer_id} stored successfully!")
        clear_enter_screen()
    else:
        clear_enter_screen()

def back():
    print('Back button clicked')
    # Add navigation logic here if you expand the app later

def clear_enter_screen():
    firstname.set("")
    surname.set("")
    email.set("")
    emailaddress.set("@hotmail.com")
    day.set("1")
    month.set("January")
    year.set("2000")
    mobile.set("")
    gender_choice.set(0)  # Reset gender radio buttons to unselected

def help_entry():
    messagebox.showinfo("Help: Customer Entry", 
                        "Fill out all required fields:\n- First Name, Last Name, Email, Mobile are mandatory\n- Select Male/Female\n- Mobile number needs 10 digits (no +44)\n- Use dropdowns to select birthday details")

root = Tk()
root.title("Customer Information Manager")
root.config(background = 'light grey')

# Define GUI variables
firstname = StringVar()
surname = StringVar()
email = StringVar()
emailaddress = StringVar()
day = StringVar()
month = StringVar()
year = StringVar()
gender_choice = IntVar(value=0)  # Initialize to unselected
mobile = StringVar()

# GUI Layout
# Row 0: Heading
lblHeading = Label(root, text = "New Customer Entry" , font = ('Arial' , 24 , "bold"), bg='light grey').grid(row = 0, column = 0, columnspan = 4, padx=20, pady=10)

# Row 1: First Name
lblFirstName = Label(root, text = "First Name" , font= ('Arial', 14, "bold"), bg='light grey').grid(row=1, column=1, padx=10, pady=5)
entryFirstName = Entry(root, textvariable = firstname, width = 20). grid(row=1, column=2, padx=10, pady=5)

# Row 2: Last Name
lblLastName = Label(root, text = "Last Name" , font = ('Arial' , 14, "bold"), bg='light grey').grid(row = 2, column=1, padx=10, pady=5)
entryLastName = Entry(root, textvariable = surname, width = 20).grid(row=2 , column=2, padx=10, pady=5)

# Row 3: Gender
lblGender = Label(root, text = "Gender" , font=('Arial', 14, "bold"), bg='light grey').grid(row=3, column=0, padx=10, pady=5)
radiobutton1 = Radiobutton(root, text = "Male", variable= gender_choice, value=1, font=('Arial', 14), bg='light grey').grid(row=3, column=1, padx=5)
radiobutton2 = Radiobutton(root, text = "Female", variable=gender_choice,value=2, font=('Arial',14), bg='light grey').grid(row=3, column=2, padx=5)

# Row 4: Email
lblemail = Label(root,text ="Email" , font=('Arial',14, "bold"), bg='light grey').grid(row=4, column = 0, padx=10, pady=5)
entryemail = Entry(root, textvariable = email, width = 20).grid(row=4, column=1, padx=10, pady=5)
# Email domain dropdown
list1 = ['@hotmail.com', '@gmail.com' , '@yahoo.com']
droplist = OptionMenu(root, emailaddress, *list1)
droplist.config(width = 15, bg='white')
emailaddress.set('@hotmail.com')
droplist.grid(row=4, column=2, padx=10, pady=5)

# Row 5: Birthday
lblbirthday = Label(root, text = 'Birthday' , font=('Arial' , 14, 'bold'), bg='light grey').grid(row=5 , column=0, padx=10, pady=5)
# Day dropdown (1-31)
list2 = [str(i) for i in range(1,32)]
droplist = OptionMenu(root,day,*list2)
droplist.config(width=5, bg='white')
day.set('1')
droplist.grid(row=5, column=1, padx=5, pady=5)
# Month dropdown (full list)
list3 = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']
droplist = OptionMenu(root,month,*list3)
droplist.config(width=15, bg='white')
month.set('January')
droplist.grid(row=5, column=2, padx=5, pady=5)
# Year dropdown (1900-2024)
list4 = [str(i) for i in range(1900, 2025)]
droplist = OptionMenu(root, year, *list4)
droplist.config(width=8, bg='white')
year.set('2000')
droplist.grid(row=5, column=3, padx=5, pady=5)

# Row 6: Mobile
lblmobile= Label(root, text = "Mobile (without +44)" , font=('Arial' , 14, "bold"), bg='light grey').grid(row=6, column=1, padx=10, pady=5)
entrymobile = Entry(root, textvariable = mobile, width=20).grid(row=6, column=2, padx=10, pady=5)

# Row 7: Buttons
submit_button = Button(root,text = "Store Customer", command=store_member , bg='orange', fg='white', font=('Arial',12)).grid(row=7, column=0, sticky=E, padx=20, pady=18)
clear_button = Button(root,text = "Clear Form", command=clear_enter_screen , bg='blue', fg='white', font=('Arial',12)).grid(row=7, column=1, padx=10, pady=18)
help_button = Button(root,text = "Help", command=help_entry , bg='green', fg='white', font=('Arial',12)).grid(row=7, column=2, padx=10, pady=18)
back_button = Button(root,text = "Back", command=back , bg='red', fg='white', font=('Arial',12)).grid(row=7, column=3, sticky=W, padx=20, pady=18)

root.mainloop()

Key Improvements Explained:

  1. get_next_customer_id() Function:

    • Checks if your customer.txt file exists and has content.
    • Reads the last entry's ID, extracts the numeric portion, increments it, and formats it back to the CUSXXXX pattern.
    • Falls back to CUS1001 if the file is new or empty.
  2. Updated store_member():

    • Generates the unique ID before running validation.
    • Includes the ID in the CSV row when saving customer data.
    • Shows the ID in the confirmation dialog so you can verify it before saving.
    • Adds a success message to confirm the customer was stored.
  3. Quality of Life Fixes:

    • Expanded dropdown options for days, months, and years to be more realistic.
    • Added a dedicated Clear Form button and updated the clear function to reset gender selection.
    • Refined error messages to be more user-friendly.
    • Added styling to match the app's light grey background.

内容的提问来源于stack exchange,提问作者blackcripton

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 13:58:15