【问题标题】:Getting user input and checking if it exists in a list获取用户输入并检查它是否存在于列表中
【发布时间】:2022-01-17 20:54:10
【问题描述】:

我正在尝试检查用户输入作为字符串是否存在于名为 categoriesList 的列表中,该列表从名为 categories.txt 的文本文件中附加类别。如果用户输入了一个存在于 categoriesList 中的类别,我的代码应该能够打印出“类别存在”,否则“类别不存在”。

代码如下:

categoriesList = []
with open("categories.txt", "r") as OpenCategories:
    for category in (OpenCategories):
        categoriesList.append(category)
        while True:
            inputCategories = input("Please enter a category:")
            if inputCategories in categoriesList:
                print("Category exists")
                break
            else:
                print("Category doesn't exist")
                break

当我运行此代码时,它总是输出类别不存在,即使我输入的类别实际上存在于 categoriesList 中。我将如何在代码中解决这个问题?此外,我希望能够从用户那里获得一个输入来输入一个类别,所以我不希望“请输入一个类别”出现多次,我只希望代码让它只出现一次。

此外,如果我能知道如何在 tkinter 中完成上述所有操作的代码,我将不胜感激,因为我需要在 GUI 中执行上述操作。我认为您需要有标签并允许用户在屏幕上的框中输入类别。

我尝试编写代码,在获取 tk 屏幕上的输入后尝试检查列表中是否存在用户输入,因为它不足以让我只在 python 控制台中进行检查并且它没有正确执行,所以这里是代码:

import tkinter as tk
from tkinter import ttk
window=tk.Tk()
canvas1 = tk.Canvas(window, width = 400, height = 300)
canvas1.pack()
label1 = Label(window, text="Please enter a category:")
label1.pack()
entry = Entry(window, width=50)
entry.pack()
def for_button():
       checkUserInput = entry.get()
button = Button(window, text="Check", command=for_button)
button.pack()
for i in categoriesList:
     if button in categoriesList:
         categoryExist = Label(window, text="Category exists")
         categoryExist.pack()
     else:
         categoryNotExist= Label(window, text="Category doesn't exist")
         categoryNotExist.pack()
 window.mainloop() 

它使用给出的帖子中代码早期的列表 categoriesList ,我试图让用户在 tk 屏幕上的文本框中输入一个类别,然后在用户可以之前单击“检查”按钮输入“类别不存在”多次出现,这是我不希望代码执行的操作。

【问题讨论】:

  • 一个建议,尤其是当categoriesList 很小的时候,改为写print("Category doesn't exist", categoriesList, inputCategories)。这可能会更详细地说明为什么它在列表中找不到输入类别。
  • “如果我能知道如何在 tkinter 中完成上述所有操作的代码,我将不胜感激” - Stackoverflow 不是免费的编码服务。最好的办法是完成 tkinter 教程,然后在遇到问题的特定部分时回到这里。
  • while 循环不应在for 循环内。实际上,while 循环根本不需要。

标签: python list tkinter


【解决方案1】:

当您从文本文件中读取时,您还会读取特殊字符,例如 '\n',因此必须将其删除。这可以如下面的代码所示完成。

我还稍微调整了循环布局,因为您不希望在 for 循环中包含 while 循环 - 否则您将在添加所有类别之前搜索列表。

categoriesList = []
with open("categories.txt", "r") as OpenCategories:
    for category in (OpenCategories):
        categoriesList.append(category.strip()) #remove newline, tabs etc
    
inputCategories = input("Please enter a category:")
if inputCategories in categoriesList:
    print("Category exists")
else:
    print("Category doesn't exist")

您可能还想从类别列表中删除所有空格' '。这可以通过替换来完成

category.strip()

category.strip().replace(' ','')

您可能还希望将输入的变量和类别全部设为小写,以便于比较。这可以使用字符串上的lower 函数来完成。

例如inputCategories = inputCategories.lower()

【讨论】:

    【解决方案2】:

    while 循环不应该在 for 循环内,而且 while 循环根本没有必要:

    with open("categories.txt", "r") as OpenCategories:
        categoriesList = OpenCategories.read().splitlines()
    
    # don't need the while loop
    inputCategories = input("Please enter a category:")
    if inputCategories in categoriesList:
        print("Category exists")
    else:
        print("Category doesn't exist")
    

    对于使用 GUI 更新的代码,您需要将检查放在 for_button() 函数中:

    import tkinter as tk
    
    # load category list from file
    with open("categories.txt") as OpenCategories:
        categoriesList = OpenCategories.read().splitlines()
    
    window = tk.Tk()
    
    label1 = tk.Label(window, text="Please enter a category:")
    label1.pack()
    
    # user input category
    entry = tk.Entry(window, width=50)
    entry.pack()
    
    def for_button():
        checkUserInput = entry.get()
        if checkUserInput in categoriesList:
            result.config(text="Category exists", fg="green")
        else:
            result.config(text="Category doesn't exist", fg="red")
    
    button = tk.Button(window, text="Check", command=for_button)
    button.pack()
    
    # label for check result
    result = tk.Label(window)
    result.pack()
    
    window.mainloop()
    

    【讨论】:

    • 您如何从输入框中获取用户输入的类别,该输入框可能全部以小写字母输入并全部设为大写字母,因为这就是我在文本文件中拥有类别的方式?这意味着如果用户输入的类别全部用小写字母并且它存在于文本文件中,则代码在实际出现时显示“类别不存在”。我只是想使代码对不止一种类型的输入更加灵活,我尝试在“检查”按钮的代码行中使用与变量和文本变量关联的 StringVar(),但出现错误。跨度>
    • 如果文件中存储的类别全部为大写,则使用checkUserInput = entry.get().upper()
    • 好的,我已经尝试过 entry.get().upper() 并且可以正常工作
    猜你喜欢
    • 1970-01-01
    • 2014-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-01
    • 1970-01-01
    相关资源
    最近更新 更多