| # 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() |