Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kivy Python中的下拉菜单_Python_Drop Down Menu_Kivy - Fatal编程技术网

Kivy Python中的下拉菜单

Kivy Python中的下拉菜单,python,drop-down-menu,kivy,Python,Drop Down Menu,Kivy,我在stackoverflow上发现了一个类似的话题,但不幸的是,它对我没有帮助 这是我第一次认真地编写GUI,我真的很生气。 我正在一步一步地朝着我最终需要的方向前进 现在,我正试图在我的小部件的左上角添加一个简单的下拉菜单,只要选择了它,它的元素就会调用一个函数。我真的在kivy文档和这个论坛中寻找了这个问题,但我不能真正解决这个问题 import multiprocessing from mesh import MeshApp from kivy.app import App from k

我在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
:
在以下情况之前:
颜色:
rgba:0.6,0.6,1,1
矩形:
pos:self.pos
大小:self.size
画布:
颜色:
rgba:0,0,0,0.5
矩形:
位置:0,自身高度*5/6-1
尺寸:自宽,2
我创建了一个下拉列表,如文档和其他几个论坛中所示。但我需要把它放在左上角,我从来没有找到,也不明白,怎么做。此外,我不知道如何让他们在每次单击时调用带有参数的函数

多谢各位


编辑:我不知道为什么,但是带有“Hi all”的第一行会被自动删除

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

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

下面是一个基于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)
class MyAwesomeButton(按钮):
定义初始(自我,**kwargs):
超级(MyAwesomeButton,self)。\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
self.my_data={}#在此处输入数据
def回调(实例):
打印('正在按下按钮''%instance.text〕)
打印instance.my_数据
btn1=MyAwesomeButton(text='Hello world 1')
btn1.bind(按=回调时)
btn2=MyAwesomeButton(text='Hello world 2')
绑定(按=回调时)

一个可复制的示例将非常好。这里的人没有
MeshApp
和其他特殊的东西,如果你想提供一个完整项目的链接,他们很可能不愿意克隆回购协议。小而可复制是快速正确回答的关键。此外,还有一种“不,你好”,“不,谢谢”的规则,我想这是在中提到的位于左上角的PTo place在.kv文件中使用带有pos_提示的RelativeLayout:{'top':1',left':1}
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)