Выдает ошибку когда присваиваю id в файле .kv с помощью on_parent
Что бы я не делал, постоянно выдает ошибку:
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"))
Ответы (1 шт):
Как видно из вывода, проблема связана со строкой 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 основного виджета.
С этими изменениями твой код должен работать без каких-либо ошибок.