Как использовать циклы для анализа текста CSV с библиотекой Tkinter в Python - PullRequest
0 голосов
/ 29 августа 2018

Я создал цикл для поиска файла 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 ложен, команда else выполняется. Тем не менее, оператор else, кажется, переопределяет оператор if с этим кодом. Я не уверен, как написать цикл, который будет функционировать так:

  1. если ключевое слово находится в csvfile
  2. затем строка с ключевым словом вставляется в пустой виджет
  3. если ключевое слово отсутствует в csvfile
  4. затем отображается окно с текстом «Not Found»

1 Ответ

0 голосов
/ 29 августа 2018

Когда ваше условие 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...