【问题标题】:If statement to check if the value of a variable is in a JSON file [closed]If语句检查变量的值是否在JSON文件中[关闭]
【发布时间】:2021-06-08 22:52:02
【问题描述】:

我是个新手,所以尽量不要评判我。我正在尝试基于旧的 2d 马里奥创建一个小型 2d 游戏。我已经有主窗口、注册和登录窗口,并且我有一个 json 文件来保存用户名和密码。 现在,我正在尝试使用登录功能。 问题似乎是这一行:

if plpaword in players['password']

这应该可以帮助您了解变量代表什么

f = open('player.json')
players = json.load(f)
plpaword = E2.get()

当我运行我的代码时,在我尝试登录之前,其他一切似乎都可以正常工作。登录后,它应该会创建一个新窗口,但发生的情况是什么都没有发生,并且它给出了错误:

Exception in Tkinter callback
Traceback (most recent call last):
  File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/tkinter/__init__.py", line 1883, in __call__
    return self.func(*args)
  File "/Users/kevin/PycharmProjects/ANewFile/ANewFile.py", line 101, in LI
    passwords = players['password']
KeyError: 'password'

我使用了这些模块:

from tkinter import *
import tkinter
import tkinter.messagebox
from tkinter import messagebox
from tkinter import Tk, Button, Frame, Entry, END
import random
import json

创建一个帐户并将其保存到我的 player.json 文件中:

    def SU():
        try:
            plusname = E1.get()
            plpaword = E2.get()
            plpaword2 = E3.get()
            plemail = E4.get()
            if plpaword == plpaword2:
                if plusname in players:
                    messagebox.showerror(random.choice(error), "An account with that username already exists. "
                                                               "Please choose another.")
                else:
                    players[plusname] = {'password': plpaword, 'email': plemail}
                    with open('player.json', 'w') as f:
                        json.dump(players, f)
                    signup.destroy()
                    messagebox.showinfo("Account Created!", "Please log in to your new account through log in.")
            else:
                messagebox.showerror(random.choice(error), "Passwords did not match. Please try again")
        except:
            messagebox.showerror(random.choice(error), random.choice(errormsg))

【问题讨论】:

  • 请提供player.json文件的例子。
  • 没有看到 player.json 里面有什么,我怀疑我们能提供帮助。
  • 请提供预期的minimal, reproducible example (MRE)。我们应该能够复制和粘贴您的代码的连续块,执行该文件,并重现您的问题以及跟踪问题点的输出。这让我们可以根据您的测试数据和所需的输出来测试我们的建议。
  • 该特定错误似乎是因为players 字典中不存在密钥password,而您正尝试在if plpaword in players['password'] 行中访问它。处理此问题的经典方法是将尝试包装在 try/except 中,但 Dictionary 对象也有一个 get 方法,可以更简洁地处理它并允许您设置可迭代的默认值。免责声明:过去几年我没有在 Python 中工作过,所以可能有更好的方法
  • 在进行检查之前,您应该首先检查players 是什么。这可能不是你想象的那样。

标签: python json tkinter


【解决方案1】:

根据SU()的代码,JSON文件里面的内容(也是players的内容)应该是这样的:

{
  "user1": {"password": "pass1", "email": "user1@email.com"},
  "user2": {"password": "pass2", "email": "user2@email.com"}
}

所以检查应该是:

plusname = E1.get()
plpaword = E2.get()
for player in players:
    if plusname == player and plpaword == players[plusname]["password"]:
        print("login successful")
        break
else:
    print("login failed")

players["password"] 应改为players[plusname]["password"]

【讨论】:

  • 我联系了一位朋友并得到了类似的答案。无论如何,感谢您抽出宝贵的时间回答我的问题。
猜你喜欢
  • 1970-01-01
  • 2016-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-10
相关资源
最近更新 更多