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

2024-10-05 14:28:38 发布

您现在位置:Python中文网/ 问答频道 /正文

每次我尝试初始化一个kivy屏幕时,我总是会收到一个错误,即使我已经研究过了,这表明我是用正确的方法来做的。我想从我的ProjectListScreen class访问实例,我将实例初始化为“无”,但将屏幕初始化到ApplyPage不起作用,我尝试使用Factory将类实例化到我的ApplyPage class中,但它仍然没有返回实例的值。下面是我的代码,之后是我尝试初始化screen类时的回溯。我将感谢任何帮助。拜托,我一整天都在为这件事挣扎

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

如果有人能找出我的错误,为什么屏幕没有初始化。多谢各位


Tags: keyinpyselfchildlineuserslist
2条回答

ApplyPage类的__init__()方法需要位置参数projectlistscreen。当加载kv文件并遇到ApplyPage:时,调用该__init__()方法时不带所需的projectlistscreen参数。我建议修改__init__()方法,使projectlistscreenakwarg参数为:

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,但实际上使用了这些,因为sm是由build()方法返回的

我会从.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类的名称

相关问题 更多 >