首页 > 解决方案 > TypeError:参数应该是整数或无,而不是在 tkinter python 中进行登录时出现“str”错误

问题描述

当我尝试添加usernamepassword进入登录页面时,它给了我一个错误:

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()

标签: pythonpython-3.xtkintertypeerror

解决方案


  1. 您的错误的主要原因是get()返回一个字符串并且read()不带参数或整数。整数只是告诉要读取多少字节。

  2. 如果任何用户和任何密码不仅与该特定用户匹配,那么即使它有效,您编写回调的方式实际上也会有效。我个人会将此信息存储在字典中,然后检查该字典中的每个用户的电子邮件和密码。

  3. 我会将所有条目值和 StringVar 动态放入一个列表中,以便我们可以在创建新用户时使用它。

  4. 您当前正在使用多个实例,Tk()并且应该只使用一个。为了做你现在正在做的同样的事情,我们可以使用一个中央框架,我们可以更新每个窗口,我们使用它Toplevel()来创建新窗口。

  5. 如果需要,您实际上可以将所有这些功能构建到一个类中。现在你有很多不同的事情发生,可能不需要。例如你的函数yn可以被删除。

  6. 您可能想查看 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()

推荐阅读