Не могу получить доступ к экземплярам в коде ошибки класса при инициализации - PullRequest
0 голосов
/ 29 января 2020

Каждый раз, когда я пытаюсь инициализировать экран kivy, я всегда получаю сообщение об ошибке, даже если я исследовал его, и это показывает, что я делаю это правильно. Я хочу получить доступ к экземплярам из моего ProjectListScreen class, я инициализировал экземпляры в None, но инициализация экрана в ApplyPage не работает, я попытался создать экземпляр класса, используя Factory, в мой ApplyPage class, но он по-прежнему не возвращает значение экземпляра. Ниже приведен мой код, а после - трассировка, когда я пытаюсь инициализировать класс экрана. Буду признателен за любую помощь. пожалуйста, я боролся с этим весь день.

class ProjectListScreen(Screen):
    project_list = ObjectProperty(None)
    def __init__(self, **kwargs):
        super(ProjectListScreen, self).__init__(**kwargs)
        self.thelocalId = None
        self.placementtext = None


    def on_pre_enter(self, *args):
        placements = database.child("placements").get()
        placementslist = placements.val()
        placementslist.items()
        for key, value in placementslist.items():
            self.key = key
            key_list = []
            key_list.append(key)
            for key in key_list:
                name = database.child("placements").child(str(key)).child("placement name").get()
                description = database.child("placements").child(str(key)).child("placement description").get()
                location = database.child("placements").child(str(key)).child("placement location").get()
                date = database.child("placements").child(str(key)).child("placement date").get()
                price = database.child("placements").child(str(key)).child("placement price").get()
                thelocalId = database.child("placements").child(str(key)).child("localId").get()
                self.thelocalId = thelocalId.val()
                self.project_list.adapter.data.extend([ "\n" + "\n" + str(name.val()) + '\n' + str(description.val()) + "\n" + str(location.val()) + '\n' + str(date.val()) + '\n' + '\n' + str(price.val())])

    def gettext(self):
        self.placementtext = self.project_list.adapter.selection[0].text

class ApplyPage(Screen):
    projectlistscreen = ObjectProperty(None)

    def __init__(self, projectlistscreen, **kwargs):
        super(ApplyPage, self).__init__(**kwargs)
        self.projectlistscreen = projectlistscreen
        self.yes = Button(text="Yes", font_size = 20, font_name= "fonts/Qanelas-Heavy.otf", background_color = (0.082, 0.549, 0.984, 1.0), background_normal= '', pos_hint = {"x":0.1,"y":0.05}, size_hint= [0.2, 0.1])
        self.add_widget(self.yes)
        self.no = Button(text="No", font_size= 20, font_name= "fonts/Qanelas-Heavy.otf", background_color = (0.082, 0.549, 0.984, 1.0), background_normal= '', pos_hint = {"x":0.7, "y":0.05}, size_hint= [0.2, 0.1])
        self.no.bind(on_pressed=self.nopressed)
        self.add_widget(self.no)

    def nopressed(self, instance):
        sm.current = "placements"

class MyApp(App):
    refresh_token_file = "refresh_token.txt"
    members_list = "members_list.txt"





    def build(self):
        self.refresh_token_file = self.user_data_dir + self.refresh_token_file
        self.thefirebase = MyFireBase()



        return sm

projectlistscreen = ProjectListScreen()
wm = WindowManager()
wm.add_widget(ApplyPage(projectlistscreen=projectlistscreen))

sm = Builder.load_file("kivy.kv")

файл kivy

#:import Factory kivy.factory.Factory
#: import mainfile mainfile
#: import ListAdapter kivy.adapters.listadapter.ListAdapter
#: import ListItemButton kivy.uix.listview.ListItemButton
#: import FileChooserIconView kivy.uix.filechooser.FileChooserIconView



WindowManager:
    id: window manager
    ApplyPage:
        id: applyingpage
        name: "applyingpage"
    ProjectListScreen:
        id: project_list_screen
        name: "project_list_screen"

<ApplyPage>:

    name: "applyingpage"

    canvas.before:
        Color:
            rgba: 1, 1, 1, 1
        Rectangle:
            pos: self.pos
            size: self.size

<ProjectListScreen>:

    project_list: project_list_view

    canvas.before:
        Color:
            rgba: 1, 1, 1, 1
        Rectangle:
            pos: self.pos
            size: self.size


    Image:
        source: "icons/m.png"
        pos_hint: {"center_x": 0.5, "center_y": 0.95}



    BoxLayout:
        orientation: 'vertical'
        pos_hint: {"center_x": 0.3, "center_y": 0.3}

        ListView:
            id: project_list_view
            adapter:
                ListAdapter(data=[], cls = mainfile.ProjectListButton)




