哪个更适合tkinter网格,放置单个项目或循环遍历列表来放置它们?

问题描述 投票:0回答:1

我有一些非常大的表单,我一直在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)

我不能告诉你哪个更有效但是终端程序已经超过30MB并且启动时间至少需要2-3秒而没有我需要的最大形式之一所以我不确定选项二是否有助于削减在这个或没有。我应该放弃python并用其他语言去寻找一些东西吗?我在编程方面并不是那么出色,所以我甚至不知道通常会编写这样的形式。

python python-3.x tkinter
1个回答
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()

© www.soinside.com 2019 - 2024. All rights reserved.