微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在 kivy 小部件上模拟用户操作? 按示例单击按钮

如何解决如何在 kivy 小部件上模拟用户操作? 按示例单击按钮

我想模拟用户操作,在查看文档后,我看到了 Clock.schedule_once(my_callback,1)

.

问题:这是唯一的方法吗?我更喜欢 my_button.press() 之类的东西。

.

我想按下按钮然后,它会调用my_callback,我不想直接调用my_callback

(因为如果我这样做并且我的回调发展,我失去了很好的参考)

PS:我看到可以使用 Clock.create_trigger(my_callback),但在这里似乎不是很好的解决方案。

from kivymd.app import MDApp
from kivy.lang import Builder
from kivy.clock import Clock

KV_APP = '''
BoxLayout:
    Button:
        id: my_button
        text: "Click on me"
'''

class TestApp(MDApp):
    def build(self):
        self.screen = Builder.load_string(KV_APP)
        self.screen.ids["my_button"].bind(on_press=self.on_button_click)
        event = Clock.schedule_once(self.on_button_click,1)
        return self.screen

    def on_button_click(self,instance):
        print("hello there !")

if __name__ == '__main__':
    TestApp().run()

解决方法

您可以创建一个 Event 并发送它。下面是一个例子:

from kivy.app import App
from kivy.clock import Clock
from kivy.input.providers.mouse import MouseMotionEvent
from kivy.lang import Builder
from kivy.uix.boxlayout import BoxLayout


class MyBoxLayout(BoxLayout):
    def mydispatchAnEvent(self,*args):
        # create and dispatch a fake event
        touch = MouseMotionEvent(None,123,(123,456))  # args are device,id,spos
        touch.button = 'left'
        touch.pos = (321,654)
        self.dispatch('on_touch_down',touch)


theRoot = Builder.load_string('''
MyBoxLayout:
    orientation: 'vertical'
    Label:
        text: 'Button below should demonstrate receiving touch event'
    Button:
        text: 'Waiting for event'
        on_press: print('touched')
''')


class EventDispatcherPlayApp(App):
    def build(self):
        Clock.schedule_once(theRoot.mydispatchAnEvent,2)
        return theRoot

EventDispatcherPlayApp().run()

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。