从python tkinter中的csv文件输出单个单元格

时间:2017-11-18 10:55:48

标签: python csv tkinter

这意味着在tkinter标签的新标签中显示CSV周期表(第0行中的原子符号,第1行中的名称)中的单个元素名称。用户应该能够输入原子符号,单击查找按钮并输出名称。然而到目前为止,它没有打印任何东西,我不确定哪个部分出错了,因为我对tkinter相当新。

当前代码:

import tkinter as tk
base_container = tk.Tk()
element = tk.StringVar()

def search(element):
    import csv
    choice = element 
    with open('Periodic_Table.csv') as file:
        csv_file = csv.reader(open('Periodic_Table.csv', "rt"), delimiter=",")
        for row in csv_file:
            if choice == str(row[0]):
                tk.Label(base_container, text=str(row[1])).grid(row=4, column=0)

entry = tk.Label(base_container, text="Enter a chemical symbol:").grid(row=0, column=0, sticky="NE")
text = tk.Entry(base_container, width= 30, textvariable=element).grid(row=0, column=1, padx=2, pady=2, sticky="NE", columnspan=4)

Find = tk.Button(base_container, text="Find", command=lambda: search('element'))
Find.grid(row=30, column=10, sticky="SW", padx=2, pady=2)

Quit = tk.Button(base_container, text="Quit").grid(row=50, column=10, sticky="SW", padx=2, pady=2)
base_container.mainloop()

Periodic_Table.csv开头如下:

H, Hydrogen
He, Helium
Li, Lithium
Be, Beryllium
B, Boron
C, Carbon

1 个答案:

答案 0 :(得分:1)

您的代码存在一些问题。正如Martin所说,你打开了两次CSV文件。并且没有必要打开它&每次要执行搜索时都会读取。将它读入某种集合,然后在该集合上执行搜索会更有效。

我们可以将周期表数据保存到列表中,但使用字典要好得多。这样我们就可以通过使用符号作为键来立即获取元素名称。

我之前提到的另一个问题是你将字符串'element'传递给搜索函数而不是包含元素符号的字符串。由于周期表中不包含单词'element',因此搜索将始终失败。

我们实际上不需要将任何内容传递给search:我们可以通过element StringVar来检索条目的当前内容。

另外,正如我上面提到的,每次要更新输出时都不要制作新的Label。旧标签仍然存在,但它们将被埋在新标签之下。而是创建一个Label并通过其.config方法更新其文本。

这是您程序的修复版本。

import csv
import tkinter as tk

# Read the periodic_table data and save it to a dictionary, keyed by the symbol
periodic_table = {}
with open('Periodic_Table.csv', newline='') as f:
    reader = csv.reader(f, delimiter=",", skipinitialspace=True)
    for sym, name in reader:
        periodic_table[sym] = name

base_container = tk.Tk()
element = tk.StringVar()

def search():
    sym = element.get() 
    name = periodic_table.get(sym, 'Not found')
    element_label.config(text=name) 

tk.Label(base_container, text="Enter a chemical symbol:").grid(row=0, column=0, sticky="NE")
tk.Entry(base_container, width=30, textvariable=element).grid(row=0, column=1, padx=2, pady=2, sticky="NE", columnspan=4)

element_label = tk.Label(base_container, text='')
element_label.grid(row=4, column=0)

tk.Button(base_container, text="Find", command=search).grid(row=30, column=10, sticky="SW", padx=2, pady=2)
tk.Button(base_container, text="Quit", command=base_container.destroy).grid(row=50, column=10, sticky="SW", padx=2, pady=2)

base_container.mainloop()