Я пытаюсь использовать python tkinter для создания интерфейса для отображения информации таблицы базы данных с помощью Treeview.Заголовок представляет собой схему таблицы и вставляет строку данных в таблицу древовидной структуры.Поскольку количество столбцов в разных таблицах может не совпадать, я хочу автоматически настроить ширину столбца, чтобы общая ширина таблицы в виде дерева была фиксированной.Я написал код python3 в сообществе Pycharm 2018.3 и использовал функцию (показать таблицу) для вставки строк данных и использовал "treeview.column (col, width = int (total_width / len (cols))", minwidth = 0, якорь= 'center', stretch = 0) ", чтобы установить ширину столбца.функция вызывается при показе страницы (я ставлю комментарий к строке при ее вызове).Когда код был запущен в первый раз, ширина столбца обычно корректировалась на ширину, а общая ширина таблицы хорошо подходила и корректна, как показано ниже.
Однако, если я нажму кнопку для вызова той же функции и вставки той же строки данных, ширина таблицы древовидной структуры изменится.и я обнаружил, что это меняется с номером столбца, как показано ниже.Я не знаю, почему это произошло так.Пожалуйста, порекомендуйте.Большое спасибо !мой код прикреплен внизу.
class ListPage(tk.Tk):
table_list = sample.scan_result.table_list
table_index = 0
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent, bg='#C6E2FF')
self.tbTitlelabel = tk.Button(self, text="Table", font=("Verdana", 18, "bold"), bg='#C6E2FF', fg='darkblue', command=lambda: controller.show_frame(start_page.StartPage))
self.tbTitlelabel.grid(row=1, column=0, columnspan=1, padx=(150, 0), sticky='w')
self.nextLabel = tk.Button(self, text="Next", font=("Verdana", 8, "bold"), bg='#C6E2FF', fg='darkblue',command=lambda:self.nextTable())
self.nextLabel.grid(row=1, column=0, columnspan=1, padx=(280, 0), sticky='w')
**# if call the function by the button, the table width change.**
self.preLabel = tk.Button(self, text="Previous", font=("Verdana", 18, "bold"), bg='#C6E2FF', fg='darkblue', command=lambda:self.showTable() )
self.preLabel.grid(row=1, column=0, columnspan=1, padx=(380, 0), sticky='w')
style = ttk.Style()
style.configure("Treeview.Heading", font=("Verdana", 15))
self.tree = ttk.Treeview(self, height=10, show = 'headings', selectmode='browse')
self.tree.grid(row=2, column=0, columnspan=1, padx=(120, 0), sticky='w')
ysb = ttk.Scrollbar(self, orient='vertical', command=self.tree.yview)
self.tree['yscroll'] = ysb.set
ysb.grid(row=2, column=0, sticky='ens')
**# if call the function during the page intial, the table width is good.**
self.showTable()
def nextTable(self):
if self.table_index < len(self.table_list)-1:
self.table_index += 1
self.showTable()
def previousTable(self):
if self.table_index > 0:
self.table_index -= 1
self.showTable()
def showTable(self):
print('run show table')
col_start_pos = 0
for i in self.tree.get_children():
self.tree.delete(i)
if len(self.table_list) > self.table_index:
print( self.table_index, self.table_list)
table_item = self.table_list[self.table_index]
print(self.table_list[1], self.table_index)
self.tbTitlelabel['text'] = table_item.db_name
col_name = table_item.col_name[col_start_pos:]
self.tree['columns'] = col_name
data_list = table_item.data_list
for col in col_name:
self.tree.heading(col, text=col)
**self.tree.column(col, width= int(600 / len(col_name)), minwidth=0, anchor='center',stretch=0) # auto adjust column width**
x=0
while x < 7:
for list in data_list:
self.tree.insert('', 'end', values = list[col_start_pos:] )
x+=1