对于tkinter网格,放置单个项目或遍历列表放置它们哪个更好?

时间:2018-11-26 16:49:20

标签: python python-3.x tkinter

我在tkinter中有一些非常大的表格,我不确定我应该以哪种方式实现所有按钮和文本框。或者,如果我不应该完全使用python / find一种新方法来做的话...最终的结果是,它已连接到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)

我无法告诉您哪种效率更高,但是最终程序已经超过30MB,并且在没有我需要的最大形式之一的情况下至少需要2-3秒才能启动,所以我不确定是否要执行第二种方法有助于减少这种情况。 我应该放弃python并寻求其他语言的东西吗?我还没有那么擅长编程,所以我什至不知道通常会以这种形式编码这种形式。

1 个答案:

答案 0 :(得分:1)

我想说,最简单的解决方案是创建一个带有标签,行和列的函数,并为该行和列创建标签和条目。

接下来,创建一个数据结构来表示表单的布局。您可以嵌入行和列,也可以假设数据结构的第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()