2016-11-18 34 views
2

我在stackoverflow上发现了一个类似的主题,但不幸的是它没有帮助我。Kivy Python中的下拉菜单

这是我第一次尝试认真编程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 

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

非常感谢您

编辑:我不知道为什么,但与“大家好”的第一行会被自动删除

+0

是可重复的将是相当不错的一个例子。这里的人没有'MeshApp'和其他特殊的东西,如果你提供一个完整项目的链接,他们很可能不愿意克隆一个回购站。小和可重复是快速和正确答案的关键。此外,还有一种“不喜”,“不感谢”的规则,我认为它在[tour](http://stackoverflow.com/tour)中提到过。 :P – KeyWeeUsr

+0

要放置在左上角,请在.kv文件中使用带有pos_hint的RelativeLayout:{'top':1,'left':1} – Daniel

回答

0

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

当您绑定回调时,您收到的第一个参数将是绑定到回调的哪个窗口小部件。所以这个想法是创建一个使用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)