You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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()

关键改动说明

  1. 初始化标签与状态:创建bold标签定义加粗样式,用self.is_bold变量跟踪当前是否启用加粗输入
  2. 切换加粗逻辑:toggle_bold方法切换状态,并立即为当前光标位置应用/移除标签,确保后续输入生效
  3. 输入事件处理:apply_style_on_input方法在用户输入字符时,自动为新字符添加或移除加粗标签
  4. 光标同步逻辑:sync_style_state方法在光标移动或按键释放时,检测当前位置的标签,同步加粗状态,确保光标移到已有加粗/普通文本后,输入样式自动匹配

内容的提问来源于stack exchange,提问作者JordanTDixon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 22:30:03