初始化时无法以类错误代码访问实例

时间:2020-01-29 16:41:12

标签: python python-3.x kivy

每次尝试初始化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")

奇异果文件

#: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 :(得分:0)

您的__init__()类的ApplyPage方法需要位置参数projectlistscreen。加载kv文件并遇到ApplyPage:时,将调用该__init__()方法而没有必需的projectlistscreen参数。我建议修改该__init__()方法,使projectlistscreen成为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))

正在创建ProjectListScreenWindowManagerApplyPage。都没有实际使用。

代码:

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

构建与上述相同的Widgets,但是由于sm由您的build()方法返回,因此实际上已使用它们。

答案 1 :(得分:0)

我将从.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"

您可以使用方法来更改其他类中的屏幕,但是您需要将在build方法中创建的对象发送到那里。因此,调用该方法就像:

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

别忘了在.kv文件中写上ProjectListScreen类的名称。