【发布时间】:2020-04-08 15:44:31
【问题描述】:
我有一个自定义按钮。我无法通过 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 的新手,希望有人能提供帮助。
【问题讨论】:
-
对我来说很好用
-
嗨@infinityTM,第二个代码可以在你的机器上运行吗?不敢相信????
-
它只是创建了很多按钮
-
我将证明这一点作为答案
-
你想干什么?按钮的滚动视图?