import tkinter as tk from tkinter import filedialog, messagebox from random import shuffle, choice class WheelOfNames: def __init__(self): self.root = tk.Tk() self.root.title("Wheel of Names") self.root.geometry("600x400") self.names = [] # Create the menu bar self.menu_bar = tk.Menu(self.root) self.root.config(menu=self.menu_bar) # File menu self.file_menu = tk.Menu(self.menu_bar, tearoff=0) self.menu_bar.add_cascade(label="File", menu=self.file_menu) self.file_menu.add_command(label="Load Names from File", command=self.upload_file) self.file_menu.add_command(label="Save Names to File", command=self.save_file) self.file_menu.add_separator() self.file_menu.add_command(label="Clear Names", command=self.clear_names) self.file_menu.add_separator() self.file_menu.add_command(label="Exit", command=self.root.quit) self.name_entry = tk.Entry(self.root, width=50) self.name_entry.pack(pady=10) self.add_button = tk.Button(self.root, text="Add Name", command=self.add_name) self.add_button.pack() self.name_list_text = tk.Text(self.root, height=10, width=60) self.name_list_text.pack(pady=10) self.group_size_var = tk.StringVar() self.group_size_var.trace_add("write", self.update_sort_button_text) self.group_size_entry = tk.Entry(self.root, width=10, textvariable=self.group_size_var) self.group_size_entry.pack(side=tk.LEFT, padx=10, pady=10) self.sort_button = tk.Button(self.root, text="Sort into Groups", command=self.sort_into_groups) self.sort_button.pack(side=tk.LEFT, padx=10, pady=10) self.groups_text = tk.Text(self.root, height=10, width=60) self.groups_text.pack(pady=10) self.spin_button = tk.Button(self.root, text="Spin", command=self.spin_wheel) self.spin_button.pack() self.result_label = tk.Label(self.root, text="", font=("Arial", 24)) self.result_label.pack(pady=20) def add_name(self): name = self.name_entry.get().strip() if name: self.names.append(name) self.update_name_list_text() self.name_entry.delete(0, tk.END) def upload_file(self): file_path = filedialog.askopenfilename(filetypes=[("Text Files", "*.txt")]) if file_path: with open(file_path, 'r') as file: names = file.read().splitlines() self.names.extend(names) self.update_name_list_text() def save_file(self): file_path = filedialog.asksaveasfilename(defaultextension=".txt", filetypes=[("Text Files", "*.txt")]) if file_path: with open(file_path, 'w') as file: for name in self.names: file.write(name + "\n") def clear_names(self): self.names = [] self.update_name_list_text() def update_name_list_text(self): self.name_list_text.delete(1.0, tk.END) for name in self.names: self.name_list_text.insert(tk.END, name + "\n") def update_sort_button_text(self, *args): group_size = self.group_size_var.get().strip() if group_size.isdigit() and int(group_size) > 0: self.sort_button.config(text=f"Sort into Groups of {group_size}") else: self.sort_button.config(text="Sort into Groups") def sort_into_groups(self): group_size = self.group_size_var.get().strip() if not group_size.isdigit(): messagebox.showerror("Error", "Please enter a valid group size.") return group_size = int(group_size) if group_size <= 0: messagebox.showerror("Error", "Group size must be greater than zero.") return if not self.names: messagebox.showerror("Error", "Please add or upload names first.") return shuffle(self.names) groups = [] while self.names: group = self.names[:group_size] groups.append(group) self.names = self.names[group_size:] self.groups_text.delete(1.0, tk.END) for i, group in enumerate(groups, 1): self.groups_text.insert(tk.END, f"Group {i}: {', '.join(group)}\n") def spin_wheel(self): if not self.names: self.result_label.config(text="Please add or upload names first") return winning_name = choice(self.names) self.result_label.config(text=winning_name) def run(self): self.root.mainloop() if __name__ == "__main__": wheel = WheelOfNames() wheel.run()