: 调用 Python 对象时超出最大递归深度,python,python-3.x,python-import,importerror"/>

首页 > 解决方案 > ctypes.ArgumentError:参数 3:: 调用 Python 对象时超出最大递归深度

问题描述

我是 python 新手。我正在尝试使用 Kivy 作为 GUI 在 python 中创建注册/登录系统。当涉及到单个 .py 文件时,我的代码就像一个魅力,但是,当我调用(使用import Login)另一个 .py 脚本时,一切都崩溃了。

这是我的 Register.py 文件:

import mysql.connector
from mysql.connector import Error
import kivy
from kivy.app import App
from kivy.uix.label import Label
from kivy.uix.image import Image
from kivy.core.window import Window
from kivy.config import Config
from kivy.uix.button import Button
from kivy.uix.textinput import TextInput
from kivy.uix.widget import Widget
from kivy.lang import Builder

db = mysql.connector.connect(host="localhost",
                     user="user",
                     passwd="password",
                     db="database",)

mycursor = db.cursor()

Builder.load_file("Stuff.kv")

condse = "@", "mail", ".",

class Stuff(Widget):

    def register(self):

        email = (self.ids.email.text)

        pw = (self.ids.password.text)

        mycursor.execute("select count(*) from email_password where email = %s", (email,))

        result = mycursor.fetchone()[0]

        if result < 1:
            if len(email) > 1:
                if all(condse in email for condse in condse):

                        if not pw.islower() and not pw.isupper() or pw.isupper():

                            Acc = email, pw

                            Form = "INSERT INTO email_password (email, password) VALUES (%s, %s)"

                            mycursor.execute(Form, Acc)

                            db.commit()

                            import Login           #<-----------THIS IS THE PROBLEMATIC IMPORT



    def quit(self):
        Register().stop()

class Register(App):
    def build(self):
        Window.size = (1920, 1080)
        Window.fullscreen = False
        return Stuff()

Register().run()

最小的 Register.py 文件

class Stuff(Widget):
    def register(self):
        import Login  #<-------- Problematic Import
    

class Register(App):
    def build(self):
        Window.size = (1920, 1080)
        Window.fullscreen = False
        return Stuff()

Register().run()

这是我的 Login.py 文件:

import mysql.connector
from mysql.connector import Error
import kivy
from kivy.app import App
from kivy.uix.label import Label
from kivy.uix.image import Image
from kivy.core.window import Window
from kivy.config import Config
from kivy.uix.button import Button
from kivy.uix.textinput import TextInput
from kivy.uix.widget import Widget
from kivy.lang import Builder


db = mysql.connector.connect(host="localhost",
                     user="user",
                     passwd="password",
                     db="database",)

mycursor = db.cursor()

Builder.load_file("Stuff1.kv")

condse = "@", "mail", ".",



class Stuff1(Widget):

    def login(self):

        email1 = (self.ids.email.text)

        pw1 = (self.ids.password.text)

        mycursor.execute("select count(*) from email_password where email = %s", (email1,))

        result = mycursor.fetchone()[0]

        if result > 1 and len(email1) > 1:

            if not pw1.islower() and not pw1.isupper() or pw1.isupper() and len(pw1) > 8:

                Acc = email1, pw1

                Form = "INSERT INTO email_password (email, password) VALUES (%s, %s)"

                mycursor.execute(Form, Acc)
            else:
                print("The password must contain 8 characters and at least 1 capital letter")
        else:
            pass

    def quit(self):
        Login().stop()


class Login(App):
    def build(self):
        Window.size = (1920, 1080)
        Window.fullscreen = False
        return Stuff1()


Login().run()

db.commit()

最小登录.py

class Stuff1(Widget):

    def login(self):
    def quit(self):  #this is a button function that i use to quit (not very important, it's just to tell you what it does)
        Login().stop()


class Login(App):
    def build(self):
        Window.size = (1920, 1080)
        Window.fullscreen = False
        return Stuff1()


Login().run()

当我单击“提交”按钮( def register(self):)时,它应该关闭“注册”脚本并打开“登录”脚本,但相反,它会崩溃并在运行控制台中发送此错误:

 Traceback (most recent call last):
   File "C:\Users\Mattia Antonacci\Desktop\Robe\RipetraMySql\venv\lib\site-packages\kivy\input\providers\wm_pen.py", line 74, in _pen_wndProc
     return windll.user32.CallWindowProcW(self.old_windProc,
 ctypes.ArgumentError: argument 3: <class 'RecursionError'>: maximum recursion depth exceeded while calling a Python object

我希望有一个人可以帮助我...

标签: pythonpython-3.xpython-importimporterror

解决方案


从您的最小示例中,我认为这应该可以解决您的问题。当您导入时,它通常会在每次不“重新加载”文件时引入代码。从另一个 python 脚本运行 python 脚本通常你会希望可执行代码在函数中并将它们称为module.function().

此外,您还需要将“主要”可执行代码放入if __name__ == '__main__':语句中。这允许文件既可以运行python foo.py也可以导入,import foo否则,当您import foo将执行所有代码时。请注意,即使多个地方导入同一个库,它通常也只会真正导入一次。

import Login

class Stuff(Widget):
    def register(self):
        #import Login  #<-------- Problematic Import
        Login.Login().run()
    

class Register(App):
    def build(self):
        Window.size = (1920, 1080)
        Window.fullscreen = False
        return Stuff()

if __name__ == '__main__':
    Register().run()

登录.py

class Stuff1(Widget):

    def login(self):
        pass
    def quit(self):  #this is a button function that i use to quit (not very important, it's just to tell you what it does)
        Login().stop()


class Login(App):
    def build(self):
        Window.size = (1920, 1080)
        Window.fullscreen = False
        return Stuff1()

#This makes it so the code ONLY runs when 
# this is the script is called from python vs. import.
# i.e. python Login.py
if __name__ == '__main__':
    Login().run()

推荐阅读