Есть несколько проблем с вашим кодом.
Во-первых, ваш kv
относится к FloatLayout
, когда кажется, что вы действительно хотите сослаться на свой класс Page
.(Вы ссылаетесь на root.add_button()
, но этот метод относится к классу Page
).
Во-вторых, ваш testbutton
является единичным экземпляром TestButton
, поэтому при втором нажатии на Search
кнопка, вы получите сообщение об ошибке, если у этой кнопки уже есть родитель.Поэтому я создал класс TestButton
в коде Python и удалил правило <TestButton@Button>
из kv
.
Вот что, я думаю, вы хотите для своего кода:
# import kivy & functions/widgets.
import kivy
from kivy.app import App
from kivy.lang import Builder
from kivy.uix.button import Button
# import kivy layouts.
from kivy.uix.floatlayout import FloatLayout
# Specify version of kivy needed.
kivy.require("1.10.1")
# define buttons and widgets
class TestButton(Button):
def __init__(self, **kwargs):
super(TestButton, self).__init__(**kwargs)
self.width = 177
self.height = 254
self.size_hint = (None, None)
self.background_normal = "pics/32864.jpg"
class Page(FloatLayout):
def __init__(self):
super().__init__()
def add_button(self):
self.ids.stack.add_widget(TestButton())
class YuGiOhApp(App):
def build(self):
return Page()
YuGiOhApp().run()
И добавьте id
для вашего StackLayout
в kv
:
#:kivy 1.10.1
<Page>:
Button:
size_hint: 0.20, 0.10
pos_hint: {"x": 0.60, "top": 1}
text: "Search"
on_press: root.add_button()
Button:
size_hint: 0.20, 0.10
pos_hint: {"x": 0.80, "top": 1}
text: "collection"
TextInput:
multiline: False
font_size: 48
size_hint: 0.60, 0.10
pos_hint: {"x": 0, "top": 1}
ScrollView:
size_hint: 0.60, 0.90
StackLayout:
id: stack
orientation: "lr-tb"
pos_hint: {"x": 0, "top": 0.88}
size_hint: 1, None
height: self.minimum_height
padding: 5
spacing: 5
TestButton:
TestButton:
TestButton:
TestButton:
TestButton:
TestButton:
TestButton:
TestButton:
TestButton:
TestButton:
TestButton:
TestButton:
TestButton:
TestButton:
TestButton:
TestButton:
Новый метод add_button()
ссылается на новый stack
id для доступа к StackLayout
и создаетновый TestButton
каждый раз, когда он вызывается.