如何使用/制作kivy语言的自定义小部件,但使用python代码?

2024-09-19 23:53:16 发布

您现在位置: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代码中。如果这有道理的话


Tags: 文件代码selfaddstack部件defroot
1条回答
网友
1楼 · 发布于 2024-09-19 23:53:16

我怀疑myScreenbuild()方法实际上应该是一个__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()

MyScreen__init__()方法必须包含对super{}的调用

上面代码中的kv字符串显示了自定义小部件的两种不同用法。第一个(注释掉)使用MyScreen自定义小部件。第二个(未注释掉)使用SelectableList自定义小部件

相关问题 更多 >