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

Tkinter技术问题:如何为Treeview添加多列并规避TypeError错误

解决Treeview列创建时的TypeError问题

我来帮你搞定这个问题!首先咱们拆解下错误根源:你碰到的TypeError: can only concatenate str (not "tuple") to str,是因为循环中尝试拼接self.tree["columns"]和元组(str(self.k),)时,前者在你的环境中返回的是字符串类型而非预期的元组——这大概率是旧版本tkinter处理Treeview列的特性导致的。另外你的第二个循环还藏着变量误用的bug:你用了循环外的self.k(最后一次循环后的值是49)来设置列,导致所有列都被重复配置成同一个列名。

修正方案

咱们换个更高效且安全的方式创建列:先一次性生成所有需要的列名元组,再一次性配置给Treeview,既避免类型拼接问题,又优化了代码效率。同时修正第二个循环的变量错误。

修正后的完整代码

#coding:utf-8
import tkinter as tk
from tkinter import Tk, ttk

class Tableau(Tk):
    def __init__(self):
        super().__init__()
        self.title("My treeview")
        app_width = 1050
        app_height = 600
        screen_width = self.winfo_screenwidth()
        screen_height = self.winfo_screenheight()
        x = (screen_width / 2) - (app_width / 2)
        y = (screen_height / 2) - (app_height / 2)
        self.geometry(f'{app_width}x{app_height}+{int(x)}+{int(y)}')

        #-------------------------------------------Configurer la page--------------------------------------------
        self.config(background="azure")
        self.resizable(0,0)
        self.focus_force()

        #Ajouter un style
        self.style = ttk.Style()
        #Choisir un theme
        self.style.theme_use('default')

        #Configure treeview
        self.style.configure("Treeview", background="#D3D3D3", foreground="black", rowheight=25, fieldbackground="#D3D3D3")
        #Changer couleur
        self.style.map('Treeview', background=[('selected', '#347083')])

        self.frame = tk.Frame(self)
        self.frame.pack(pady=10)

        self.tree_scroll_horizontal = tk.Scrollbar(self.frame, orient='horizontal')
        self.tree_scroll_horizontal.pack(side='bottom', fill='x' )

        # 1. 一次性生成所有列名的元组
        column_names = tuple(str(i) for i in range(50))
        self.tree = ttk.Treeview(self.frame, xscrollcommand=self.tree_scroll_horizontal.set, columns=column_names)
        self.tree.pack()
        self.tree_scroll_horizontal.config(command=self.tree.xview)

        # 2. 循环设置每一列的属性,使用正确的循环变量j
        for j in range(50):
            self.tree.column(column=str(j), width=100, stretch=tk.NO)  # 缩小列宽避免窗口溢出,可按需调整
            self.tree.heading(column=str(j), text=str(j), anchor=tk.W)

        self.tree.tag_configure('oddrow', background="white")
        self.tree.tag_configure('evenrow', background="lightblue")

if __name__ == "__main__":
    app = Tableau()
    app.mainloop()

关键修改说明

  • 一次性生成列名:用tuple(str(i) for i in range(50))直接创建包含50个列名的元组,初始化Treeview时就传入,彻底避免循环中反复修改columns属性带来的类型冲突。
  • 修正循环变量:第二个循环中使用j遍历列名,确保每一列都被正确配置,不会出现所有列复用同一个名称的问题。
  • 调整列宽:把列宽从500改为100,避免50列总宽度远超窗口尺寸,你可以根据实际需求再调整这个数值。

这样修改后,代码就能正常运行,不会再出现类型错误啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 19:32:39