首页 > 解决方案 > 您如何使用/制作 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 代码中。如果这有意义...

标签: pythonkivy

解决方案


我怀疑你的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自定义小部件。


推荐阅读