問題描述
我有一個帶有多個按鈕的應用程序,我需要在按下按鈕時將按鈕的 id 和文本值作為字符串獲取.然后將抓取的按鈕的 Ids 和 Text 值傳遞給另一個函數以進行進一步處理.為簡單起見,我編寫了這個示例程序.
I have an app with multiple buttons and I need to get id and text value of the button as string when it is pressed. The grabbed Ids and Text valus of the button will then be passed to another function for further processing. For simplicity I wrote this sample programme.
# 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 和 text 值將顯示在 ID 和 Text 標簽中.目前上述代碼僅在按下按鈕時打印Pressed button.我想知道如何以python方式獲取按鈕的id和文本值.
When a button is pressed its corresponding values of id and text will be shown in the ID and Text labels. Currently the above code only print Pressed button when button is pressed. I want to know how to get id and text value of button pythonically.
推薦答案
首先,從kv調用時,必須將按鈕實例顯式傳遞給方法:
First, you must pass the button instance explicitly to the method when it is called from the kv:
on_press: app.Pressbtn(self)
然后您可以使用實例引用來修改按鈕或查看其屬性,您不需要 id
.如果要獲取id
,只能使用按鈕父級的ids
字典.
You can then use the instance reference to modify the button or see its attributes, you do not need the id
. If you want to get the id
, you can only do it using the ids
dictionary of the button parent.
基于您的代碼的示例:
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()
輸出:
如果您在 .py 文件中定義小部件(按鈕),則無需將實例傳遞給函數,它會自動作為參數傳遞:
If you define the widget (button) in the .py file you do not need to pass the instance to the function, it is passed automatically as argument:
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()
這篇關于如何獲取 kivy 按鈕的 Id 和 Text 值作為字符串?的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網!