Выдает ошибку когда присваиваю id в файле .kv с помощью on_parent

Рейтинг: 1Ответов: 1Опубликовано: 15.02.2023

Что бы я не делал, постоянно выдает ошибку:

4:    BoxLayout:     
5:    orientation: "vertical"
6:    on_parent: self.add_widget(Button(text="2", id="2"))
 ...
TypeError: object.__init__() takes exactly one argument (the instance to initialize)

Файл .py:

import kivy

from kivy.app import App
from kivy.lang import Builder
        
from kivy.uix.screenmanager import ScreenManager, Screen
        
Builder.load_file("stackoverflow.kv")
    
    
    
class Main(Screen):
    pass
        
        
sm=ScreenManager()
sm.add_widget(Main(name="main"))
    
class SaveApp(App): 
    def build(self):        
        return sm
    
    
if __name__ == "__main__":
    SaveApp().run()

Файл .kv:

#:import Button kivy.uix.button.Button
<Main>:
            
    BoxLayout:     
        orientation: "vertical"
        on_parent: self.add_widget(Button(text="2", id="2"))

Ответы

▲ 0

Как видно из вывода, проблема связана со строкой on_parent:

А именно self.add_widget(Button(text="2", id="2")) в твоём файле .kv.

Событие on_parent запускается каждый раз, когда виджет добавляется как дочерний элемент другого виджета, и функция, указанная в on_parent, вызывается с родительским виджетом в качестве единственного аргумента. Однако метод add_widget() принимает только один аргумент, который является виджетом, добавляемым в качестве дочернего элемента. Следовательно, ты получаешь ошибку TypeError, потому что метод add_widget() получает два аргумента вместо одного.

Чтобы устранить эту проблему, ты можешь использовать событие on_parent для вызова функции, которая добавляет кнопку в качестве дочернего элемента BoxLayout.

Вот то, что тебе нужно изменить:

В твоём файле .kv замени строку

on_parent: self.add_widget(Button(text="2", id="2"))

на:

on_parent: root.add_button()

Это вызовет метод add_button() основного виджета (который является корневым виджетом твоего экрана), который нужно будет определить (код ниже).

В код Python добавь следующий метод в основной класс:

class Main(Screen):
     def add_button(self):
         self.add_widget(Button(text="2", id="2"))

Этот метод просто добавляет кнопку с текстом "2" и идентификатором "2" в качестве дочернего элемента BoxLayout основного виджета.

С этими изменениями твой код должен работать без каких-либо ошибок.