如何获取kivy按钮的Id和Text值作为字符串?

时间:2017-07-18 15:34:53

标签: python kivy

我有一个带有多个按钮的应用程序,我需要按下按钮的id和文本值作为字符串。然后,按钮的抓取的Ids和Text valus将被传递给另一个函数以进行进一步处理。为简单起见,我写了这个示例程序。

# main.py

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

########################################################################
class KVMyHBoxLayout(BoxLayout):
    pass


########################################################################
class ExampleApp(App):
    def Pressbtn(self, *args):
        print'Pressed button'
    #----------------------------------------------------------------------
    def build(self):

        return KVMyHBoxLayout()

#----------------------------------------------------------------------
if __name__ == "__main__":
    app = ExampleApp()
    app.run()

kv文件

<MyButton@Button>:
    color: .8,.9,0,1
    font_size: 32

<KVMyHBoxLayout>:
    orientation: 'vertical'
    MyButton:
        id:"idBtn1"
        text: "Btn1"
        background_color: 1,0,0,1
        on_press:app.Pressbtn()
    MyButton:
        id:"idBtn2"
        text: "Btn2"
        background_color: 0,1,0,1
        on_press:app.Pressbtn()
    Label:
        text: "ID"
        background_color: 0,0,1,1
    Label:
        text: "Text"
        background_color: 1,0,1,1

按下按钮时,ID和文本标签中将显示相应的id和文本值。目前,上面的代码仅在按下按钮时打印按下按钮。我想知道如何获得按钮python的id和text值。

3 个答案:

答案 0 :(得分:4)

首先,在从kv:

调用该方法时,必须将该按钮实例显式传递给该方法
on_press: app.Pressbtn(self)

然后,您可以使用实例引用来修改按钮或查看其属性,您不需要id。如果您想获得id,则只能使用按钮父级的ids字典来执行此操作。

基于您的代码的示例:

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

kv_file = '''
<MyButton@Button>:
    color: .8,.9,0,1
    font_size: 32

<KVMyHBoxLayout>:
    orientation: 'vertical'
    MyButton:
        id:"idBtn1"
        text: "Btn1"
        background_color: 1,0,0,1
        on_press:app.Pressbtn(self)
    MyButton:
        id:"idBtn2"
        text: "Btn2"
        background_color: 0,1,0,1
        on_press:app.Pressbtn(self)
    Label:
        id: lobj
        text: "Object"
        background_color: 1,0,1,1

    Label:
        id: lid
        text: "ID"
        background_color: 0,0,1,1
    Label:
        id: ltext
        text: "Text"
        background_color: 1,0,1,1
'''


class KVMyHBoxLayout(BoxLayout):
    pass

class ExampleApp(App):
    def Pressbtn(self, instance):
        instance.parent.ids.lobj.text = str(instance)
        instance.parent.ids.ltext.text = instance.text
        instance.parent.ids.lid.text= self.get_id(instance)

    def get_id(self,  instance):
        for id, widget in instance.parent.ids.items():
            if widget.__self__ == instance:
                return id

    def build(self):
        Builder.load_string(kv_file)
        return KVMyHBoxLayout()

if __name__ == "__main__":
    app = ExampleApp()
    app.run()

<强>输出:

enter image description here

修改

如果在.py文件中定义窗口小部件(按钮),则不需要将实例传递给函数,它将作为参数自动传递:

from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.uix.button import Button
from kivy.uix.scrollview import ScrollView


class FirstScreen(Screen):
    def __init__(self,**kwargs):
        super(FirstScreen, self).__init__(**kwargs)    
        layout=BoxLayout(orientation="vertical",size_hint_y= None)
        layout.bind(minimum_height=layout.setter('height'))                
        for i in range(50):
                btn = Button(text="Button"+str(i),
                             id=str(i),
                             size_hint=(None, None),
                             on_press=self.Press_auth)               #<<<<<<<<<<<<<<<<           
                layout.add_widget(btn)
        root = ScrollView()
        root.add_widget(layout)
        self.add_widget(root)

    def Press_auth(self,instance):     
        print(str(instance))

class TestScreenManager(ScreenManager):
    def __init__(self,  **kwargs):
        super(TestScreenManager,  self).__init__(**kwargs)
        self.add_widget(FirstScreen())

class ExampleApp(App):
    def build(self):           
        return TestScreenManager()

def main():
    app = ExampleApp()
    app.run()

if __name__ == '__main__':
    main()

答案 1 :(得分:0)

您可以按照以下方式使用回调函数。在您的KV文件中:

 ToggleButton:
     text: 'Label'
     id: halftimebutton
     on_state: root.callback(self)

然后在您的.py文件中可以执行以下操作:

def callback_halftime_state(self, instance):
    if instance.state == 'down':
        self.halftime == True
    else:
        self.halftime == False

这当然显示了instance.state,但是它可以是Kivy公开的按钮的任何属性 instance.text instance.id 等。

答案 2 :(得分:0)

在按钮单击时获取按钮文本的示例:

class MainApp(MDApp):
def build(self):

    VB = BoxLayout(orientation='vertical', padding=50,spacing="10")

    Atbtn = Button(text="AT (Automata Theory)", font_size="25sp")
    Atbtn.bind(on_press=self.callback)

    Pybtn = Button(text="Python", font_size="25sp")
    Pybtn.bind(on_press=self.callback)


    VB.add_widget(Atbtn)
    VB.add_widget(Pybtn)

    return VB

def callback(self, instance):
    print(instance.text)