python - TypeError:参数应该是整数或无,而不是在 tkinter python 中进行登录时出现“str”错误
问题描述
当我尝试添加username
并password
进入登录页面时,它给了我一个错误:
TypeError:参数应该是整数或无,而不是'str'
该问题出现在登录页面中。整个代码如下:
import tkinter
from tkinter import messagebox
from tkinter import StringVar
class panel:
def ask(self):
ask = tkinter.Tk()
ask.title("Input")
ask.geometry("300x100")
def y():
ask.destroy()
self.login()
def n():
ask.destroy()
self.signup()
stat = tkinter.Label(ask , text = "Are You An Existing User?")
stat.grid(row = 0 , column = 0)
yes = tkinter.Button(ask, text = "Yes" , bg = "Blue" , fg = "Black" , command = y, bd = 5 )
yes.grid(row = 1 , column = 1)
no = tkinter.Button(ask, text = "No" , bg = "Blue", fg = "Black" , command = n, bd = 5)
no.grid(row = 1 , column = 2)
ask.mainloop()
def signup(self):
window = tkinter.Tk()
window.title("Registration Form")
window.geometry("300x300")
var = StringVar()
def callback():
file = open("information.txt", "a")
file.write("\r")
file.write("Data: ")
file.write(firstname1.get())
file.write(" ")
file.write(lastname1.get())
file.write("\n")
file.write(firstname1.get())
file.write("\n")
file.write(lastname1.get())
file.write("\n")
file.write(email1.get())
file.write("\n")
file.write(password1.get())
file.write("\n")
file.write(var.get())
file.write("\r")
file.close()
messagebox.showinfo("Signup", "You have Successfully Signed Up")
self.login()
firstname = tkinter.Label(window, text= "First Name", bg = "Black",fg = "White")
firstname.grid(row= 0, column= 0)
firstname1= tkinter.Entry(window,bd= 5)
firstname1.grid(row= 0 , column = 1)
lastname = tkinter.Label(window, text = "Last Name", bg = "Black", fg = "White")
lastname.grid(row = 1, column = 0)
lastname1= tkinter.Entry(window, bd = 5)
lastname1.grid(row = 1, column = 1)
email = tkinter.Label(window, text = "Email", bg = "Black", fg = "White")
email.grid(row = 2, column = 0)
email1 = tkinter.Entry(window, bd = 5)
email1.grid(row = 2 , column = 1)
password = tkinter.Label(window, text = "Password" , bg = "Black", fg = "White")
password.grid(row = 3 , column = 0)
password1= tkinter.Entry(window, bd = 5)
password1.grid(row = 3 , column = 1)
gender= tkinter.Label(window, text = "Gender", bg = "Black", fg = "White")
gender.grid(row = 4 , column = 0)
male = tkinter.Radiobutton(window,text= "Male" , value = "Male", variable = var )
male.grid(row = 4 , column = 1 , sticky = "nsew")
female = tkinter.Radiobutton(window,text= "Female" , value= "Female" , variable = var)
female.grid(row = 4, column = 2 , sticky = "nsew")
button = tkinter.Button(window, text = "Submit" ,command = callback , bg = "Blue", fg = "White" , height = 2, width = 14)
button.grid(row = 5 , column = 1 , rowspan= 315)
window.mainloop()
def login(self):
signin = tkinter.Tk()
signin.title("Sign In")
signin.geometry("300x300")
def callback():
file = open("information.txt" , "r")
e = file.read(x1.get())
print(e)
p = file.read(y1.get())
print(p)
if e in file and p in file:
messagebox.showinfo("SignIn Notification", "You are Successfully Signed In")
else:
messagebox.showerror("Error", "Email or Password is Incorrect")
file.close()
x = tkinter.Label(signin, text = "Email", bg = "Black", fg = "White" )
x.grid(row = 0 , column = 0)
x1 = StringVar(tkinter.Entry(signin, bd = 5).grid(row = 0 , column = 1))
y = tkinter.Label(signin, text = "Password", bg = "Black", fg = "White")
y.grid(row = 1 , column = 0)
y1 = StringVar(tkinter.Entry(signin, bd = 5).grid(row = 1 , column = 1))
login = tkinter.Button(signin, text = "Sign In" , bd = 5, bg = "Blue" , fg = "Black", height = 2 , width = 10, command = callback )
login.grid(row = 2 , column = 1, rowspan = 2)
signin.mainloop()
def main():
p = panel()
p.ask()
main()
解决方案
您的错误的主要原因是
get()
返回一个字符串并且read()
不带参数或整数。整数只是告诉要读取多少字节。如果任何用户和任何密码不仅与该特定用户匹配,那么即使它有效,您编写回调的方式实际上也会有效。我个人会将此信息存储在字典中,然后检查该字典中的每个用户的电子邮件和密码。
我会将所有条目值和 StringVar 动态放入一个列表中,以便我们可以在创建新用户时使用它。
您当前正在使用多个实例,
Tk()
并且应该只使用一个。为了做你现在正在做的同样的事情,我们可以使用一个中央框架,我们可以更新每个窗口,我们使用它Toplevel()
来创建新窗口。如果需要,您实际上可以将所有这些功能构建到一个类中。现在你有很多不同的事情发生,可能不需要。例如你的函数
y
和n
可以被删除。您可能想查看 PEP8 标准。你的间距到处都是。
修改代码后,我将它从 128 行减少到 94 行。我可能会进一步减少它,但我不想让任何事情变得太混乱。
这是您的代码的重新设计示例,如果您有任何问题,请告诉我:
import tkinter as tk
from tkinter import messagebox
import json
class Main(tk.Tk):
def __init__(self):
super().__init__()
self.title("Input")
self.geometry("300x100")
self.frame = tk.Frame(self)
self.lbl_list = ['First Name', 'Last Name', 'Email', 'Password', 'Gender']
self.entry_list = []
self.build_pain_1()
def clear_frame(self):
self.frame.destroy()
self.frame = tk.Frame(self)
self.frame.grid(row=0, column=0, sticky='nsew')
def build_pain_1(self):
self.clear_frame()
tk.Label(self.frame, text="Are You An Existing User?").grid(row=0, column=0)
tk.Button(self.frame, text="Yes", bg="Blue", fg="Black", command=self.login, bd=5).grid(row=1, column=1)
tk.Button(self.frame, text="No", bg="Blue", fg="Black", command=self.signup, bd=5).grid(row=1, column=2)
def signup_callback(self):
with open("information.txt", "r") as f:
file_dict = json.load(f)
new_dict = {}
for ndex, value in enumerate(self.lbl_list):
print(self.entry_list[ndex].get())
new_dict[value] = self.entry_list[ndex].get()
file_dict["user {}".format(len(file_dict)+1)] = new_dict
with open("information.txt", "w") as file:
json.dump(file_dict, file, indent=4)
self.login()
def signup(self):
self.clear_frame()
self.title("Registration Form")
self.geometry("300x300")
for ndex, txt in enumerate(self.lbl_list):
if ndex+1 < len(self.lbl_list):
tk.Label(self.frame, text=txt, bg="Black", fg="White").grid(row=ndex, column=0)
self.entry_list.append(tk.Entry(self.frame, bd=5))
self.entry_list[-1].grid(row=ndex, column=1)
if ndex+1 == len(self.lbl_list):
tk.Label(self.frame, text="Gender", bg="Black", fg="White").grid(row=ndex, column=0)
self.entry_list.append(tk.StringVar(self))
tk.Radiobutton(self.frame, text="Male", value="Male", variable=self.entry_list[-1],
tristatevalue="x").grid(row=4, column=1, sticky="nsew")
tk.Radiobutton(self.frame, text="Female", value="Female", variable=self.entry_list[-1],
tristatevalue="x").grid(row=4, column=2, sticky="nsew")
tk.Button(self.frame, text="Submit", bg="Blue", fg="White", height=2,
command=self.signup_callback).grid(row=5, column=1)
def login_callback(self):
e = self.email.get()
p = self.passw.get()
valid_login = False
with open("information.txt", "r") as f:
file_dict = json.load(f)
for key, value in file_dict.items():
if file_dict[key]["Email"] == e and file_dict[key]["Password"] == p:
messagebox.showinfo("SignIn Notification", "You are Successfully Signed In")
valid_login = True
if not valid_login:
messagebox.showerror("Error", "Email or Password is Incorrect")
def login(self):
self.clear_frame()
self.title("Sign In")
self.geometry("300x300")
tk.Label(self.frame, text="Email", bg="Black", fg="White").grid(row=0, column=0)
self.email = tk.Entry(self.frame, bd=5)
self.email.grid(row=0, column=1)
tk.Label(self.frame, text="Password", bg="Black", fg="White").grid(row=1, column=0)
self.passw = tk.Entry(self.frame, bd=5)
self.passw.grid(row=1, column=1)
tk.Button(self.frame, text="Sign In", bd=5, bg="Blue", fg="Black", height=2, width=10,
command=self.login_callback).grid(row=2, column=1, rowspan=2)
if __name__ == '__main__':
Main().mainloop()
推荐阅读
- excel - 如何从一系列单元格中选择一个随机的空单元格,直到选择了范围内的所有单元格?
- docker - 创建一个新的 docker 镜像并捕获外部卷内容
- swift - 记录错误 Jazzy “0% 的文档覆盖率,包含 0 个未记录的符号”
- sql - 古怪更新的定义
- javascript - 未捕获的类型错误:无法读取数组 2d 上未定义的属性“0”
- stdvector - 如何将 xarray 转换为 std::vector?
- java - 带有json数据的AJAX POST请求到spring控制器返回状态405
- android - 将firebase集成到android studio时出错
- flutter - .gradle 文件夹增加每次运行颤振调试
- python - 如何在一张图中绘制 30 个特征的分布并在 python 中按标签区分