Kivy spinner, ограничить количество отображаемых элементов - PullRequest
0 голосов
/ 19 октября 2018

Я пытаюсь создать вращающееся меню с максимальной высотой выпадающего меню, я пытался реализовать ответ в этом вопросе, но не могу заставить его работать.Моя структура кода является частью более крупной программы, поэтому, если я могу избежать ее переформатирования, она будет предпочтительнее.

Файл 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

1 Ответ

0 голосов
/ 21 октября 2018

Вы можете сделать это, используя событие on_enter класса Screen следующим образом:

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()

Это использует некоторую информацию из вопроса, на который вы ссылались.Также используется spinner ObjectProperty в Screen2.Событие on_enter вызывает метод limit_spinner().

...