Unbinding Window.grab_mouse - PullRequest
       10

Unbinding Window.grab_mouse

1 голос
/ 25 марта 2019

Существует пример того, как привязывать и откреплять файлы, перетаскивая их из системы в приложение 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 Ответ

1 голос
/ 25 марта 2019

Вы деактивируете соединение между событием on_cursor_leave и функцией manage_grab_mouse, но не отключаете функцию grab_mouse. Вам нужно вызвать grab_mouse () в функции bind_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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...