add_widget отсутствует 1 требуемый позиционный аргумент: ‘screen’ также параметр ‘screen’ не выполнен

#python #kivy

#python #kivy

Вопрос:

редактировать: в нем указано, что он хочет SM.add_widget(self, screen) но если я добавлю это, это станет неразрешенной ссылкой… Я буду продолжать пытаться.

Я приношу извинения за то, что я полный новичок в этом, это мой первый более сложный проект без использования руководства. Я ни за что на свете не могу придумать способ исправить эту ошибку. :/ Я не хочу использовать файл .kv для этого проекта.

 Traceback (most recent call last): 

File "C:UsersdantiPycharmProjectsIoUmain.py", line 188, in <module>
     SM.add_widget(screen)
 TypeError: add_widget() missing 1 required positional argument: 'screen'
  

Я попробовал несколько форматов, чтобы попытаться решить это самостоятельно, но через 3 часа я потерялся.

при наведении курсора мыши на

(экран)

в той же строке # 188 показано

параметр ‘screen’ не выполнен.

Я не понимаю, что искать дальше.

Вот мой main.py файл (строка ошибки 10-я снизу main.py )

 `from kivy.uix.widget import Widget
from kivy.uix.button import Button
from kivy.graphics import Rectangle, Ellipse
from kivy.uix.screenmanager import Screen, ScreenManager
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.gridlayout import GridLayout
from kivy.uix.label import Label
from kivy.uix.textinput import TextInput
from kivy.app import App
from kivy.uix.popup import Popup
from kivy.properties import ObjectProperty
from database import DataBase


def invalidlogin():
    pop = Popup(title='Invalid Login',
                content=Label(text='Invalid username or password.'),
                size_hint=(None, None), size=(400, 400))
    pop.open()


def invalidform():
    pop = Popup(title='Invalid Form',
                content=Label(text='Please fill in all inputsn with valid information.'),
                size_hint=(None, None), size=(400, 400))
    pop.open()


db = DataBase('users.txt')


class SM(ScreenManager):
    pass


def dbvalidatelgn(self, *args):
    if db.validate(self.email, self.password):
        Wlcm.current = self.email.text
        self.reset()
        SM.current = '_wlcm'
    else:
        invalidlogin()


class MyLogin(Screen):
    email = ObjectProperty(None)
    password = ObjectProperty(None)

    def __init__(self, **kwargs):
        super(MyLogin, self).__init__(**kwargs)

        self.inner = GridLayout()
        self.inner.cols = 2
        self.inner.rows = 2
        self.inner.size_hint = (1, .25)
        self.inner.pos_hint = {'x': 0, 'top': .8}

        self.inner.add_widget(Label(text='Email:'))
        self.email = TextInput(multiline=False)
        self.inner.add_widget(self.email)

        self.inner.add_widget(Label(text='Password:'))
        self.password = TextInput(multiline=False)
        self.inner.add_widget(self.password)

        self.submit = Button(text='Login')
        self.submit.font_size = 20
        self.add_widget(self.submit)
        self.submit.size_hint = (.8, .15)
        self.submit.pos_hint = {'top': .4, 'right': .9}
        self.submit.bind(on_release=dbvalidatelgn)

        self.noacct = Label(text='Don't have an account?')
        self.noacct.font_size = 14
        self.add_widget(self.noacct)
        self.noacct.size_hint = (.8, .15)
        self.noacct.pos_hint = {'top': .28, 'right': .9}

        self.newacct = Button(text='Create New Account', )
        self.newacct.font_size = 13
        self.add_widget(self.newacct)
        self.newacct.size_hint = (.6, .07)
        self.newacct.pos_hint = {'top': .15, 'right': .8}
        self.newacct.bind(on_release=self.new_acct)

        self.add_widget(self.inner)

    def new_acct(self, *args):
        self.manager.current = '_newacct'

    def Welcome(self, *args):
        self.manager.current = '_wlcm'


class NewAcct(Screen):
    name = ObjectProperty(None)
    email = ObjectProperty(None)
    password = ObjectProperty(None)

    def __init__(self, **kwargs):
        super(NewAcct, self).__init__(**kwargs)

        self.inner = GridLayout()
        self.inner.cols = 2
        self.inner.rows = 3
        self.inner.size_hint = (1, .25)
        self.inner.pos_hint = {'x': 0, 'top': .8}

        self.inner.add_widget(Label(text='Name:'))
        self.name = TextInput(multiline=False)
        self.inner.add_widget(self.name)

        self.inner.add_widget(Label(text='Email:'))
        self.email = TextInput(multiline=False)
        self.inner.add_widget(self.email)

        self.inner.add_widget(Label(text='Password:'))
        self.password = TextInput(multiline=False)
        self.inner.add_widget(self.password)

        self.create = Button(text='Submit')
        self.create.font_size = 20
        self.add_widget(self.create)
        self.create.size_hint = (.8, .15)
        self.create.pos_hint = {'top': .4, 'right': .9}

        self.hasacct = Label(text='Already have an account?')
        self.hasacct.font_size = 14
        self.add_widget(self.hasacct)
        self.hasacct.size_hint = (.8, .15)
        self.hasacct.pos_hint = {'top': .28, 'right': .9}

        self.retlog = Button(text='Return to Login', )
        self.retlog.font_size = 13
        self.add_widget(self.retlog)
        self.retlog.size_hint = (.6, .07)
        self.retlog.pos_hint = {'top': .15, 'right': .8}
        self.retlog.bind(on_release=self.has_acct)

        self.add_widget(self.inner)

    def has_acct(self, *args):
        self.manager.current = '_mylgn'

    def create_new(self):
        if self.name.text != '' and self.email.text != '' and self.email.text.count('@') == 1 and self.email.text.count(
                '.') > 0:
            if self.password != '':
                db.add_user(self.email.text, self.password.text, self.name.text)
            self.reset()
        else:
            invalidform()

    def login(self):
        self.reset()
        SM.current = '_mylgn'

    def reset(self):
        self.email.text = ''
        self.password.text = ''
        self.name.text = ''
        SM.current = '_mylgn'


class Wlcm(Screen):

    def __init__(self, **kwargs):
        super(Wlcm, self).__init__(**kwargs)

        self.wlcmtxt = Label(text='Login Successful!nWelcome!')
        self.wlcmtxt.font_size = 30
        self.add_widget(self.wlcmtxt)

        self.retlog = Button(text='Log Out', )
        self.retlog.font_size = 16
        self.add_widget(self.retlog)
        self.retlog.size_hint = (.6, .07)
        self.retlog.pos_hint = {'top': .15, 'right': .8}
        self.retlog.bind(on_release=self.have_acct)

    def have_acct(self, *args):
        self.manager.current = '_mylgn'


screen = Screen()
screens = [MyLogin(name='_mylgn'), NewAcct(name='_newacct'), Wlcm(name='_wlcm')]
for screen in screens:
    SM.add_widget(screen)
#SM.add_widget(MyLogin(name='_mylgn'), screen)
#SM.add_widget(NewAcct(name='_newacct'), screen)
#SM.add_widget(Wlcm(name='_wlcm'), screen)
SM.current = '_mylgn'

class MyApp(App):
    def build(self):
        return MyLogin()


if __name__ == '__main__':
    MyApp().run()
`
  

