无法识别以下错误:TypeError: object.__init__() 只需要一个参数要初始化的实例

问题描述

我对编程非常陌生,我目前正在关注一个视频来为项目开发应用程序。我似乎无法理解导致以下错误的原因。

TypeError: object.__init__() takes exactly one argument (the instance to initialize)

代码如下; (第一个文件

class MainApp(App):
    my_friend_id = 1
    def build(self):
        return GUI

    def on_start(self):
        # get database data
        result = requests.get("https://wearable-balance-belt1-default-rtdb.firebaseio.com/" + str(self.my_friend_id) +".json")
        data = json.loads(result.content.decode())
        # get and update avatar
        avatar_image = self.root.ids['home_screen'].ids['avatar_image']
        avatar_image.source = "icons/" + data['avatar']

        banner_grid = self.root.ids['home_screen'].ids['banner_grid']
        workouts = data['workouts'][1:]
        for workout in workouts:
            W = WorkoutBanner(workout_image=workout['workout_image'],description=workout['description'])
            banner_grid.add_widget(W)


    def change_screen(self,screen_name):
        # get the screen manager from the kv file
        screen_manager = self.root.ids['screen_manager']
        screen_manager.current = screen_name
        # screen_manager = self.root.ids


MainApp().run()

第二个文件

from kivy.uix.gridlayout import GridLayout
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.label import Label
from kivy.uix.image import Image

class WorkoutBanner(GridLayout):
    rows = 1

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

        #left floatlayout
        left = FloatLayout()
        left_image = Image(source="icons/" + kwargs['workout_image'],size_hint=(1,.8),pos_hint={"top": 1,"left": 1})
        left_label = Label(text=kwargs['description'],.2),post_hint={"top": .2,"left": 1})
        left.add_widget(left_image)
        left.add_widget(left_label)

        self.add_widget(left)

非常感谢我能得到的任何帮助!

解决方法

该错误通常是由于向基(object 类)__init__() 方法传递了意外参数。在您的情况下, workout_imagedescription 关键字参数将传递给超类,并最终传递给 object 类。您可以通过在 kwargs.pop()super 方法中调用 __init__() 之前使用 WorkoutBanner 删除这些参数来纠正该问题。更简单的方法是为这两个参数定义属性,并让 kivy 处理从 kwargs 中保存和删除它们,如下所示:

class WorkoutBanner(GridLayout):
    rows = 1
    workout_image = StringProperty('')
    description = StringProperty('')

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

        #left floatlayout
        left = FloatLayout()
        left_image = Image(source="icons/" + self.workout_image,size_hint=(1,.8),pos_hint={"top": 1,"left": 1})
        left_label = Label(text=self.description,.2),pos_hint={"top": .2,"left": 1})
        left.add_widget(left_image)
        left.add_widget(left_label)

        self.add_widget(left)