2017-07-18 26 views
1

我有一個應用程序與多個按鈕,我需要按鈕時獲取按鈕的id和文本值作爲字符串。然後將該按鈕的抓取的Ids和文本值傳遞給另一個函數以供進一步處理。爲了簡單,我寫了這個示例程序。如何獲取作爲字符串的kivy按鈕的ID和文本值?

# 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() 

千伏文件

<[email protected]>: 
    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和文字標籤顯示。目前上述代碼僅打印按下按鈕時按下按鈕。我想知道如何pythonically得到按鈕和文本的值。

回答

2

首先,你必須明確地通過按鈕實例的方法時,它從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 = ''' 
<[email protected]>: 
    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() 
+0

由於它的作品我用一個屏幕內按鈕,當我按下按鈕返回屏幕的對象'<用戶名='FirstScreen'>'任何想法如何獲取按鈕實例,該實例位於屏幕內部的佈局內。 – Eka

+0

@Eka即使按鈕位於「屏幕」內部的佈局內,該代碼也能正常工作(除了獲取「id」)。如果您無法正常工作,請通過添加代碼來編輯問題,以查看我是否可以幫助您。最好的祝福。 – FJSevilla

+0

這是我的代碼https://pastebin.com/PDQpXbkU我正在屏幕類中動態地使用按鈕創建一個Scrollview boxlayout。這個'on_press = lambda a:self.Press_auth(self)'我把它從一些示例代碼中,它檢測到按下事件,但它傳遞的對象是' Eka

相關問題