2016-11-18 12 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

例:ここでは

は、ボタンのAPIの例に基づいてラフ、非テスト例です。ここの人々は 'MeshApp'やその他の特別なものを持っていないし、完全なプロジェクトへのリンクを提供するならば、おそらくRepoを複製するつもりはない。小さくて再現性のあるものは、迅速かつ正確な回答の鍵です。また、「いいえ」、「いいえ」というルールがあります。[ツアー](http://stackoverflow.com/tour)に記載されていると思います。 :P – KeyWeeUsr

+0

左上隅に配置するには、.kvファイル内のpos_hint:{'top':1、 'left':1}でRelativeLayoutを使用します – Daniel

答えて

0

を削除した理由を私は知らないが、私は答えることができますデータ1。

コールバックをバインドすると、受け取る最初の引数はコールバックにバインドされているウィジェットになります。したがって、基本クラスとしてButtonを使用するクラスを作成し、必要な追加情報を定義できます。かなりいいだろう、再現可能である

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)