У меня есть следующий код:
from tkinter import *
class GUI(Tk):
def __init__(self, *args, **kw):
super().__init__(*args, **kw)
self.frame = Frame(self)
self.frame.pack(fill=BOTH, expand=YES)
row = 0
self.source_lbl = Label(self.frame, text="Source:")
self.source_lbl.grid(column=0, row=row, sticky='w')
self.source_txt = Entry(self.frame, width=60)
self.source_txt.grid(column=1, row=row)
self.source_btn = Button(self.frame, text="Browse")
self.source_btn.grid(column=2, row=row)
row += 1
self.extra_frame = ExtraFrame(self.frame)
self.extra_frame.grid(row=row, columnspan=3, sticky='w')
class ExtraFrame(Frame):
def __init__(self, *args, **kw):
super().__init__(*args, **kw)
self.pairs = []
self.key_lbl = Label(self, text="Key", anchor='w')
self.value_lbl = Label(self, text="Value", anchor='w')
self.add_btn = Button(self, text="+", command=self.add_pair)
self.add_btn.grid()
def add_pair(self):
pair_frame = KWFrame(self, pady=2)
self.pairs.append(pair_frame)
pair_frame.grid(row=len(self.pairs), columnspan=3)
self.update_labels_and_button()
def update_labels_and_button(self):
if self.pairs:
self.key_lbl.grid(column=0, row=0, sticky='w')
self.value_lbl.grid(column=1, row=0, sticky='w')
else:
self.key_lbl.grid_remove()
self.value_lbl.grid_remove()
self.add_btn.grid(row=len(self.pairs) + 1)
class KWFrame(Frame):
def __init__(self, *args, **kw):
super().__init__(*args, **kw)
self.key_txt = Entry(self, width=30)
self.key_txt.grid(column=0, row=0)
self.value_txt = Entry(self, width=30)
self.value_txt.grid(column=1, row=0)
self.remove_btn = Button(self, text="-", command=self.remove)
self.remove_btn.grid(column=2, row=0)
def remove(self):
i = self.master.pairs.index(self)
del self.master.pairs[i]
for pair in self.master.pairs[i:]:
pair.grid(row=pair.grid_info()['row'] - 1)
self.master.update_labels_and_button()
self.destroy()
gui = GUI()
gui.mainloop()
Это прекрасно работает с возможностью добавлять / удалять новые строки ввода текста, с единственной проблемой: метки «Ключ» и «Значение» не являютсявыровнены с соответствующими полями ввода в этих строках (несмотря на наличие правильных значений столбцов). Есть ли простой способ их аккуратно выровнять, используя такую вложенную сетку?