2017-03-16 37 views
0

简单的问题:按钮返回ID,当点击我有Kivy的Python

当我点击我的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() 

这里是我的Python代码,返回所有的ID的。这是亲如我有:

# Python code 

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

我有问题是,我甚至不知道什么应该在文档中寻找,因为我不完全理解的术语呢,所以我找不到要学习的正确信息。

编辑:

(名称)传递给函数的是一些其他的功能,都没有涉及这个问题。

回答

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,如果你已经有了它的访问?你想达到什么目的?


编辑

一个例子解决在注释中提到的问题:

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

我已经得到了这个,使弹出窗口包含我的选项列表,然后单击任意一个将随机字符串分配给最初点击的按钮,所以谢谢你让我更近了一步。现在我只需要解决如何用选择的选项中的文本替换该随机字符串。 –