python - 您如何使用/制作 kivy 语言的自定义小部件,但使用 python 代码?
问题描述
我希望能够在 kv 文件和 python 代码中使用我的自定义(python 编写)小部件。我不知道如何创建一个小部件,然后在我选择的布局中使用它。
class SelectableList(FocusBehavior, CompoundSelectionBehavior, StackLayout):
previous_nodes=[]
# this class has a whole bunch of "def's" that I got rid of so that stack would let me post a shorter question
class myScreen(Screen):
def build(self):
self.root_boi = StackLayout(size=(1,1))
stack = SelectableList(touch_multiselect=True,
multiselect=True)
for i in range(0, 6):
stack.add_widget(Button(size_hint_y=None, height=30, text="Button {0}".format(i)))
self.root_boi.add_widget(stack)
return self.root_boi
class TestApp(App):
def build(self):
sm = ScreenManager()
sm.add_widget(myScreen(name='whatever you want it to be...'))
return myScreen()
TestApp().run()
我不确定我在这里做错了什么。我正在尝试将“SelectableList”小部件添加到堆栈布局中。我希望能够将它添加到我选择的任何小部件中,无论是在 kv 文件中还是在我的 python 代码中。如果这有意义...
解决方案
我怀疑你的build()
方法myScreen
实际上应该是一种__init__()
方法(没有回报)。我添加self.add_widget(self.root_boi)
了return
. 并且类名应该大写(MyScreen
),因为kv
有时语言会对此很挑剔。
这是您的代码的修改版本,它演示了如何使用您的自定义小部件:
from kivy.app import App
from kivy.lang import Builder
from kivy.uix.behaviors import FocusBehavior, CompoundSelectionBehavior
from kivy.uix.button import Button
from kivy.uix.screenmanager import Screen, ScreenManager
from kivy.uix.stacklayout import StackLayout
class SelectableList(FocusBehavior, CompoundSelectionBehavior, StackLayout):
previous_nodes=[]
# this class has a whole bunch of "def's" that I got rid of so that stack would let me post a shorter question
class MyScreen(Screen):
def __init__(self, **kwargs):
super(MyScreen, self).__init__(**kwargs)
self.root_boi = StackLayout(size=(1,1))
stack = SelectableList(touch_multiselect=True,
multiselect=True)
for i in range(0, 6):
stack.add_widget(Button(size_hint_y=None, height=30, text="Button {0}".format(i)))
self.root_boi.add_widget(stack)
self.add_widget(self.root_boi)
class TestApp(App):
def build(self):
return Builder.load_string(kv)
kv = '''
# ScreenManager:
# MyScreen:
#
# or
#
ScreenManager:
Screen:
name: 'whatever'
StackLayout:
SelectableList:
touch_multiselect: True
multiselect: True
Button:
text: 'Button 0'
size_hint_y: None
height: 30
Button:
text: 'Button 1'
size_hint_y: None
height: 30
Button:
text: 'Button 2'
size_hint_y: None
height: 30
'''
TestApp().run()
的__init__()
方法MyScreen
必须包括对super
__init__()
.
上面代码中的kv
字符串显示了自定义小部件的两种不同用途。第一个(已注释掉)使用MyScreen
自定义小部件。第二个(未注释掉)使用SelectableList
自定义小部件。
推荐阅读
- mfc - 在MFC CRicheditctrl中,如何获取角色占据的reactangle
- java - 动画屏幕适用于手机,但不适用于平板电脑
- mariadb - 无法将 Win10 上的 MariaDB ODBC 驱动程序添加到 ODBC 数据源管理器
- json - Robot Framework如何计算JSON中的项目列表
- c# - 如何使用 appsettings.local.json?
- javascript - React Native - 如何比较 shouldComponentUpdate 中的两个 Animated.Values?
- flutter - 在 NestedScrollView 中具有弯曲底部的 SliverAppBar - Flutter
- swift - 如何将这种黑色阴影(渐变)更改为某种彩色阴影?
- ios - 为什么 NSLayoutConstraint 的标识符属性在代码中不起作用?
- python - 在 Openpyxl Python 中读取合并的单元格范围