问题描述
我对编程非常陌生,我目前正在关注一个视频来为项目开发应用程序。我似乎无法理解导致以下错误的原因。
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_image
和 description
关键字参数将传递给超类,并最终传递给 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)