2017-03-16 5 views
0

シンプル問題:私は私のKivy/PythonアプリケーションのボタンをクリックするとリターンIDをクリックKivy Pythonの私がいる

、私はそのボタンのIDへのアクセスを得るためにしたいです。

# Kivy code 

Button: 
    id: position_1 
    on_press: app.access_button_id() 

私はさまざまな試行錯誤を試みましたが、わかりません。 (大きなアプリの一部として)次のように、これは私の問題の要因がある場合に、ボタンが、ネストされている:

FloatLayout: 
    AnchorLayout: 
     ScreenManager: 
      Screen: 
       BoxLayout: 
        FloatLayout: 
         Button: 
          id: position_1 
          on_press: app.access_button_id() 

ここでIDのすべてを返す私のPythonコードは、あります。それは私が持っているほど近いです:

# Python code 

def access_button_id(name): 
    print(self.root.ids) 

私が持っている問題は、私も、私はまだ完全には専門用語を理解していないとして、私はドキュメントで見てすべきかを知らないということです、私は学ぶべき正しい情報を見つけることができません。

EDIT:

(名前は)関数に渡されたが、この問題に関連するいくつかの他の機能ではないためです。

答えて

1

あなたはすでにIDを知っています - あなた自身で設定してください。これらは、コード内でハードコードされた値として使用されます。

from kivy.app import App 
from kivy.uix.boxlayout import BoxLayout 
from kivy.lang import Builder 


Builder.load_string(''' 
<MyWidget>: 
    Button: 
     id: id_value_1 
     text: 'Print my id' 
     on_press: print({'id_value_1': self.proxy_ref}) 
    Button: 
     id: id_value_2 
     text: 'Print all ids' 
     on_press: print(root.ids) 
''') 


class MyWidget(BoxLayout): 
    pass 


class MyApp(App): 
    def build(self): 
     widget = MyWidget() 
     print({'id_value_1': widget.ids['id_value_1']}) 
     return widget 


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

ボタンにIDが必要なのはなぜですか?あなたは何を達成しようとしていますか?コメントで述べた問題へ


EDIT

例解決策:私は見

import random 
import functools 

from kivy.app import App 
from kivy.uix.boxlayout import BoxLayout 
from kivy.uix.popup import Popup 
from kivy.uix.button import Button 
from kivy.lang import Builder 


Builder.load_string(''' 
<MyWidget>: 
    Button: 
     text: 'B1' 
     on_press: root.open_popup(self) 
    Button: 
     text: 'B2' 
     on_press: root.open_popup(self) 
''') 

class MyWidget(BoxLayout): 
    def open_popup(self, caller): 
     fun = functools.partial(self.rename, caller) 
     popup = Popup(
      title='Test popup', 
      content=Button(
       text='rename', 
       on_press=fun 
      ), 
      size_hint=(None, None), size=(400, 400) 
     ) 
     popup.open() 

    def rename(self, caller, *args): 
     caller.text = ''.join(chr(random.randint(48, 90)) for i in range(5)) 


class MyApp(App): 
    def build(self): 
     return MyWidget() 


if __name__ == '__main__': 
    MyApp().run() 
+0

ああ。私は多数のボタンを持っています - 押された瞬間に、その中にオプションのリストを持つポップアップが呼び出され、オプションを選択するとボタンのテキストが置き換えられます。オプションは各ボタンで同じですので、クリックされたボタンに新しいテキストを適用する関数を記述したかっただけです。現在、ハードコードされたIDを使用しているため、各ボタンに固有の機能があります。 –

+0

ウィジェット自体への参照をポップアップに渡すことができます。私は実装例を追加しました。 – Nykakin

+0

私はこのポップアップに私のオプションリストが含まれているので、最初にクリックされたボタンにランダムな文字列を割り当てると、そのボタンをクリックすると、一歩近づいてくれてありがとうございます。今は、そのランダムな文字列を、選択されたオプションのテキストに置き換える方法を検討するだけです。 –