Kivy Python中的下拉菜单

时间:2016-11-18 13:49:33

标签: python drop-down-menu kivy

我在stackoverflow上找到了一个类似的主题,但不幸的是它没有帮助我。

这是我第一次尝试认真编程GUI而且我真的生气了。 我一步一步,朝着我最终需要的方向迈进。

现在我尝试在我的小部件的左上角添加一个简单的下拉菜单,其元素应该在选中时调用函数。我真的在kivy文档中找到了这个,在这个论坛中但是我无法解决这个问题。

import multiprocessing
from mesh import MeshApp
from kivy.app import App
from kivy.uix.widget import Widget
from kivy.uix.dropdown import DropDown
from kivy.uix.button import Button
import os

MAINDIR = os.path.dirname(os.path.realpath(__file__))

categories = {}

def getCategories():
    for dir in os.walk(MAINDIR):
        if len(dir[1]) == 0:
            filelist = set()
            for mesh in dir[2]:
                filelist.add(mesh.replace('_FRONT.png','').replace('_SIDE.png','').replace('_TOP.png',''))
            categories.update({dir[0]: filelist})

#class CategoriesList(DropDown):
#    pass

class MainWindow(Widget):
    def __init__(self):
        #self.categorieslist = CategoriesList()

        categories_list = DropDown()
        for i in categories.keys():
            btn = Button(text=i.replace(MAINDIR, ''), size_hint_y=None, height=30)
            btn.bind(on_release=lambda btn: categories_list.select(btn.text))
            categories_list.add_widget(btn)

        mainbutton = Button(text='Choose directory', size_hint=(1, 1))
        mainbutton.bind(on_release=categories_list.open)
        categories_list.bind(on_select=lambda instance, x: setattr(mainbutton, 'text', x))

        #and now???

class RenderApp(App):
    def build(self):
        self.launchMeshApp()
        return MainWindow()

    def launchMeshApp(self):
        app = MeshApp()
        p = multiprocessing.Process(target=app.run)
        p.start()


if __name__ == '__main__':
    getCategories()
    RenderApp().run()

并且:

#:kivy 1.9.1

<MainWindow>:
    canvas.before:
        Color:
            rgba: 0.6, 0.6, 1, 1
        Rectangle:
            pos: self.pos
            size: self.size
    canvas:
        Color:
            rgba: 0, 0, 0, 0.5
        Rectangle:
            pos: 0, self.height * 5 / 6 - 1
            size: self.width, 2

我已经在文档和其他几个论坛中创建了下拉列表。但是我需要把它放在左上角,我从来没有找到或理解这样做的方法。此外,我没有得到如何让他们在点击时调用带参数的函数。

非常感谢

编辑:我不知道为什么,但第一行是&#34;嗨所有&#34;自动删除

1 个答案:

答案 0 :(得分:1)

我不知道下拉菜单,但我可以回答数据。

绑定回调时,您收到的第一个参数将是绑定到回调的窗口小部件。因此,我们的想法是创建一个使用Button作为基类的类,然后您可以定义所需的任何额外信息。

这是一个基于按钮API示例的粗略,未经测试的示例:

class MyAwesomeButton(Button):
    def __init__(self, **kwargs):
        super(MyAwesomeButton, self).__init__(**kwargs)
        self.my_data = {} # enter your data here

def callback(instance):
    print('The button <%s> is being pressed' % instance.text)
    print instance.my_data

btn1 = MyAwesomeButton(text='Hello world 1')
btn1.bind(on_press=callback)
btn2 = MyAwesomeButton(text='Hello world 2')
btn2.bind(on_press=callback)