Я бы сказал, что самое простое решение - создать функцию, которая принимает метку, строку и столбец и создает метку и запись для этой строки и столбца.
Затем создайте структуру данных, котораяпредставляет макет вашей формы.Вы можете встраивать строки и столбцы или предполагать, что строка 1 структуры данных идет в строку 1 и т. Д. Вы можете использовать форматирование в своем коде, чтобы упростить визуализацию формы.
Вот действительно простойпример, который предполагает, что все поля ввода имеют одинаковый размер.Вам не нужно делать это таким образом, но он иллюстрирует технику:
import tkinter as tk
def create_entry(parent, label, row, column):
label = tk.Label(parent, text=label, justify="right")
entry = tk.Entry(parent)
label.grid(row=row, column=column, sticky="e")
entry.grid(row=row, column=column+1)
return entry
layout = (
("First Name", 0, 0), ("Address Line 1", 0, 2),
("Last Name", 1, 0), ("Address Line 2", 1, 2),
("City", 2, 2),
("State", 3, 2),
("Zip", 4, 2),
)
root = tk.Tk()
form = tk.Frame(root, bd=2, relief="groove")
form.pack(fill="both", expand=True, padx=20, pady=20)
form.grid_rowconfigure((0,2), weight=1)
entries = {}
for (label, row, column) in layout:
entry = create_entry(form, label, row, column)
entries[label] = entry
root.mainloop()
Приведенный выше код дает форму, которая выглядит следующим образом:

В этом примере не используется StringVar
, потому что это просто добавляет дополнительный объект, которым нужно управлять, и в большинстве случаев он вам просто не нужен.В этом примере каждая запись хранится в словаре, а ключ является меткой.Так, например, чтобы получить текущее значение поля «Город», вы можете использовать entries['City'].get()