Вот мой database.py файл, который помогает

 import datetime
from kivy.uix.popup import Popup
from kivy.uix.label import Label


class DataBase:
    def __init__(self, filenaem):
        self.filename = filenaem
        self.users = None
        self.file = None
        self.load()

    def load(self):
        self.file = open(self.filename, 'r')
        self.users = {}

        for line in self.file:
            email, password, name, created = line.strip().split(';')
            self.users[email] = (password, name, created)

        self.file.close()

    def get_user(self, email):
        if email in self.users:
            return self.users[email]
        else:
            return -1

    def add_user(self, email, password, name):
        if email.strip() not in self.users:
            self.users[email.strip()] = (password.strip(), name.strip(), DataBase.get_date())
            self.save()
        else:
            print('This email already exists!')
            return -1

    def validate(self, email, password):
        if self.get_user(email) != -1:
            return self.users[email][0] == password
        else:
            return False

    def save(self):
        with open(self.filename, 'w') as f:
            for user in self.users:
                f.write(user   ';'   self.users[user][0]   ';'   self.users[user][1]   ';'   self.users[user][2]   'n')

    @staticmethod
    def get_date():
        return str(datetime.datetime.now()).split(' ')[0]
  

Ответ №1:

add_widget() Метод ScreenManager является методом экземпляра и, как ожидается, будет вызван в экземпляре ScreenManager . В вашем коде SM является ScreenManager классом, он не является экземпляром ScreenManager . Итак, вам нужно создать экземпляр, выполнив что-то вроде:

 sm = SM()
screens = [MyLogin(name='_mylgn'), NewAcct(name='_newacct'), Wlcm(name='_wlcm')]
for screen in screens:
    sm.add_widget(screen)
  

Ваш build() метод, вероятно, должен выглядеть так:

 class MyApp(App):
    def build(self):
        return sm