我有一个自定义按钮。我无法通过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文件中的Button是本机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()
我运行此代码,但无法在屏幕上看到此customButton。请注意,自定义窗口小部件很复杂。我必须在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()
构建此布局需要循环。我找不到在kv文件中构建它的方法。所以我在Py文件中定义它。但是,如果我在py文件中定义它,则无法在kv文件中使用它。
问题1:第二个代码出了什么问题?
问题2:如果我无法使其工作,是否可以在kvlang中实现第三个代码(在kv文件中而不在python中)?
我是Kivy的新手,希望有人可以提供帮助。
答案 0 :(得分:0)
当我在Kivy v1.11.1
上运行代码时,Python v3.7.5
:
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()
输出为:
如果这是您需要的输出,请尝试运行:
pip install --upgrade kivy
对于第二个代码,python区分大小写。因此,请使用customButton
而不是CustomButton
。
如果您要使用.kv文件执行第三个代码,请参见以下示例:
from kivy.app import App
from kivy.uix.recycleview import RecycleView
from kivy.lang import Builder
Builder.load_string('''
<ExampleRV>:
viewclass: 'Button'
RecycleBoxLayout:
size_hint_y: None
height: self.minimum_height
orientation: 'vertical'
''')
class ExampleRV(RecycleView):
def __init__(self, **kwargs):
super(ExampleRV, self).__init__(**kwargs)
self.data = [{'text': str(x)} for x in range(20)]
class RecycleApp(App):
def build(self):
return ExampleRV()
RecycleApp().run()
请参考HERE。