这意味着在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
答案 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()