首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在GridLayout中创建下拉列表

如何在GridLayout中创建下拉列表
EN

Stack Overflow用户
提问于 2019-03-20 02:03:52
回答 1查看 1K关注 0票数 0

我有两个文件--一个是py,另一个是kv,正如标题所述,我不知道如何添加下拉列表。

-> main.py

代码语言:javascript
复制
from kivy.app import App
from kivy.uix.dropdown import DropDown
from kivy.uix.gridlayout import GridLayout

class MyGridLayout(GridLayout):
    pass

class LayoutsApp(App):
    def build(self):
        return MyGridLayout()


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

-> layouts.kv

代码语言:javascript
复制
<MyGridLayout>:
    rows: 2
    id: main_win
    Dropdown:
        id: dropdown
        Button:
            id: btn1
            text: 'option 1'
        Button:
            id: btn2
            text: 'option 2'
    BoxLayout:

    BoxLayout:

编译时,它会为该部分生成错误。怎样才能正确地调用下拉列表呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-20 05:01:47

问题3

调用按钮id: btn2,我将如何做?-我的意思是:类MyGridLayout(GridLayout):

解决方案3

Python脚本

  • 添加导入语句:from kivy.uix.dropdown import DropDownfrom kivy.properties import ObjectProperty
  • 实现class CustomDropDown(DropDown):
  • 在类MyGridLayout中,在类级别声明ObjectProperty (例如,dropdown = ObjectProperty(None);实现方法dropdown_open(self):;实例化类CustomDropDown并将其分配给self.dropdown等)。

kv文件

  • 删除self.dismiss()
  • 将动态类、<CustomDropdown@DropDown>:替换为类规则、<CustomDropDown>:
  • rows: 2替换为rows: 3
  • Factory.CustomDropdown().open(self)替换为root.dropdown_open(self)

示例3

main.py -片段

代码语言:javascript
复制
from kivy.uix.dropdown import DropDown
from kivy.properties import ObjectProperty


class CustomDropDown(DropDown):
    pass


class MyGridLayout(GridLayout):
    dropdown = ObjectProperty(None)

    def dropdown_open(self, instance):
        self.dropdown = CustomDropDown()
        self.dropdown.open(instance)
        print(self.dropdown.ids.btn2.text)

layouts.kv -片段

代码语言:javascript
复制
<CustomDropDown>:
    id: dropdown
    on_select:
        app.root.ids.btn.text = '{}'.format(args[1])
...
<MyGridLayout>:
    rows: 3
    id: main_win

    Button:
        id: btn
        text: 'Press'
        size_hint_y: None
        height: '48dp'
        on_release:
            root.dropdown_open(self)

产出3

问题2

当我添加这些命令时,它不起作用: BoxLayout:方位:“垂直”size_hint:(.9,.9) BoxLayout: BoxLayout:“垂直”size_hint_y: 0.5

备注

您可能需要将行从2增加到3。

例2

  • 为两个BoxLayout添加了配置
  • 为了进行说明,在两个BoxLayout的画布上添加颜色

layouts.kv

代码语言:javascript
复制
#:kivy 1.10.1
#:import Factory kivy.factory.Factory

<CustomDropdown@DropDown>:
    id: dropdown
    on_select:
        app.root.ids.btn.text = '{}'.format(args[1])
        self.dismiss()

    Button:
        id: btn1
        text: 'option 1'
        size_hint_y: None
        height: '48dp'
        on_release:
            dropdown.select(btn1.text)

    Button:
        id: btn2
        text: 'option 2'
        size_hint_y: None
        height: '48dp'
        on_release:
            dropdown.select(btn2.text)

<MyGridLayout>:
    rows: 2
    id: main_win

    Button:
        id: btn
        text: 'Press'
        on_release: Factory.CustomDropdown().open(self)
        size_hint_y: None
        height: '48dp'

    BoxLayout:
        orientation: 'vertical'
        size_hint: (.9,.9)
        canvas.before:
            Color:
                rgba: 1, 0, 0, 1    # red
            Rectangle:
                pos: self.pos
                size: self.size

    BoxLayout:
        orientation: 'vertical'
        size_hint_y: 0.5
        canvas.before:
            Color:
                rgba: 0, 0, 1, 1    # blue
            Rectangle:
                pos: self.pos
                size: self.size

输出#2

解决方案1

DropDown小部件就像弹出小部件,即它们是特殊的小部件。

DropDown是一个特殊的小部件。不要试图将它作为子部件添加到任何其他部件中。如果这样做,弹出/ DropDown将像普通小部件一样处理,不会隐藏在后台创建。

因此,创建一个带有DropDown小部件继承的动态类,并使用Factory实例化该类。

示例

main.py

代码语言:javascript
复制
from kivy.app import App
from kivy.uix.gridlayout import GridLayout


class MyGridLayout(GridLayout):
    pass


class LayoutsApp(App):
    def build(self):
        return MyGridLayout()


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

layouts.kv

代码语言:javascript
复制
#:kivy 1.10.1
#:import Factory kivy.factory.Factory

<CustomDropdown@DropDown>:
    id: dropdown
    on_select:
        app.root.ids.btn.text = '{}'.format(args[1])
        self.dismiss()

    Button:
        id: btn1
        text: 'option 1'
        size_hint_y: None
        height: '48dp'
        on_release:
            dropdown.select(btn1.text)

    Button:
        id: btn2
        text: 'option 2'
        size_hint_y: None
        height: '48dp'
        on_release:
            dropdown.select(btn2.text)

<MyGridLayout>:
    rows: 2
    id: main_win

    Button:
        id: btn
        text: 'Press'
        on_release: Factory.CustomDropdown().open(self)
        size_hint_y: None
        height: '48dp'

    BoxLayout:

    BoxLayout:

输出

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55252508

复制
相关文章

相似问题

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