2016-11-11 1 views
1

Je voudrais ajouter des raccourcis clavier à mon projet.Raccourcis clavier dans Kivy-desktop

Par exemple: ctrl + S pour sauver

Je trouve un petit exemple de travail. Mais il teste seulement si une touche est pressée ou non. Comment vérifier si plusieurs boutons ont été enfoncés?

edit: les modificateurs est une liste vide. Comment puis-je utiliser les modificateurs?

Voici le code que j'ai essayé:

from kivy.app import App 
from kivy.uix.floatlayout import FloatLayout 
from kivy.uix.textinput import TextInput 
from kivy.uix.widget import Widget 
from kivy.properties import StringProperty,ObjectProperty 
from kivy.core.window import Window, Keyboard 
from kivy.logger import Logger 

class textInsert(FloatLayout): 
    def __init__(self, **kwargs): 
     super(textInsert, self).__init__(**kwargs) 

     text = StringProperty() 

     ######################################## 
     keyboard = Window.request_keyboard(self._keyboard_released, self) 
     keyboard.bind(on_key_down=self._keyboard_on_key_down) 
     ######################################## 

    #end def __init__ 

    def _keyboard_released(self): 
     self.focus = False 

    def _keyboard_on_key_down(self, window, keycode, text, modifiers): 

     if keycode[1] in ["s","y","q","w"]: 
      print("its in the list") 
      return True 
     else: 
      print('returned false') 
      return False 


class ROOT(App): 
    def build(self): 
     return textInsert() 

if __name__ == '__main__': 
    ROOT().run() 
+1

-t-ctrl en particulier apparaissent dans le argument 'modifiers' que votre code ne tient pas compte actuellement? – inclement

Répondre

1

Voici un exemple de travail, comment gérer les caractères modifiés. Je sais que ce n'est pas la bonne solution, mais c'est un travail. Si vous connaissez la bonne façon, s'il vous plaît poster ci-dessous ...

Code:

from kivy.app import App 
from kivy.uix.floatlayout import FloatLayout 
from kivy.properties import StringProperty 
from kivy.core.window import Window, Keyboard 
from kivy.logger import Logger 

class textInsert(FloatLayout): 
    def __init__(self, **kwargs): 
     super(textInsert, self).__init__(**kwargs) 
     self.super = [] 

     text = StringProperty() 

     ######################################## 
     keyboard = Window.request_keyboard(self._keyboard_released, self) 
     keyboard.bind(on_key_down=self._keyboard_on_key_down, on_key_up=self._keyboard_released) 

     ######################################## 
    #end def __init__ 

    def _keyboard_released(self, window, keycode): 
     self.super = [] 

    def _keyboard_on_key_down(self, window, keycode, text, super): 
     if 'lctrl' in self.super and keycode[1] == 's': 
      Logger.info("Item saved, {}".format(self.super)) 
      self.super = [] 
      return False 
     elif 'lctrl' not in self.super and keycode[1] in ["lctrl"]: 
      self.super.append(keycode[1]) 
      return False 
     else: 
      Logger.info("key {} pressed.".format(keycode)) 
      return False 


class ROOT(App): 
    def build(self): 
     return textInsert() 

if __name__ == '__main__': 
    ROOT().run() 
0

Sur ma machine, la clé de contrôle ne sont pas stockées dans la liste modifiers, mais il a un code d'activation spécifique. Dans mon cas, l'impression des arguments de on_key_down lorsque vous appuyez sur Ctrl rapporterait quelque chose comme:

(<kivy.core.window.window_sdl2.WindowSDL object at 0x7fc094802360>, 305, 224, u'\u0131', [])

Dans ma version Kivy, il y a un argument supplémentaire sur on_key_down de sorte que vous aurez ne l'ajuster en conséquence à votre version . Juste pour référence, les arguments en faveur de la touche « S » sont les suivants:

(<kivy.core.window.window_sdl2.WindowSDL object at 0x7fc094802360>, 115, 22, u's', [])

Pour lier plusieurs clés, utilisez simplement un conditionnel avec plusieurs déclarations. Dans mon cas, je ferais:

def _keyboard_on_key_down(self, window, keycode1, keycode2, text, modifiers): 

    #Check if Control AND "S" are both pressed 
    if keycode1 == 305 and keycode1 == 115: 
     #do something