如何在CustomTkinter文本框中设置后续输入文字为加粗样式
实现仅让后续输入文字加粗的文字处理器
问题说明
自制一款文字处理器,希望点击Bold按钮后,仅让用户接下来输入的文字变为加粗样式,而非整个文本框的内容。目前代码点击按钮会将文本框内所有内容加粗,尝试过标签方法,但仅适用于代码插入的文字,无法对用户输入的内容及空白生效。
解决方案
CTkTextbox继承自tkinter的Text组件,可以通过**文本标签(tag)**结合输入事件绑定来实现需求。核心思路是维护一个加粗状态变量,在用户输入时为新内容应用对应标签,同时处理光标移动时的状态同步。
修改后的完整代码如下:
import customtkinter as tk class TextWindow(tk.CTkToplevel): def __init__(self, master): super().__init__(master) ws = self.winfo_screenwidth() hs = self.winfo_screenheight() x = (ws / 2) - (300 / 2) y = (hs / 2) - (200 / 2) self.geometry('%dx%d+%d+%d' % (300, 200, x, y)) self.title("New World Documents") tk.set_appearance_mode("system") tk.set_default_color_theme("green") self.grid_rowconfigure(0, weight=1) self.grid_columnconfigure((0, 1), weight=1) self.textbox = tk.CTkTextbox(self, width=400, corner_radius=0, font=("roboto", 12), wrap="word") self.textbox.grid(row=0, column=0, padx=20, pady=20, sticky="nsew", columnspan=2) # 初始化加粗标签 self.textbox.tag_config("bold", font=("roboto", 12, "bold")) # 维护当前加粗状态 self.is_bold = False # 绑定输入事件,处理新输入内容的样式 self.textbox.bind("<Key>", self.apply_style_on_input) # 绑定光标移动事件,同步当前位置的样式状态 self.textbox.bind("<ButtonRelease-1>", self.sync_style_state) self.textbox.bind("<KeyRelease>", self.sync_style_state) self.button = tk.CTkButton(self, text="Save and quit", command=self.go_back) self.button.grid(row=1, column=0, padx=20, pady=20, sticky="ew") self.button1 = tk.CTkButton(self, text="Bold", command=self.toggle_bold) self.button1.grid(row=1, column=1, padx=20, pady=20, sticky="ew") self.wm_protocol("WM_DELETE_WINDOW", self.on_close) def toggle_bold(self): # 切换加粗状态 self.is_bold = not self.is_bold # 立即将当前光标位置的样式设置为对应状态(处理光标在已有文本后的情况) current_pos = self.textbox.index("insert") if self.is_bold: self.textbox.tag_add("bold", current_pos, current_pos) else: self.textbox.tag_remove("bold", current_pos, current_pos) def apply_style_on_input(self, event): # 忽略特殊按键(如方向键、退格键等) if event.keysym in ["Left", "Right", "Up", "Down", "BackSpace", "Delete"]: return # 获取输入前的光标位置 insert_pos = self.textbox.index("insert") # 为新输入的字符应用标签 if self.is_bold: self.textbox.tag_add("bold", insert_pos, f"{insert_pos}+1c") else: self.textbox.tag_remove("bold", insert_pos, f"{insert_pos}+1c") def sync_style_state(self, event): # 获取当前光标位置的所有标签 current_tags = self.textbox.tag_names("insert") # 同步加粗状态 self.is_bold = "bold" in current_tags def go_back(self): self.destroy() self.master.deiconify() def on_close(self): self.destroy() self.master.destroy() class MainScreen(tk.CTk): def __init__(self): super().__init__() ws = self.winfo_screenwidth() hs = self.winfo_screenheight() x = (ws / 2) - (300 / 2) y = (hs / 2) - (200 / 2) self.geometry('%dx%d+%d+%d' % (300, 200, x, y)) self.title("New World Documents") tk.set_appearance_mode("system") tk.set_default_color_theme("green") self.label = tk.CTkLabel(self, text="New World Documents", font=("roboto",25), width=200, height=25) self.label.pack() self.button = tk.CTkButton(self, text="New Document", command=self.StartWriting) self.button.pack() def StartWriting(self): self.withdraw() self.app = TextWindow(self) def start(self): self.mainloop() MainScreen().start()
关键改动说明
- 初始化标签与状态:创建
bold标签定义加粗样式,用self.is_bold变量跟踪当前是否启用加粗输入 - 切换加粗逻辑:
toggle_bold方法切换状态,并立即为当前光标位置应用/移除标签,确保后续输入生效 - 输入事件处理:
apply_style_on_input方法在用户输入字符时,自动为新字符添加或移除加粗标签 - 光标同步逻辑:
sync_style_state方法在光标移动或按键释放时,检测当前位置的标签,同步加粗状态,确保光标移到已有加粗/普通文本后,输入样式自动匹配
内容的提问来源于stack exchange,提问作者JordanTDixon
相关产品推荐
相关产品推荐

