У меня есть пользовательская кнопка. Я не могу поставить его на экран через файл kv. Я изучил много тем. Никакой полезной информации найти не могу. Вот простой пример:
from kivy.app import App
from kivy.uix.button import Button
from kivy.uix.boxlayout import BoxLayout
from kivy.lang import Builder
Builder.load_string('''
#:kivy 1.11.0
<MyGrid>:
Button
text: 'hello'
''')
class MyGrid(BoxLayout):
pass
class DropApp(App):
def build(self):
return MyGrid()
if __name__ == '__main__':
DropApp().run()
Обратите внимание, что кнопка в этом файле kv является нативной кнопкой Kivy. Я запускаю этот код, я вижу эту кнопку на экране. Но теперь у меня есть пользовательская кнопка:
from kivy.app import App
from kivy.uix.button import Button
from kivy.uix.boxlayout import BoxLayout
from kivy.lang import Builder
Builder.load_string('''
#:kivy 1.11.0
<MyGrid>:
customButton:
''')
class MyGrid(BoxLayout):
pass
class customButton(Button):
def __init__(self, **kwargs):
self.text = 'hi'
super(Button, self).__init__(**kwargs)
class DropApp(App):
def build(self):
return MyGrid()
if __name__ == '__main__':
DropApp().run()
Я запускаю этот код, я не вижу эту пользовательскую кнопку на экране. Обратите внимание, что пользовательский виджет сложен. Я должен определить это в py файле. Например:
from kivy.app import App
from kivy.uix.button import Button
from kivy.uix.gridlayout import GridLayout
class DropApp(App):
def build(self):
layout = GridLayout(cols=1, spacing=10)
for i in range(100):
btn = Button(text=str(i), size_hint_y=None, height=40)
layout.add_widget(btn)
return layout
if __name__ == '__main__':
DropApp().run()
Для построения этого макета необходимо l oop. Я не могу найти способ построить его в файл kv. Поэтому я определяю это в Py-файле. Но если я определю это в py-файле, я не смогу работать с ним в kv-файле.
Вопрос 1. Что не так со вторым кодом?
Вопрос 2: Если я не могу заставить его работать, могу ли я получить третий код в kvlang (в файле kv нет в python)?
Я новичок в Киви, надеюсь, кто-то может помочь.