首页 > 解决方案 > 解绑 Window.grab_mouse

问题描述

有一个如何绑定和取消绑定文件从系统拖放到 Kivy 应用程序的示例。(也许这可以做得更好,但现在重要的是它可以工作)

有 2 个按钮,左侧(粗略地说)启用文件删除,右侧 - 关闭此功能。

from kivy.core.window import Window
from kivy.lang import Builder

KV = '''
BoxLayout:
    Button:
        text: 'bind dropfile'
        on_press: app.bind_dropfile()

    Button:
        text: 'unbind dropfile'
        on_press: app.unbind_dropfile()

'''


class DropFileApp(App):

    def build(self):

        self.root = Builder.load_string(KV)

    def manage_dropfile(self, window, fn):
        print('do something')

    def bind_dropfile(self):
        Window.bind(on_dropfile=self.manage_dropfile)
        print ('bound!')

    def unbind_dropfile(self):
        Window.unbind(on_dropfile=self.manage_dropfile)
        print ('unbound!')

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

还有另一个类似的例子。该应用程序还有两个按钮。我希望当单击左键时,鼠标将被限制在应用程序窗口区域(将无法退出),而当我单击右键时,此功能将被禁用。但只有左键有效。

from kivy.app import App
from kivy.core.window import Window
from kivy.lang import Builder

KV = '''
BoxLayout:
    Button:
        text: 'bind grab_mouse'
        on_press: app.bind_grab_mouse()

    Button:
        text: 'unbind grab_mouse'
        on_press: app.unbind_grab_mouse()

'''

class DropFileApp(App):

    def build(self):

        self.root = Builder.load_string(KV)

    def manage_grab_mouse(self, instance):
        print('do something')
        Window.grab_mouse()

    def bind_grab_mouse(self):
        Window.bind(on_cursor_leave=self.manage_grab_mouse)
        print ('bound!')

    def unbind_grab_mouse(self):
        Window.unbind(on_cursor_leave=self.manage_grab_mouse)
        print ('unbound!')

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

可能是什么问题呢?

标签: pythonkivy

解决方案


您正在停用 on_cursor_leave 事件和 manage_grab_mouse 函数之间的连接,但并未禁用 grab_mouse 功能。你需要做的是在bind_grab_mouse()函数中调用grab_mouse()和在ungrab_mouse()函数中调用ungrab_mouse(),不需要创建函数manage_grab_mouse。

from kivy.app import App
from kivy.core.window import Window
from kivy.lang import Builder

KV = '''
BoxLayout:
    Button:
        text: 'bind grab_mouse'
        on_press: app.bind_grab_mouse()

    Button:
        text: 'unbind grab_mouse'
        on_press: app.unbind_grab_mouse()

'''

class DropFileApp(App):
    def build(self):
        self.root = Builder.load_string(KV)

    def bind_grab_mouse(self):
        Window.grab_mouse()

    def unbind_grab_mouse(self):
        Window.ungrab_mouse()

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

推荐阅读