首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Python KIVY:递归DropDown

Python KIVY:递归DropDown
EN

Stack Overflow用户
提问于 2017-12-20 03:15:12
回答 1查看 563关注 0票数 0

我想创建一个包含3个其他DropDowns的DropDown,每个都包含3个按钮。

我希望第一个DropDown打开另外三个DropDowns,当我们点击其中一个时,三个按钮出现,并且在任何情况下当一个按钮出现时,它是向下的,没有显示错误。当你第二次点击下拉菜单时,它会隐藏它的子窗口小部件。

我使用这种方式来创建一个下拉列表:

.py:

代码语言:javascript
复制
from kivy.app import App
from kivy.uix.dropdown import DropDown
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.lang import Builder
from kivy.properties import StringProperty


class MyScreenManager(ScreenManager):
    button_text = StringProperty('Show possibilities')

    def __init__(self, **kwargs):
        super(MyScreenManager, self).__init__(**kwargs)
        self.dropdown = CustomDropDown(self)

    def open_drop_down(self, widget):            
        self.dropdown.open(widget)

class MyScreen(Screen):
    def __init__(self, **kwargs):
        super(MyScreen, self).__init__(**kwargs)

class CustomDropDown(DropDown):
    def __init__(self, screen_manager, **kwargs):
        super(CustomDropDown, self).__init__(**kwargs)
        self.sm = screen_manager

    def on_select(self, data):
        self.sm.button_text = data

Builder.load_file("debug.kv")

class MyAppli(App):
    def build(self):
        return MyScreenManager()

if __name__ == '__main__':
    MyAppli().run()

.kv:

代码语言:javascript
复制
<MyScreenManager>:

    MyScreen:

        AnchorLayout:
            anchor_x: 'center'
            anchor_y: 'top'

            Button:

                text: root.button_text
                size:(200,50)
                size_hint:(None,None)
                on_release: root.open_drop_down(self)

<CustomDropDown>:
    Button:
        text:"Item 1"
        size:(200,50)
        size_hint:(None,None)
        on_release: root.select("ONE")
    Button:
        text:"Item 2"
        size:(200,50)
        size_hint:(None,None)
        on_release: root.select(self.text)
    Button:
        text:"Item 3"
        size:(200,50)
        size_hint:(None,None)
        on_release: root.select("THREE")
EN

回答 1

Stack Overflow用户

发布于 2017-12-22 08:13:14

添加另一个自定义下拉类,并添加一个按钮方法来打开/关闭第二个下拉列表。open_drop2()方法执行打开/关闭操作。将padding添加到每个Button中,以尝试显示一些级联。额外的级联可以使用相同的方案来完成,例如,添加一个通过CustomDropDown2中的按钮打开的CustomDropDown3类。请注意,kv文件中的dismiss_on_select: False需要确保is2Displayed属性正确更新。

.py:

代码语言:javascript
复制
from kivy.app import App
from kivy.properties import StringProperty
from kivy.uix.dropdown import DropDown
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.lang import Builder


class MyScreenManager(ScreenManager):
    button_text = StringProperty('Show possibilities')

    def __init__(self, **kwargs):
        super(MyScreenManager, self).__init__(**kwargs)
        self.dropdown = CustomDropDown1(self)

    def open_drop_down(self, widget):
        self.dropdown.open(widget)

class MyScreen(Screen):
    def __init__(self, **kwargs):
        super(MyScreen, self).__init__(**kwargs)


class CustomDropDown1(DropDown):
    def __init__(self, screen_manager, **kwargs):
        super(CustomDropDown1, self).__init__(**kwargs)
        self.sm = screen_manager
        self.dropdown2 = CustomDropDown2(self.sm)
        self.is2Displayed = False

    def on_select(self, data):
        self.sm.button_text = data

    def open_drop2(self):
        if not self.is2Displayed:
            self.dropdown2.open(self)
            self.is2Displayed = True
        else:
            self.dropdown2.dismiss()
            self.is2Displayed = False

class CustomDropDown2(DropDown):
    def __init__(self, screen_manager, **kwargs):
        super(CustomDropDown2, self).__init__(**kwargs)
        self.sm = screen_manager

    def on_select(self, data):
        self.sm.button_text = data

Builder.load_file("debug.kv")

class MyAppli(App):
    def build(self):
        return MyScreenManager()

if __name__ == '__main__':
    MyAppli().run()

.kv:

代码语言:javascript
复制
<MyScreenManager>:
    MyScreen:
        FloatLayout:
            Button:
                text: root.button_text
                size: (200, 50)
                size_hint:(None,None)
                pos_hint: {'center_x': 0.5, 'top': 1.0}
                on_release: root.open_drop_down(self)

<CustomDropDown1>:
    padding: [0,0,0,0]
    Button:
        text:"Item 1"
        size:(200,50)
        size_hint:(None,None)
        text_size: self.size
        valign: 'center'
        padding: (10,0)
        on_release: root.select(self.text)
    Button:
        text:"Item 2"
        size:(200,50)
        size_hint:(None,None)
        text_size: self.size
        valign: 'center'
        padding: (10,0)
        on_release: root.open_drop2()
    Button:
        text:"Item 3"
        size:(200,50)
        size_hint:(None,None)
        text_size: self.size
        valign: 'center'
        padding: (10,0)
        on_release: root.select(self.text)

<CustomDropDown2>:
    dismiss_on_select: False
    Button:
        text:"Item 1,2"
        size:(200,50)
        size_hint:(None,None)
        text_size: self.size
        valign: 'center'
        padding: (50,0)
        on_release: root.select(self.text)
    Button:
        text:"Item 2,2"
        size:(200,50)
        size_hint:(None,None)
        text_size: self.size
        valign: 'center'
        padding: (50,0)
        on_release: root.select(self.text)
    Button:
        text:"Item 3,2"
        size:(200,50)
        size_hint:(None,None)
        text_size: self.size
        valign: 'center'
        padding: (50,0)
        on_release: root.select(self.text)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47893756

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档