2016-11-11 3 views
1

Ich möchte Hotkeys zu meinem Projekt hinzufügen.Hotkeys in Kivy-Desktop

Zum Beispiel: Strg + S für

Speicher fand ich ein kleines Arbeitsbeispiel. Aber es testet nur, ob eine Taste gedrückt ist oder nicht. Wie kann ich nach mehreren gedrückten Tasten suchen?

edit: Die Modifikatoren ist eine leere Liste. Wie kann ich die Modifikatoren verwenden? Hier

ist der Code, den ich versuchte:

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

Does ctrl insbesondere erscheinen im 'modifiers' Argument, dass der Code ignoriert zur Zeit? – inclement

Antwort

1

Hier ist ein Arbeitsbeispiel, wie mit geänderten Zeichen umzugehen. Ich weiß, es ist nicht die richtige Lösung, aber es funktioniert. Wenn Sie die richtige Art und Weise kennen, bitte unten posten ...

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

Auf meinem Rechner, die Strg-Taste nicht in der modifiers Liste gespeichert ist, aber es hat eine spezifische Keycode. In meinem Fall die Argumente on_key_down Druck bei Drücken von Strg etwas wie ergeben würde:

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

In meiner Kivy Version gibt es ein zusätzliches Argument auf on_key_down so dass Sie es zu Ihrer Version entsprechend Sie einstellen müssen, . Nur als Referenz, sind die Argumente für die „S“ -Taste:

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

mehrere Schlüssel zu binden, einfach eine bedingte mit mehreren Anweisungen verwenden. In meinem Fall würde ich tun:

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