【问题标题】:how to use loops to parse csv text with the tkinter library in python如何使用循环在 python 中使用 tkinter 库来解析 csv 文本
【发布时间】:2018-08-29 19:45:08
【问题描述】:

我创建了一个循环来搜索 CSV 文件并返回带有指定关键字的行。当 else 函数退出时,循环工作正常。

import csv
from tkinter import *
import tkinter.messagebox as box

master = Tk()

label1 = Label(master, text = 'User_ID', relief = 'groove', width = 40)
label2 = Label(master, text = 'User_Info', relief = 'groove', width = 40, height = 5)

e1 = Entry(master, relief = 'groove', width = 40)
e2 = Text(master, relief = 'groove', width = 40, height = 5, borderwidth = 2)

def enter():
    csvfile = open('stack_example.csv', 'r')
    read = csv.reader(csvfile)
    for row in read:
        if str(e1.get()) in row:
            e2.insert("1.0", row, 'r')
            #break
        #else:
            #box.showinfo('Search Result','Not Found')
            #master.mainloop()


button3 = Button(master, text = 'Retrieve File', relief = 'groove', width = 25, command=enter)

label1.grid( row = 1, column = 1, padx = 10 )
label2.grid( row = 2, column = 1, padx = 10 )

e1.grid( row = 1, column = 2, padx = 10 )
e2.grid( row = 2, column = 2, padx = 10 )

button3.grid( row = 3, column = 1, columnspan = 2)

但是,当 else 函数是代码的一部分时,循环会直接跳到 else 命令并忽略 if 命令。上面产生的输出是将带有关键字的行从 csv 文件插入到文本小部件。但是,下面的输出是一个显示框。 (使用相同的入口关键字,即在csv文件中)

import csv
from tkinter import *
import tkinter.messagebox as box

master = Tk()

label1 = Label(master, text = 'User_ID', relief = 'groove', width = 40)
label2 = Label(master, text = 'User_Info', relief = 'groove', width = 40, height = 5)

e1 = Entry(master, relief = 'groove', width = 40)
e2 = Text(master, relief = 'groove', width = 40, height = 5, borderwidth = 2)

def enter():
    csvfile = open('stack_example.csv', 'r')
    read = csv.reader(csvfile)
    for row in read:
        if str(e1.get()) in row:
            e2.insert("1.0", row, 'r')
            #break
        else:
            box.showinfo('Search Result','Not Found')
            master.mainloop()


button3 = Button(master, text = 'Retrieve File', relief = 'groove', width = 25, command=enter)

label1.grid( row = 1, column = 1, padx = 10 )
label2.grid( row = 2, column = 1, padx = 10 )

e1.grid( row = 1, column = 2, padx = 10 )
e2.grid( row = 2, column = 2, padx = 10 )

button3.grid( row = 3, column = 1, columnspan = 2)

我的理解是,只有当 if 语句为 false 时 else 命令才会执行。但是,else 语句似乎用此代码覆盖了 if 语句。我不确定如何编写一个可以运行的循环:

  1. 如果关键字在 csvfile 中
  2. 然后将带有关键字的行插入到空白小部件中
  3. 如果关键字不在 csvfile 中
  4. 然后会显示一个带有“未找到”文本的框

【问题讨论】:

    标签: python loops csv tkinter


    【解决方案1】:

    当您的else 条件在for 循环中至少出现一次时,文本将发生变化。因此,您的 if 语句代码可能仍在评估中,但您也在同一循环中观察到 else 行为。试试这个:

    import csv
    from tkinter import *
    import tkinter.messagebox as box
    
    master = Tk()
    
    label1 = Label(master, text = 'User_ID', relief = 'groove', width = 40)
    label2 = Label(master, text = 'User_Info', relief = 'groove', width = 40, height = 5)
    
    e1 = Entry(master, relief = 'groove', width = 40)
    e2 = Text(master, relief = 'groove', width = 40, height = 5, borderwidth = 2)
    
    def enter():
        csvfile = open('stack_example.csv', 'r')
        read = csv.reader(csvfile)
        contains_keyword = False
        for row in read:
            if str(e1.get()) in row:
                contains_keyword = True
                break
        if contains_keyword:
            e2.insert("1.0", row, 'r')
        else:
            box.showinfo('Search Result','Not Found')
            master.mainloop()
    
    
    button3 = Button(master, text = 'Retrieve File', relief = 'groove', width = 25, command=enter)
    
    label1.grid( row = 1, column = 1, padx = 10 )
    label2.grid( row = 2, column = 1, padx = 10 )
    
    e1.grid( row = 1, column = 2, padx = 10 )
    e2.grid( row = 2, column = 2, padx = 10 )
    
    button3.grid( row = 3, column = 1, columnspan = 2)
    

    【讨论】:

    • 非常感谢!我已经为此工作了好几个小时!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-12
    • 1970-01-01
    • 1970-01-01
    • 2017-10-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多