TypeError: аргумент должен быть целым или None, а не ошибкой 'str' при выполнении входа в tkinter pyhton - PullRequest
0 голосов
/ 25 февраля 2020

Когда я пытаюсь добавить 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()

Ответы [ 2 ]

1 голос
/ 25 февраля 2020
  1. Основная причина вашей ошибки заключается в том, что get() возвращает строку, а read() не принимает аргументов или целое число. Целое число просто указывает, сколько байтов нужно прочитать.

  2. То, как вы написали свой обратный вызов, даже если бы он работал, действительно сработало бы, если бы какой-либо пользователь и любой пароль соответствовали не только для этого конкретного c пользователь. Лично я храню эту информацию в словаре, а затем проверяю каждого пользователя в этом словаре на наличие адреса электронной почты и пароля.

  3. Я бы помещал все значения записей и StringVar в список динамически, так что мы можем использовать его при создании нового пользователя.

  4. В настоящее время вы используете несколько экземпляров Tk() и должны использовать только один. Чтобы сделать то же самое, что вы делаете сейчас, мы можем либо использовать центральный фрейм, который мы можем обновлять для каждого окна: Toplevel(), чтобы создать новый windows.

  5. Вы можете на самом деле собрать все эти функции в один класс, если хотите. Прямо сейчас у вас происходит много разных вещей, которые могут не понадобиться Например, ваши функции y и n могут быть удалены.

  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()
0 голосов
/ 25 февраля 2020

file.read() принимает только целые числа. Но x1.get() всегда возвращает строку. Если x1.get() было числом в строковой форме, вы могли бы разыграть int(x1.get()). Но я не думаю, что это так.

Позвольте мне попытаться исправить часть кода для вас:

x1 = StringVar(tkinter.Entry(signin, bd = 5).grid(row = 0 , column = 1))
x1.get()

всегда возвращает пустую строку для меня. Вместо этого попробуйте:

x1 = tkinter.Entry(signin, bd = 5)
x1.grid(row=0, column = 1)
x1.get()

Я могу только догадываться, что вы пытаетесь сделать с file.read(x1.get()), но если вы хотите посмотреть, есть ли введенные вами адрес электронной почты и пароль в вашем файле information.txt, вы можно сделать следующим образом:

file = open("information.txt", "r")
information = file.read()
if x1.get() in text and y1.get() in information:
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...