Ниже приведен мой откат

 Traceback (most recent call last):
   File "/Users/temitayoadefemi/PycharmProjects/test5/mainfile.py", line 836, in <module>
     sm = Builder.load_file("kivy.kv")
   File "/Users/temitayoadefemi/PycharmProjects/test5/venv/lib/python3.7/site-packages/kivy/lang/builder.py", line 301, in load_file
     return self.load_string(data, **kwargs)
   File "/Users/temitayoadefemi/PycharmProjects/test5/venv/lib/python3.7/site-packages/kivy/lang/builder.py", line 368, in load_string
     parser = Parser(content=string, filename=fn)
   File "/Users/temitayoadefemi/PycharmProjects/test5/venv/lib/python3.7/site-packages/kivy/lang/parser.py", line 392, in __init__
     self.parse(content)
   File "/Users/temitayoadefemi/PycharmProjects/test5/venv/lib/python3.7/site-packages/kivy/lang/parser.py", line 498, in parse
     self.execute_directives()
   File "/Users/temitayoadefemi/PycharmProjects/test5/venv/lib/python3.7/site-packages/kivy/lang/parser.py", line 462, in execute_directives
     mod = __import__(package)
   File "/Users/temitayoadefemi/PycharmProjects/test5/mainfile.py", line 836, in <module>
     sm = Builder.load_file("kivy.kv")
   File "/Users/temitayoadefemi/PycharmProjects/test5/venv/lib/python3.7/site-packages/kivy/lang/builder.py", line 301, in load_file
     return self.load_string(data, **kwargs)
   File "/Users/temitayoadefemi/PycharmProjects/test5/venv/lib/python3.7/site-packages/kivy/lang/builder.py", line 400, in load_string
     self._apply_rule(widget, parser.root, parser.root)
   File "/Users/temitayoadefemi/PycharmProjects/test5/venv/lib/python3.7/site-packages/kivy/lang/builder.py", line 582, in _apply_rule
     child = cls(__no_builder=True)
 TypeError: __init__() missing 1 required positional argument: 'projectlistscreen'

Новый код ошибки

File "/Users/temitayoadefemi/PycharmProjects/test5/mainfile.py", line 834, in <module>
     wm.add_widget(ApplyPage(projectlistscreen))
 TypeError: __init__() takes 1 positional argument but 2 were given

Если бы кто-нибудь мог определить, что я делаю неправильно, почему экран не инициализируется. спасибо

Ответы [ 2 ]

0 голосов
/ 30 января 2020

Я бы удалил эту вещь из .kv файла

WindowManager:
    id: window manager
    ApplyPage:
        id: applyingpage
        name: "applyingpage"
    ProjectListScreen:
        id: project_list_screen
        name: "project_list_screen"

И удалил это из Python

wm = WindowManager()
wm.add_widget(ApplyPage(projectlistscreen=projectlistscreen))

sm = Builder.load_file("kivy.kv")

И удалил это из класса ApplyPage

def nopressed(self, instance):
        sm.current = "placements"

Все, что вам нужно, это:

class WindowManager(ScreenManager):
    def __init__(self, **kwargs):
        super(WindowManager, self).__init__(**kwargs)

class MyApp(App):
    ...

    def build(self):
        self.refresh_token_file = self.user_data_dir + self.refresh_token_file
        self.thefirebase = MyFireBase()

        # I think you will need these objects later, so better to do it accessable for the whole class
        self.sm = WindowManager()
        self.pls = ProjectListScreen()
        self.applypage = ApplyPage(self.pls)

        # then add that screens to screen manager (it's even more simple than to do it in .kv)
        self.sm.add_widget(self.pls)
        self.sm.add_widget(self.applypage)
        return self.sm

    # if you need a transition to another screen, you can create method here
    def toapplypage(self):
        self.sm.transition.direction = 'left'
        self.sm.current = "applyingpage"

Вы можете использовать методы для изменения экрана в других классах, но вам нужно отправить туда объект, который вы создали в методе сборки. Поэтому вызов этих методов будет выглядеть так:

# it's only an example!
self.applypage.nopressed(self.sm)

И не забудьте записать имя класса ProjectListScreen в файл .kv.

0 голосов
/ 29 января 2020

Для метода __init__() вашего класса ApplyPage требуется позиционный параметр projectlistscreen. Когда файл kv загружен и обнаружен ApplyPage:, этот метод __init__() вызывается без обязательного параметра projectlistscreen. Я предлагаю изменить этот метод __init__(), чтобы сделать параметр projectlistscreen a kwarg следующим образом:

def __init__(self, **kwargs):
    self.projectlistscreen = kwargs.pop('projectlistscreen', None)
    super(ApplyPage, self).__init__(**kwargs)
    self.yes = Button(text="Yes", font_size = 20, font_name= "fonts/Qanelas-Heavy.otf", background_color = (0.082, 0.549, 0.984, 1.0), background_normal= '', pos_hint = {"x":0.1,"y":0.05}, size_hint= [0.2, 0.1])
    self.add_widget(self.yes)
    self.no = Button(text="No", font_size= 20, font_name= "fonts/Qanelas-Heavy.otf", background_color = (0.082, 0.549, 0.984, 1.0), background_normal= '', pos_hint = {"x":0.7, "y":0.05}, size_hint= [0.2, 0.1])
    self.no.bind(on_pressed=self.nopressed)
    self.add_widget(self.no)

Кроме того, я распознаю ваш код из предыдущих вопросов, и вы снова делаете те же ошибки, что и я указал в предыдущих постах. Ваш код:

projectlistscreen = ProjectListScreen()
wm = WindowManager()
wm.add_widget(ApplyPage(projectlistscreen=projectlistscreen))

создает ProjectListScreen, WindowManager и ApplyPage. Ничего из этого на самом деле не используется.

Код:

sm = Builder.load_file("kivy.kv")

создает те же Widgets, что и выше, но они на самом деле используются, так как build() возвращается вашим *1027* метод.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...