Что лучше для сетки tkinter, размещения отдельных элементов или просмотра списка для их размещения? - PullRequest
0 голосов
/ 26 ноября 2018

У меня есть несколько очень больших форм, над которыми я работал в tkinter, и я не уверен, каким образом мне следует реализовать все кнопки и текстовые поля.Или, если мне просто не следует делать это в python / найти новый способ полностью ... Конечная игра заключается в том, что она подключена к базе данных sqlite3 и хранит записи для последующего экспорта.

СначалаКстати, я сделал каждое отдельное поле ввода и разместил его там, где я хотел, что в итоге составило 426 строк кода и выглядело так снова и снова ... Намного более прямолинейно в том, что он делает, чем во втором варианте ...

tk.Label(window,text="Lead Operator: ").grid(row=1,column=0)
Operator2 = tk.StringVar()
operator2_entry = tk.Entry(window,textvariable=Operator2)
operator2_entry.grid(row=1,column=1)

Второй вариант, который я попробовал, - это список со всеми 50 некоторыми входами и циклический переход по различным разделам списка, чтобы разместить их там, где я хотел, чтобы они выглядели так. Я чувствую, что второй вариантизвилистый, но он делает несколько входов одновременно ..

for item in list(labels)[10:18:4]:
    tk.Label(master,text=item).grid(row=list(labels.keys()).index(item)+2,column=0)
for item in list(variable)[10:18:4]:
    item = tk.StringVar()
for item in list(entries)[10:18:4]:
    tk.Entry(master,textvariable=list(variable.keys()).index(item[:-6])).grid(row=list(entries.keys()).index(item)+2,column=1)

Я не могу сказать вам, что является более эффективным, но конечная программа уже занимает более 30 МБ и требует по крайней мере 2-3 секунды для запуска без одногоиз самых больших форм, которые мне нужны, поэтому я не уверен, поможет ли вариант два сократить это или нет.Должен ли я отказаться от Python и перейти на что-то на другом языке?Я пока не очень хорош в программировании, поэтому я даже не знаю, какие формы, как эта, обычно кодируются.

1 Ответ

0 голосов
/ 26 ноября 2018

Я бы сказал, что самое простое решение - создать функцию, которая принимает метку, строку и столбец и создает метку и запись для этой строки и столбца.

Затем создайте структуру данных, котораяпредставляет макет вашей формы.Вы можете встраивать строки и столбцы или предполагать, что строка 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()

Приведенный выше код дает форму, которая выглядит следующим образом:

enter image description here

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...