解除绑定Window.grab_mouse

时间:2019-03-25 03:41:11

标签: python kivy

有一个示例,说明如何将文件从系统拖放到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()

可能是什么问题?

1 个答案:

答案 0 :(得分:1)

您正在停用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()