Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python tkinter中从csv文件输出单个单元格_Python_Csv_Tkinter - Fatal编程技术网

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

在python tkinter中从csv文件输出单个单元格,python,csv,tkinter,Python,Csv,Tkinter,这意味着在tkinter标签的新标签中显示CSV周期表中的单个元素名称(第0行为原子符号,第1行为名称)。用户应该能够输入一个原子符号,单击find按钮并输出名称。然而,到目前为止,它没有打印任何内容,我不确定哪一部分出了问题,因为我是tkinter的新手 当前代码: import tkinter as tk base_container = tk.Tk() element = tk.StringVar() def search(element): import csv cho

这意味着在tkinter标签的新标签中显示CSV周期表中的单个元素名称(第0行为原子符号,第1行为名称)。用户应该能够输入一个原子符号,单击find按钮并输出名称。然而,到目前为止,它没有打印任何内容,我不确定哪一部分出了问题,因为我是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()
周期表.csv
开始如下:

氢 他,氦 锂 铍 B、 硼 C、 碳素
您的代码有一些问题。正如Martin提到的,您将打开CSV文件两次。无需每次执行搜索时都打开并阅读。将其读入某种集合,然后在该集合上执行搜索,效率要高得多

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

我前面提到的另一个问题是,您将字符串
'element'
传递给搜索函数,而不是包含元素符号的字符串。由于元素周期表不包含“element”这个词,搜索总是会失败

实际上,我们不需要将任何内容传递给
search
:我们可以通过
元素
StringVar获取条目的当前内容

另外,正如我上面提到的,每次您想要更新输出时都创建一个新标签不是一个好主意。旧标签仍将存在,但它们将被新标签掩埋。相反,创建单个标签并通过其
.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()

为什么要将字符串
'element'
传递给
搜索
函数?你能给我们看几行
'Periodic_Table.csv'
文件吗?欢迎来到这个网站。请详细说明运行时会发生什么以及您尝试了什么。顺便说一句,每次要更新输出时都制作一个新标签不是一个好主意。旧标签仍将存在,但它们将被新标签掩埋。相反,创建一个标签并更新它的文本。字符串'element'被传递以保证变量可以使用,尽管我可能错了。csv的前几行是这样的:H、氢/He、氦/Li、锂/be、铍/B、硼/C、碳/