0

I am trying to create a Treeview with a lot of columns.

Here is my class that create the window with the 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

        screnn_width = self.winfo_screenwidth()
        screnn_heigth = self.winfo_screenheight()

        x = (screnn_width / 2) - (app_width / 2)
        y = (screnn_heigth / 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'  )
        
        self.tree = ttk.Treeview(self.frame,  xscrollcommand=self.tree_scroll_horizontal.set, columns=())
        self.tree.pack()

        self.tree_scroll_horizontal.config(command=self.tree.xview)

        for self.k in range(50):
            self.param = self.tree["columns"] + (str(self.k),)
            self.tree.configure(columns=self.param)
            print(self.k)

    
        for self.j in range(50):
            self.tree.column(column=(str(self.k)), width=500, stretch=tk.NO)
            self.tree.heading(column= (str(self.k)), text=(str(self.k)), anchor=tk.W)

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


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

I have this error when I run it : TypeError: can only concatenate str (not "tuple") to str

I know that there is a problem with my type, and the error say that this error happen here : line 57, in init self.param = self.tree["columns"] + (str(self.k),)

To avoid this error i tried to add the str notation but that didnt worked.

1 Answer 1

1

Since you create self.tree with empty tuple as the columns option, the return value of self.tree["columns"] is an empty string instead of empty tuple. You can verify it by printing the type of self.tree["columns"] after the creation of self.tree. That's why exception is raised on the mentioned line.

Actually you can simplify the following for loop:

for self.k in range(50):
    self.param = self.tree["columns"] + (str(self.k),)
    self.tree.configure(columns=self.param)
    print(self.k)

by

self.tree["columns"] = list(range(50))

Also I think that the for self.j in range(50) in the following for loop

for self.j in range(50):
    self.tree.column(column=(str(self.k)), width=500, stretch=tk.NO)
    self.tree.heading(column= (str(self.k)), text=(str(self.k)), anchor=tk.W)

should be for self.k in range(50) instead.

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.