【问题标题】:Outputting a single cell from a csv file in python tkinter从python tkinter中的csv文件输出单个单元格
【发布时间】:2017-11-18 21:27:26
【问题描述】:

这意味着在 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

【问题讨论】:

  • 为什么要将字符串'element' 传递给search 函数?你能给我们看几行'Periodic_Table.csv' 文件吗?
  • 欢迎来到本站。请详细说明您跑步时发生的情况以及您尝试过的情况。
  • 顺便说一句,每次要更新输出时都创建一个新标签并不是一个好主意。旧标签仍然存在,但它们将被埋在新标签之下。相反,创建一个标签并更新其文本。
  • 传递了字符串“元素”以保证可以使用变量,尽管我可能错了。
  • csv 的前几行如下所示:H, Hydrogen/ He, Helium/ Li, Lithium/ Be, Beryllium/ B, Boron/ C, Carbon/

标签: python csv tkinter


【解决方案1】:

您的代码存在一些问题。正如 Martin 提到的,您打开 CSV 文件两次。每次您想要执行搜索时都无需打开它并阅读。将它读入某种集合,然后在该集合上执行搜索会更有效。

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

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

我们实际上不需要向search 传递任何内容:我们可以通过element 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()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-22
    • 1970-01-01
    • 2023-01-13
    • 2019-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多