Python 自定义小部件触发另一个自定义小部件';s关于触地事件
每当我按下Python 自定义小部件触发另一个自定义小部件';s关于触地事件,python,kivy,kivy-language,Python,Kivy,Kivy Language,每当我按下MyWidget中的任何区域时,它就会触发MyWidget类中的第一个MyButton的on\u touch\u down事件。 我是新来的基维,不明白为什么会这样 <MyButton@Button>: background_normal: '' background_color: [1,0,1,1] font_size: "44dp" color:[1,1,0,1] border:(1,1,1,1) text_size:self.size <
MyWidget
中的任何区域时,它就会触发MyWidget
类中的第一个MyButton
的on\u touch\u down事件。
我是新来的基维,不明白为什么会这样
<MyButton@Button>:
background_normal: ''
background_color: [1,0,1,1]
font_size: "44dp"
color:[1,1,0,1]
border:(1,1,1,1)
text_size:self.size
<MyWidget@Widget>:
id:customwidget
canvas.before:
Color:
rgba:0.2,0.44,0.66,1
Rectangle:
pos:self.pos
size:self.size
<MyLayout>:
MyWidget:
id:mywidget
MyButton:
id:button1
text: "User Name"
spacing: "10dp"
on_touch_down: button1.text= self.text + "?"
opacity: .8
MyButton:
text: "ikinci"
on_touch_down: root.export_to_png("filename.png")
MyButton:
text: "ucuncu"
Python代码
类MyButton()
并实现on\u touch\u down()
:
MyButton:
触摸屏上的
事件并不特定于任何小部件,而是传播到所有小部件。看。如果您只希望您的按钮
做出响应,您可能希望在按下事件时使用,或在释放事件时使用(请参阅)。感谢您的回答,但此按钮只运行一次,我可以使用id进行比较吗?您不能使用ids
进行比较,因为它的值仅在kv文件
和字典类型中有效,self.ids['button1']
或'self.ids.button1'。
import kivy
from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.button import Button
from kivy.uix.widget import Widget
class MyLayout(BoxLayout):
pass
class KivyApp(App):
def build(self):
return MyLayout()
if __name__ == "__main__":
KivyApp().run()
class MyButton(Button):
def on_touch_down(self, touch):
if self.collide_point(*touch.pos):
print("\tMyButton.on_touch_down:")
if self.text == 'User Name':
self.text= self.text + "?"
elif self.text == 'ikinci':
App.get_running_app().root.export_to_png("filename.png")
return True
return super(MyButton, self).on_touch_down(touch)
<MyButton>:
background_normal: ''
background_color: [1,0,1,1]
font_size: "44dp"
color:[1,1,0,1]
border:(1,1,1,1)
text_size:self.size
...
MyButton:
id:button1
text: "User Name"
spacing: "10dp"
opacity: .8
MyButton:
text: "ikinci"
MyButton:
text: "ucuncu"
def on_touch_down(self, touch):
if self.collide_point(*touch.pos):
# The touch has occurred inside the widgets area. Do stuff!
pass