Jeff J. Ohana
Jeff J. Ohana

Reputation: 23

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

I have two files: main.py and classbanner.py shown below. I am trying to format a page on my application. But I encounter this error vis-a-vis my classbanner.py code. Can someone help me figure out why do i have this error coming up:

File "C:\Users\JeffO\OneDrive\Desktop\Gym App\main.py", line 162, in MainApp().run()

File "C:\Users\JeffO\anaconda3\lib\site-packages\kivy\app.py", line 949, in run self._run_prepare()

File "C:\Users\JeffO\anaconda3\lib\site-packages\kivy\app.py", line 944, in _run_prepare self.dispatch('on_start')

File "kivy_event.pyx", line 709, in kivy._event.EventDispatcher.dispatch

File "C:\Users\JeffO\OneDrive\Desktop\Gym App\main.py", line 96, in on_start W = ClassBanner(class_1 = next(key_iterator),class_2 = next(key_iterator),

File "C:\Users\JeffO\OneDrive\Desktop\Gym App\classbanner.py", line 24, in init super(ClassBanner, self).init(**kwargs)

File "C:\Users\JeffO\anaconda3\lib\site-packages\kivy\uix\gridlayout.py", line 279, in init super(GridLayout, self).init(**kwargs)

File "C:\Users\JeffO\anaconda3\lib\site-packages\kivy\uix\layout.py", line 76, in init super(Layout, self).init(**kwargs)

File "C:\Users\JeffO\anaconda3\lib\site-packages\kivy\uix\widget.py", line 350, in init super(Widget, self).init(**kwargs)

File "kivy_event.pyx", line 245, in kivy._event.EventDispatcher.init

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

MAIN.PY

"""
Created on Sun Oct 17 15:41:25 2021

@author: Jeff Ohana
"""
import sys
sys.path.append("/".join(x for x in __file__.split("/")[:-1]))
from kivy.app import App
from kivy.lang import Builder
from kivy.uix.screenmanager import Screen
from kivy.uix.button import ButtonBehavior
from kivy.uix.image import Image
import requests
import json
from myfirebase import MyFirebase
from workoutbanner import WorkoutBanner
from classbanner import ClassBanner
from kivy.properties import ListProperty, StringProperty, ObjectProperty
from kivy.utils import platform
if platform == 'ios':
    from pyobjus import autoclass
from kivy.clock import mainthread

    
class HomeScreen(Screen):
    pass

class ImageButton(ButtonBehavior,Image):
    pass

class SigninScreen(Screen):
    pass

class MealofthedayScreen(Screen):
    pass

class SettingsScreen(Screen):
    pass

class SigninScreen(Screen):
    pass

class ColorScreen(Screen):
    pass

class ClassscheduleScreen(Screen):
    pass

class MainApp(App):
    
    native_image_picker = ObjectProperty(None)
    image_path = StringProperty("")
    my_user_id = "user1"
    user_table = "users"
    activity_table = "activities"
    class_table = "classes"
    user_id = StringProperty('user1')
    get_users = requests.get("https://uniquedatabase-c4647-default-rtdb.firebaseio.com/" + user_table + ".json")
    data_get_users = json.loads(get_users.content.decode())
    image_source_profile = StringProperty(str(data_get_users[my_user_id]['picture']))
    color_writings = StringProperty(str(data_get_users[my_user_id]['color']))
    
    def build(self):
        self.my_user_id = 'user1'
        self.my_firebase = MyFirebase()
        GUI = Builder.load_file("main.kv")
        return GUI 
    
    def on_start(self):
        #Query database data
        if platform == 'ios':
            self.native_image_picker = autoclass("NativeImagePicker").alloc().init()
        result_users = requests.get("https://uniquedatabase-c4647-default-rtdb.firebaseio.com/" + self.user_table + ".json")
        result_activities = requests.get("https://uniquedatabase-c4647-default-rtdb.firebaseio.com/" + self.activity_table + ".json")
        result_classes = requests.get("https://uniquedatabase-c4647-default-rtdb.firebaseio.com/" + self.class_table + ".json")
        data_users = json.loads(result_users.content.decode())
        data_activities = json.loads(result_activities.content.decode())
        data_classes = json.loads(result_classes.content.decode())
        
        streak_label = self.root.ids['home_screen'].ids['streak_label']
        streak_label.text = str(data_users[self.my_user_id]['streak'])
        
        banner_grid = self.root.ids['home_screen'].ids['banner_grid']
        for workouts in data_activities.values():
            print(workouts)
            W = WorkoutBanner(user=workouts['user'],date=workouts['date'],firstName=workouts['firstName']
                              ,typeWorkout=workouts['typeOfWorkout'],lenghtWorkout=workouts['lenghtOfWorkout']
                              ,color_writings = self.color_writings)
            banner_grid.add_widget(W)
            
        class_grid = self.root.ids['classschedule_screen'].ids['class_grid']
        for days in data_classes.values():
            values_classes = days.values()
            key_iterator = iter(days)
            value_iterator = iter(values_classes)
            W = ClassBanner(class_1 = next(key_iterator),class_2 = next(key_iterator),
                            class_3 = next(key_iterator), int_class_1 = next(value_iterator),
                            int_class_2 = next(value_iterator), int_class_3 = next(value_iterator))
            class_grid.add_widget(W)
            
    def update(self):
        print("Updating image...")

        folder = "/".join(x for x in self.user_data_dir.split("/")[:-1])
        image_path = folder + "/" + "cached.png"
        self.image_source_profile = image_path
        my_profile_picture_data = '{"picture":"%s"}'%image_path
        requests.patch("https://uniquedatabase-c4647-default-rtdb.firebaseio.com/" + self.user_table + "/" +  self.my_user_id + ".json",
                       data=my_profile_picture_data)
            
    def pick_image(self):
        if platform == 'ios':
            self.native_image_picker.displayImagePicker() 
        
    def changeColor(self,color):
        if color == 'red':
            color_code = 'ff0000'
            my_color_data = '{"color":"%s"}'%color_code
            requests.patch("https://uniquedatabase-c4647-default-rtdb.firebaseio.com/" + self.user_table + "/" +  self.my_user_id + ".json",
                       data=my_color_data)
        elif color == 'electric blue':
            color_code = '0000ff'
            my_color_data = '{"color":"%s"}'%color_code
            requests.patch("https://uniquedatabase-c4647-default-rtdb.firebaseio.com/" + self.user_table + "/" +  self.my_user_id + ".json",
                       data=my_color_data)
        elif color == 'cyan':
            color_code = '00eeee'
            my_color_data = '{"color":"%s"}'%color_code
            requests.patch("https://uniquedatabase-c4647-default-rtdb.firebaseio.com/" + self.user_table + "/" +  self.my_user_id + ".json",
                       data=my_color_data)
        elif color == 'green':
            color_code = '008000'
            my_color_data = '{"color":"%s"}'%color_code
            requests.patch("https://uniquedatabase-c4647-default-rtdb.firebaseio.com/" + self.user_table + "/" +  self.my_user_id + ".json",
                       data=my_color_data)
        elif color == 'yellow':
            color_code = 'ffff00'
            my_color_data = '{"color":"%s"}'%color_code
            requests.patch("https://uniquedatabase-c4647-default-rtdb.firebaseio.com/" + self.user_table + "/" +  self.my_user_id + ".json",
                       data=my_color_data)
        elif color == 'purple':
            color_code = '9b30ff'
            my_color_data = '{"color":"%s"}'%color_code
            requests.patch("https://uniquedatabase-c4647-default-rtdb.firebaseio.com/" + self.user_table + "/" +  self.my_user_id + ".json",
                       data=my_color_data)
            
        
        #Fill HomeScreen feed
    def change_screen(self,screen_name):
        screen_manager = self.root.ids["screen_manager"]
        screen_manager.current = screen_name
    
    @mainthread
    def on_correct_info(self, users):
        self.my_user_id = users
        self.change_screen('home_screen')

    @mainthread
    def on_incorrect_info(self, login_message):
        login_message.text = 'invalid username or password'
        
MainApp().run()

CLASSBANNER.PY

from kivy.uix.gridlayout import GridLayout 
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.image import Image
from kivy.uix.image import AsyncImage
from kivy.uix.label import Label
from firebase_functions import get_profile_picture
from datetime import datetime, timedelta
from kivy.properties import ListProperty, StringProperty

class ClassBanner(GridLayout):
    
    rows = 4
    class_1 = StringProperty('')
    class_2 = StringProperty('')
    class_3 = StringProperty('')
    def __init__(self,**kwargs):
        super(ClassBanner, self).__init__(**kwargs)
        
        line1 = FloatLayout()
        text_line1 = '[b]Monday[/b]'
        day_label = Label(text=text_line1,size_hint = (1,1) , pos_hint = {'top':1.2,'right':1.5},markup=True)
        day_label.font_size = '10sp' 
        day_label.texture_update()
        line1.add_widget(day_label)
        
        line2 = GridLayout()
        text_line2 = kwargs['class_1']
        int_line2 = str(kwargs['int_class_1'])
        class1_label = Label(text=text_line2,size_hint = (1,1) , pos_hint = {'top':1.2,'right':1.5},markup=True)
        class1_int_label = Label(text=int_line2,size_hint = (1,1) , pos_hint = {'top':1.2,'right':1.5},markup=True)
        class1_label.font_size = '10sp' 
        class1_int_label.font_size = '10sp' 
        class1_label.texture_update()
        class1_int_label.texture_update()
        line2.add_widget(class1_label)
        line2.add_widget(class1_int_label)
        
        line3 = GridLayout()
        text_line3 = kwargs['class_2']
        int_line3 = str(kwargs['int_class_2'])
        class2_label = Label(text=text_line3,size_hint = (1,1) , pos_hint = {'top':1.2,'right':1.5},markup=True)
        class2_int_label = Label(text=int_line3,size_hint = (1,1) , pos_hint = {'top':1.2,'right':1.5},markup=True)
        class2_label.font_size = '10sp' 
        class2_int_label.font_size = '10sp' 
        class2_label.texture_update()
        class2_int_label.texture_update()
        line3.add_widget(class2_label)
        line3.add_widget(class2_int_label)
        
        line4 = GridLayout()
        text_line4 = kwargs['class_3']
        int_line4 = str(kwargs['int_class_3'])
        class3_label = Label(text=text_line4,size_hint = (1,1) , pos_hint = {'top':1.2,'right':1.5},markup=True)
        class3_int_label = Label(text=int_line4,size_hint = (1,1) , pos_hint = {'top':1.2,'right':1.5},markup=True)
        class3_label.font_size = '10sp' 
        class3_int_label.font_size = '10sp' 
        class3_label.texture_update()
        class3_int_label.texture_update()
        line4.add_widget(class3_label)
        line4.add_widget(class3_int_label)
        
        self.add_widget(line1)
        self.add_widget(line2)
        self.add_widget(line3)
        self.add_widget(line4)

Upvotes: 0

Views: 243

Answers (2)

John Anderson
John Anderson

Reputation: 38937

Your ClassBanner class has properties defined for class_1, class_2, and class_3, but you don't have properties defined for int_class_1, int_class_2, or int_class_3. Just add properties for those and the error should disappear.

Upvotes: 0

Ahmad
Ahmad

Reputation: 117

Edit line 24 to:

super(ClassBanner, GridLayout).__init__(self, **kwargs)

let me know if it not fixed your issue

Upvotes: 0

Related Questions