Kivy 微调器,限制显示项目的数量

Kivy spinner, limit the number of displayed items

我正在尝试制作一个具有最大下拉高度的微调菜单,我已尝试实现 问题中的答案,但无法正常工作。我的代码结构是一个更大程序的一部分,所以如果我能避免重新格式化,那将是首选。

Python 文件:

from kivy.app import App
from kivy.uix.widget import Widget
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.screenmanager import Screen , ScreenManager
from kivy.uix.spinner import Spinner

class Screen1(Screen):
    pass

class Screen2(Screen):
    pass

class SimpleKivy(App):

    def build(self):
        return

if __name__ == "__main__":
    SimpleKivy().run()

Kivy 文件:

ScreenManager:

    Screen1:
        name: 'screen1'
        FloatLayout:
            Button:
                text: "Change Screen"
                pos_hint: {"x": 0.3, 'top': 0.7}
                size_hint: 0.4, 0.1
                on_release: 
                    root.current = 'screen2'

    Screen2:
        name: 'screen2'
        FloatLayout:
            Spinner:
                id: spinner
                text: 'Select Number'
                values: ('1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '20')
                pos_hint: {"x": 0.3, 'top': 0.7}
                size_hint: 0.4, 0.1

您可以使用 Screen class 的 on_enter 事件完成此操作,如下所示:

from kivy.app import App
from kivy.lang import Builder
from kivy.metrics import dp
from kivy.uix.screenmanager import Screen


class Screen1(Screen):
    pass


class Screen2(Screen):
    def limit_spinner(self, *args):
        max = 5  # max number of Buttons to display in the Spinner DropDown
        self.spinner.dropdown_cls.max_height =  max * dp(48)  # dp(48) is the size of each Button in the DropDown (from style.kv)


theRoot = Builder.load_string('''
ScreenManager:

    Screen1:
        name: 'screen1'
        FloatLayout:
            Button:
                text: "Change Screen"
                pos_hint: {"x": 0.3, 'top': 0.7}
                size_hint: 0.4, 0.1
                on_release: 
                    root.current = 'screen2'

    Screen2:
        spinner: spinner
        name: 'screen2'
        on_enter: self.limit_spinner()
        FloatLayout:
            Spinner:
                id: spinner
                text: 'Select Number'
                values: ('1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '20')
                pos_hint: {"x": 0.3, 'top': 0.7}
                size_hint: 0.4, 0.1
''')


class SimpleKivy(App):

    def build(self):
        return theRoot

if __name__ == "__main__":
    SimpleKivy().run()

这使用了您引用的问题中的一些信息。在 Screen2 中还使用了 spinner ObjectPropertyon_enter 事件触发了 limit_spinner() 方法。