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

如何在CustomTkinter的CTkTable中添加复选框

在CustomTkinter的CTkTable中嵌入复选框

方案1:直接在CTkTable单元格内插入复选框

CTkTable支持将自定义组件嵌入指定单元格,你可以先初始化表格,再遍历第一行的单元格,逐个插入复选框。修改后的代码如下:

import customtkinter as ctk
from customtkinter import StringVar

def checkbox_event(var):
    print(f"checkbox toggled, current value: {var.get()}")

ctk.set_appearance_mode("light")
ctk.set_default_color_theme("blue")

app = ctk.CTk()
app.geometry("600x400")

scrollable_frame_search = ctk.CTkScrollableFrame(app, width=580, height=380)
scrollable_frame_search.pack(pady=10, padx=10, fill="both", expand=True)

# 初始化表格,确保行列数与数据匹配
value = [['SELECT','TITLE','DOWNLOAD'], [1,2,3], [1,2,3], [1,2,3], [1,2,3]]
table = ctk.CTkTable(
    master=scrollable_frame_search,
    row=len(value),
    column=len(value[0]),
    values=value,
    header_color='gray',
    corner_radius=4
)
table.pack(expand=True, fill="both")

# 遍历第一行所有单元格,插入独立复选框
for col in range(len(value[0])):
    # 每个复选框使用独立变量,避免状态同步问题
    check_var = StringVar(value="on")
    checkbox = ctk.CTkCheckBox(
        master=table.master,
        text="",
        command=lambda v=check_var: checkbox_event(v),
        variable=check_var,
        onvalue="on",
        offvalue="off"
    )
    # 将复选框设置为对应单元格内容
    table.set_cell_data(row=0, column=col, value=checkbox)

app.mainloop()

关键注意点:

  • 必须为每个复选框创建独立的StringVar,共用变量会导致所有复选框状态同步变化。
  • 使用table.set_cell_data()方法将复选框替换单元格原有文本,若不需要表头文字,可将value第一行改为空字符串。

方案2:使用支持内嵌组件的替代组件

如果CTkTable的自定义方式无法满足需求,可考虑以下替代选项:

  • CTkTreeview:可配置为表格形式,支持在单元格/表头嵌入复选框,适合行/列选择场景。
  • ttk.Treeview:原生tkinter树形表格,配合CustomTkinter主题可保持风格统一,支持嵌入ttk.Checkbutton。

CTkTreeview实现示例

import customtkinter as ctk
from customtkinter import StringVar

def checkbox_event(var, item_type, col):
    print(f"{item_type} column {col} toggled: {var.get()}")

ctk.set_appearance_mode("light")
ctk.set_default_color_theme("blue")

app = ctk.CTk()
app.geometry("600x400")

scrollable_frame_search = ctk.CTkScrollableFrame(app, width=580, height=380)
scrollable_frame_search.pack(pady=10, padx=10, fill="both", expand=True)

# 创建树形表格,设置列
tree = ctk.CTkTreeview(scrollable_frame_search, columns=("SELECT", "TITLE", "DOWNLOAD"), show="headings")
tree.pack(expand=True, fill="both")

# 配置表头与列宽
tree.heading("SELECT", text="SELECT")
tree.heading("TITLE", text="TITLE")
tree.heading("DOWNLOAD", text="DOWNLOAD")
tree.column("SELECT", width=80)
tree.column("TITLE", width=200)
tree.column("DOWNLOAD", width=200)

# 插入数据行
data_rows = [[1,2,3], [1,2,3], [1,2,3], [1,2,3]]
for row in data_rows:
    tree.insert("", "end", values=row)

# 为表头添加复选框
for col in tree["columns"]:
    check_var = StringVar(value="on")
    checkbox = ctk.CTkCheckBox(
        master=tree,
        text="",
        command=lambda v=check_var, c=col: checkbox_event(v, "Header", c),
        variable=check_var,
        onvalue="on", offvalue="off"
    )
    tree.heading(col, widget=checkbox)

app.mainloop()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 13:43:19