Windows Clipboard — History [2021]

def toggle_pin(self, index): filtered = self.get_filtered_history() if index < len(filtered): item = filtered[index] item_id = (item["text"], item["timestamp"]) if item_id in self.pinned: self.pinned.discard(item_id) else: self.pinned.add(item_id) self.save_history() self.update_history_display()

def load_history(self): if os.path.exists(HISTORY_FILE): try: with open(HISTORY_FILE, "r", encoding="utf-8") as f: data = json.load(f) self.history = data.get("history", []) self.pinned = set(tuple(x) for x in data.get("pinned", [])) except: self.history = [] self.pinned = set() windows clipboard history

def clear_history(self): if messagebox.askyesno("Clear History", "Delete all clipboard history?"): self.history = [] self.pinned.clear() self.save_history() self.update_history_display() self.status_var.set("History cleared") def toggle_pin(self, index): filtered = self

def save_history(self): try: with open(HISTORY_FILE, "w", encoding="utf-8") as f: json.dump( "history": self.history, "pinned": [list(p) for p in self.pinned] , f, ensure_ascii=False, indent=2) except: pass encoding="utf-8") as f: json.dump( "history": self.history

self.history = [] self.pinned = set() self.load_history() self.last_text = pyperclip.paste() self.running = True # GUI self.create_widgets() self.update_history_display() # Start background monitor self.monitor_thread = threading.Thread(target=self.monitor_clipboard, daemon=True) self.monitor_thread.start() self.root.protocol("WM_DELETE_WINDOW", self.on_close)

def on_close(self): self.running = False self.save_history() self.root.destroy() if == " main ": root = tk.Tk() # Add placeholder text workaround class EntryWithPlaceholder(tk.Entry): def init (self, master=None, placeholder="", **kwargs): super(). init (master, **kwargs) self.placeholder = placeholder self.bind("<FocusIn>", self.on_focus_in) self.bind("<FocusOut>", self.on_focus_out) self.on_focus_out() def on_focus_in(self, e): if self.get() == self.placeholder: self.delete(0, tk.END) self.config(fg="black") def on_focus_out(self, e): if not self.get(): self.insert(0, self.placeholder) self.config(fg="grey") tk.Entry = EntryWithPlaceholder

def show_context_menu(self, event): try: index = self.listbox.nearest(event.y) if index >= 0: self.listbox.selection_clear(0, tk.END) self.listbox.selection_set(index) menu = tk.Menu(self.root, tearoff=0) menu.add_command(label="Copy to clipboard", command=self.paste_selected) menu.add_command(label="Pin / Unpin", command=lambda: self.toggle_pin(index)) menu.add_command(label="Delete", command=lambda: self.delete_selected(index)) menu.post(event.x_root, event.y_root) except: pass