我有一个带有多个按钮的应用程序,我需要按下按钮的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值。
答案 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()
<强>输出:强>
修改强>
如果在.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)