# candidate_window.py import tkinter as tk from caret import get_caret_rect class CandidateWindow: def __init__(self): self.root = tk.Tk() self.root.overrideredirect(True) # 无边框 self.root.attributes("-topmost", True) self.label = tk.Label( self.root, text="", bg="#222", fg="white", font=("Segoe UI", 12), justify="left", padx=8, pady=4 ) self.label.pack() self.visible = False def set_text(self, text): self.label.config(text=text) def show(self): if not self.visible: self.visible = True self.root.deiconify() def hide(self): self.visible = False self.root.withdraw() def update_position(self): rect = get_caret_rect() if rect: x = rect.left y = rect.bottom + 5 # 关键:显示在光标下方 self.root.geometry(f"+{x}+{y}") def tick(self): self.update_position() self.root.after(10, self.tick) # 高频刷新(输入法常见) def start(self): self.hide() self.tick() self.root.mainloop()