es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo expandir la columna del treeview de tkinter más allá del marco de la ventana?

Tengo un widget Treeview de tkinter con varias columnas y una barra de desplazamiento vertical y horizontal. La barra de desplazamiento vertical funciona cuando la cantidad de elementos en el árbol es mayor que el tamaño del widget Treeview, pero parece que la barra de desplazamiento horizontal no tiene la oportunidad de funcionar. Cuando selecciono una columna para hacerla más grande (es decir, arrastrar ‘Load Spec.’ de manera que ‘Beam Spec.’ esté fuera de la pantalla), la barra de desplazamiento horizontal se activa, pero en cuanto suelto el borde de la columna todas las columnas se redimensionan nuevamente para ajustarse al marco en lugar de permanecer agrandadas y permitirme usar la barra de desplazamiento. Ver imagen a continuación de lo que estoy hablando y el fragmento de código que genera el Treeview. Gracias por cualquier ayuda proporcionada para solucionar este problema.

Imagen del Treeview con barras de desplazamiento

headings = ['Set #', 'Set Name', 'Joint Spec.', 'Load Spec.', 'Beam Spec.']
tree_contain = Treeview(display_result_set_frame, columns=headings, show='headings', height=4)
tree_scrollx = Scrollbar(display_result_set_frame)
tree_scrolly = Scrollbar(display_result_set_frame)
tree_scrollx.configure(command=tree_contain.xview, orient=HORIZONTAL)
tree_scrolly.configure(command=tree_contain.yview)
tree_contain.configure(xscrollcommand=tree_scrollx.set, yscrollcommand=tree_scrolly.set)
tree_scrolly.pack(side=RIGHT, fill=Y)
tree_scrollx.pack(side=BOTTOM, fill=X)
tree_contain.pack(side=LEFT, fill=X, expand=True)
tree_index = 0
for col in headings:
    tree_contain.heading(col, text=col.title())
    tree_width = [40, 200, 100, 100, 100]
    tree_anchor = [CENTER, W, CENTER, W, W]
    tree_contain.column(col, width=tree_width[tree_index], minwidth=tree_width[tree_index], anchor=tree_anchor[tree_index])
    tree_index += 1
Tags:  , ,

Answer

  1. Avatar for davy.ai

    El problema con la barra de desplazamiento horizontal que no funciona correctamente al redimensionar las columnas en el widget del Treeview se debe a que los anchos de las columnas se establecen utilizando valores fijos en el código. Esto significa que cuando se redimensionan las columnas, el widget sigue pensando que las columnas deben tener sus tamaños fijos originales, lo que hace que vuelvan a esos tamaños cuando el usuario suelta el borde de la columna. Para solucionar este problema, una solución es establecer los anchos de las columnas utilizando un valor proporcional en lugar de un valor fijo. Esto se puede hacer calculando el ancho total de todas las columnas y luego estableciendo el ancho de cada columna como una fracción de ese ancho total. Aquí tienes un ejemplo de cómo se puede implementar esto en el código anterior:

    headings = ['Número de conjunto', 'Nombre del conjunto', 'Especificación conjunta', 'Especificación de carga', 'Especificación de viga']
    tree_contain = Treeview(display_result_set_frame, columns=headings, show='headings', height=4)
    tree_scrollx = Scrollbar(display_result_set_frame)
    tree_scrolly = Scrollbar(display_result_set_frame)
    tree_scrollx.configure(command=tree_contain.xview, orient=HORIZONTAL)
    tree_scrolly.configure(command=tree_contain.yview)
    tree_contain.configure(xscrollcommand=tree_scrollx.set, yscrollcommand=tree_scrolly.set)
    tree_scrolly.pack(side=RIGHT, fill=Y)
    tree_scrollx.pack(side=BOTTOM, fill=X)
    tree_contain.pack(side=LEFT, fill=X, expand=True)
    
    # calcular el ancho total de todas las columnas
    total_width = sum([int(tree_contain.column(col, 'width')) for col in headings])
    
    tree_index = 0
    for col in headings:
        tree_contain.heading(col, text=col.title())
    
        # establecer el ancho de la columna como una fracción del ancho total
        column_width = int(tree_contain.column(col, 'width'))
        proportional_width = column_width/total_width
        tree_contain.column(col, width=int(proportional_width * 800), minwidth=column_width, anchor=CENTER)
    
        tree_index += 1
    

    En este ejemplo, el ancho total de todas las columnas se calcula utilizando la función sum y una comprensión de lista que obtiene el ancho de cada columna en la lista headings. Luego, la variable proportional_width se calcula como el ancho de la columna dividido por el ancho total, y se utiliza para establecer el nuevo ancho de la columna como una fracción del ancho total, que se establece en 800 en este ejemplo. Esto debería permitir que la barra de desplazamiento horizontal funcione correctamente cuando se redimensionan las columnas.

Comments are closed.