Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Select an option

  • Save lovemycodesnippets/f3951d77456769a11ab1aa8a359e9772 to your computer and use it in GitHub Desktop.

Select an option

Save lovemycodesnippets/f3951d77456769a11ab1aa8a359e9772 to your computer and use it in GitHub Desktop.
import tkinter as tk
from tkinter import ttk, messagebox
import datetime
class UserInformationApp:
    def __init__(self, root):
        self.root = root
        self.root.title("User Information Collector")
        self.root.geometry("500x400")
        self.root.resizable(True, True)
        # Create main frame
        main_frame = ttk.Frame(root, padding="20")
        main_frame.grid(row=0, column=0, sticky=(tk.W, tk.E, tk.N, tk.S))
        # Configure grid weights
        root.columnconfigure(0, weight=1)
        root.rowconfigure(0, weight=1)
        main_frame.columnconfigure(1, weight=1)
        # Title
        title_label = ttk.Label(main_frame, text="User Information Collector",
                               font=("Arial", 16, "bold"))
        title_label.grid(row=0, column=0, columnspan=2, pady=(0, 20))
        # Name field
        ttk.Label(main_frame, text="Name:").grid(row=1, column=0, sticky=tk.W, pady=5)
        self.name_entry = ttk.Entry(main_frame, width=30)
        self.name_entry.grid(row=1, column=1, sticky=(tk.W, tk.E), pady=5)
        # Age field
        ttk.Label(main_frame, text="Age:").grid(row=2, column=0, sticky=tk.W, pady=5)
        self.age_entry = ttk.Entry(main_frame, width=30)
        self.age_entry.grid(row=2, column=1, sticky=(tk.W, tk.E), pady=5)
        # Email field
        ttk.Label(main_frame, text="Email:").grid(row=3, column=0, sticky=tk.W, pady=5)
        self.email_entry = ttk.Entry(main_frame, width=30)
        self.email_entry.grid(row=3, column=1, sticky=(tk.W, tk.E), pady=5)
        # Phone field
        ttk.Label(main_frame, text="Phone:").grid(row=4, column=0, sticky=tk.W, pady=5)
        self.phone_entry = ttk.Entry(main_frame, width=30)
        self.phone_entry.grid(row=4, column=1, sticky=(tk.W, tk.E), pady=5)
        # Buttons frame
        button_frame = ttk.Frame(main_frame)
        button_frame.grid(row=5, column=0, columnspan=2, pady=20)
        # Save button
        save_button = ttk.Button(button_frame, text="Save Information", command=self.save_information)
        save_button.pack(side=tk.LEFT, padx=5)
        # Clear button
        clear_button = ttk.Button(button_frame, text="Clear Fields", command=self.clear_fields)
        clear_button.pack(side=tk.LEFT, padx=5)
        # Exit button
        exit_button = ttk.Button(button_frame, text="Exit", command=root.quit)
        exit_button.pack(side=tk.LEFT, padx=5)
        # Status bar
        self.status_var = tk.StringVar()
        self.status_var.set("Ready")
        status_bar = ttk.Label(main_frame, textvariable=self.status_var, relief=tk.SUNKEN)
        status_bar.grid(row=6, column=0, columnspan=2, sticky=(tk.W, tk.E), pady=(20, 0))
        # Bind Enter key to save
        self.root.bind('<Return>', lambda event: self.save_information())
        # Focus on name field
        self.name_entry.focus()
    def validate_input(self):
        """Validate all input fields"""
        name = self.name_entry.get().strip()
        age = self.age_entry.get().strip()
        email = self.email_entry.get().strip()
        phone = self.phone_entry.get().strip()
        # Check if fields are empty
        if not name:
            messagebox.showerror("Error", "Name cannot be empty!")
            self.name_entry.focus()
            return None
        if not age:
            messagebox.showerror("Error", "Age cannot be empty!")
            self.age_entry.focus()
            return None
        if not email:
            messagebox.showerror("Error", "Email cannot be empty!")
            self.email_entry.focus()
            return None
        if not phone:
            messagebox.showerror("Error", "Phone cannot be empty!")
            self.phone_entry.focus()
            return None
        # Validate age is a number
        try:
            age_int = int(age)
            if age_int <= 0:
                messagebox.showerror("Error", "Age must be a positive number!")
                self.age_entry.focus()
                return None
        except ValueError:
            messagebox.showerror("Error", "Age must be a valid number!")
            self.age_entry.focus()
            return None
        # Validate email format
        if '@' not in email:
            messagebox.showerror("Error", "Please enter a valid email address!")
            self.email_entry.focus()
            return None
        return {
            'name': name,
            'age': age_int,
            'email': email,
            'phone': phone
        }
    def save_information(self):
        """Save user information to file"""
        # Validate input
        user_data = self.validate_input()
        if not user_data:
            return
        try:
            # Create or append to file
            with open("user_info.txt", "a") as file:
                file.write(f"\n{'='*50}\n")
                file.write(f"Date/Time: {datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')}\n")
                file.write(f"Name: {user_data['name']}\n")
                file.write(f"Age: {user_data['age']}\n")
                file.write(f"Email: {user_data['email']}\n")
                file.write(f"Phone: {user_data['phone']}\n")
                file.write(f"{'='*50}\n")
            # Show success message
            messagebox.showinfo("Success", "Information saved successfully!")
            self.status_var.set("Information saved successfully!")
            # Clear fields after successful save
            self.clear_fields()
        except Exception as e:
            messagebox.showerror("Error", f"Failed to save information: {str(e)}")
            self.status_var.set(f"Error: {str(e)}")
    def clear_fields(self):
        """Clear all input fields"""
        self.name_entry.delete(0, tk.END)
        self.age_entry.delete(0, tk.END)
        self.email_entry.delete(0, tk.END)
        self.phone_entry.delete(0, tk.END)
        self.name_entry.focus()
        self.status_var.set("Fields cleared")
def main():
    root = tk.Tk()
    app = UserInformationApp(root)
    root.mainloop()
if __name__ == "__main__":
    main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment