Динамический размер столбцов и их количество

weamagic

Пользователь
Пользователь
Июл 11, 2020
141
13
18
Win 7/10. Python 3.7
Загружаю данные из файла, в котором они содержатся в виде строк и столбцов, в таблицу. Код следующий:

Python:
from tkinter import *
from tkinter import filedialog
from tkinter.ttk import Treeview

def sel_path_to_file():
    path_to_file=filedialog.askopenfilename()
    txt_path_to_file.insert(END, path_to_file)
    inp_data=open(path_to_file, 'r').readline()
    mas_data=open(path_to_file, 'r').readlines()
    count_columns=inp_data.split(sep='\t')
    print(count_columns)
    tbl_dataset["columns"]=count_columns
    j=1
    n=0
    for name_heading in count_columns:
        tbl_dataset.heading(name_heading, text=name_heading)
    while j<len(mas_data):
        data_row=mas_data[j].split(sep='\t')
        n=len(data_row)
        tbl_dataset.insert("", END, values=data_row)
        j+=1

win=Tk()
win.geometry('1024x720')
txt_path_to_file=Entry(win)
txt_path_to_file.place(x=5, y=5, width=300, height=25)
tbl_dataset=Treeview(win)
tbl_dataset.place(x=5, y=35)
btn_sel_path_to_file=Button(win, text='Select')
btn_sel_path_to_file.place(x=310,y=5, width=100, height=25)
btn_sel_path_to_file.config(command=sel_path_to_file)
win.mainloop()

Файл считывается корректно, только размеры объекта резко увеличиваются, а хотелось бы, чтобы они были в пределах формы. Пробовал несколькими вариантами, к примеру:

Python:
    for name_heading in count_columns:
        tbl_dataset.heading(name_heading, text=name_heading)
        tbl_dataset.columnconfigure(name_heading, width=100)
Или так:

Python:
    cc=0
    while cc<len(count_columns):
        tbl_dataset.column(cc, width=20)
        cc+=1
Не сработало. Ошибок не выдает. Завершается корректно.

И ещё один попутный вопрос: перед данными есть пустой столбец. Как его убрать?
 

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
Width можно сделать как-нибудь так:
width=ширина_формы/колво_столбцов?
Вот пример (проверил на ваших данных):
Python:
from tkinter import *
from tkinter import filedialog
from tkinter.ttk import Treeview


def sel_path_to_file():
    path_to_file = filedialog.askopenfilename()
    txt_path_to_file.insert(END, path_to_file)

    with open(path_to_file, 'r') as f:
        columns = next(f).split('\t')
        tbl_dataset["columns"] = columns

        for i, text in enumerate(columns):
            tbl_dataset.heading(i, text=text)
        for s in f:
            tbl_dataset.insert("", END, values=s.split('\t'))

    # задает ширину столбцов
    for i in tbl_dataset['columns']:
        tbl_dataset.column(i, width=(win.winfo_width() // len(columns)))
    # задает высоту таблицы (сколько строк будет показано, остальные в скролле)
    tbl_dataset.config(height=20)


win = Tk()
win.geometry('1024x720')
txt_path_to_file = Entry(win)
txt_path_to_file.place(x=5, y=5, width=300, height=25)
btn_sel_path_to_file = Button(win, text='Select')
btn_sel_path_to_file.place(x=310, y=5, width=100, height=25)
btn_sel_path_to_file.config(command=sel_path_to_file)
tbl_dataset = Treeview(win, show='headings')
tbl_dataset.place(x=0, y=35)
win.mainloop()
 
  • Мне нравится
Реакции: Student

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
Вопрос не по теме, но очень наболевший: есть где-нибудь в сети документация по treeview в частности, и tkinter - в общем, выполненная на уровне языков Microsofta, а не жалкие огрызки, из которых приходится собирать по кусочкам нужные сведения?
Вот ссылки на документацию: ссылка, ссылка.
 

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
И ещё один попутный вопрос: перед данными есть пустой столбец. Как его убрать?
Пример файла с данными покажите.
 

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
Вот пример (тестил со своими данными):
Python:
from tkinter import *
from tkinter import filedialog
from tkinter.ttk import Treeview, Scrollbar


def sel_path_to_file():
    path_to_file = filedialog.askopenfilename()
    txt_path_to_file.insert(END, path_to_file)

    with open(path_to_file, 'r', encoding='utf-8') as f:
        columns = next(f).split('\t')
        tbl_dataset["columns"] = columns

        for i, text in enumerate(columns):
            tbl_dataset.heading(i, text=text)
        for s in f:
            tbl_dataset.insert("", END, values=s.split('\t'))

    # задает ширину столбцов
    for i in tbl_dataset['columns']:
        tbl_dataset.column(i, minwidth=50, width=100, stretch=NO)
    # задает высоту таблицы (сколько строк будет показано, остальные в скролле)
    tbl_dataset.config(height=20)


win = Tk()
win.geometry('1024x720')
txt_path_to_file = Entry(win)
txt_path_to_file.place(x=5, y=5, width=300, height=25)
tbl_dataset = Treeview(win)
# убирает первый столбец
tbl_dataset['show'] = 'headings'
tbl_dataset.place(x=5, y=35)

btn_sel_path_to_file = Button(win, text='Select')
btn_sel_path_to_file.place(x=310, y=5, width=100, height=25)
btn_sel_path_to_file.config(command=sel_path_to_file)
win.mainloop()
 

weamagic

Пользователь
Пользователь
Июл 11, 2020
141
13
18
Пример файла с данными покажите.
Типа такого...

tbl_dataset.column(i, minwidth=50, width=100, stretch=NO)

Width можно сделать как-нибудь так:
width=ширина_формы/колво_столбцов?
 

Вложения

  • test8.txt
    360 байт · Просмотры: 1
  • test9.txt
    137 байт · Просмотры: 1
Последнее редактирование:

weamagic

Пользователь
Пользователь
Июл 11, 2020
141
13
18
Вот пример (проверил на ваших данных):
Python:
from tkinter import *
from tkinter import filedialog
from tkinter.ttk import Treeview


def sel_path_to_file():
    path_to_file = filedialog.askopenfilename()
    txt_path_to_file.insert(END, path_to_file)

    with open(path_to_file, 'r') as f:
        columns = next(f).split('\t')
        tbl_dataset["columns"] = columns

        for i, text in enumerate(columns):
            tbl_dataset.heading(i, text=text)
        for s in f:
            tbl_dataset.insert("", END, values=s.split('\t'))

    # задает ширину столбцов
    for i in tbl_dataset['columns']:
        tbl_dataset.column(i, width=(win.winfo_width() // len(columns)))
    # задает высоту таблицы (сколько строк будет показано, остальные в скролле)
    tbl_dataset.config(height=20)


win = Tk()
win.geometry('1024x720')
txt_path_to_file = Entry(win)
txt_path_to_file.place(x=5, y=5, width=300, height=25)
btn_sel_path_to_file = Button(win, text='Select')
btn_sel_path_to_file.place(x=310, y=5, width=100, height=25)
btn_sel_path_to_file.config(command=sel_path_to_file)
tbl_dataset = Treeview(win, show='headings')
tbl_dataset.place(x=0, y=35)
win.mainloop()

Спасибо! Работает.
 

weamagic

Пользователь
Пользователь
Июл 11, 2020
141
13
18
Вот пример (проверил на ваших данных):
Python:
from tkinter import *
from tkinter import filedialog
from tkinter.ttk import Treeview


def sel_path_to_file():
    path_to_file = filedialog.askopenfilename()
    txt_path_to_file.insert(END, path_to_file)

    with open(path_to_file, 'r') as f:
        columns = next(f).split('\t')
        tbl_dataset["columns"] = columns

        for i, text in enumerate(columns):
            tbl_dataset.heading(i, text=text)
        for s in f:
            tbl_dataset.insert("", END, values=s.split('\t'))

    # задает ширину столбцов
    for i in tbl_dataset['columns']:
        tbl_dataset.column(i, width=(win.winfo_width() // len(columns)))
    # задает высоту таблицы (сколько строк будет показано, остальные в скролле)
    tbl_dataset.config(height=20)


win = Tk()
win.geometry('1024x720')
txt_path_to_file = Entry(win)
txt_path_to_file.place(x=5, y=5, width=300, height=25)
btn_sel_path_to_file = Button(win, text='Select')
btn_sel_path_to_file.place(x=310, y=5, width=100, height=25)
btn_sel_path_to_file.config(command=sel_path_to_file)
tbl_dataset = Treeview(win, show='headings')
tbl_dataset.place(x=0, y=35)
win.mainloop()
Вопрос не по теме, но очень наболевший: есть где-нибудь в сети документация по treeview в частности, и tkinter - в общем, выполненная на уровне языков Microsofta, а не жалкие огрызки, из которых приходится собирать по кусочкам нужные сведения?
 

weamagic

Пользователь
Пользователь
Июл 11, 2020
141
13
18
Вот ссылки на документацию: ссылка, ссылка.
Если это лучшее, что есть... Мда...
Всё равно - большое спасибо.
 

Форум IT Специалистов