2016-11-11 75 views
1

我想爲我的項目添加熱鍵。Kivy桌面熱鍵

例如:按Ctrl + S保存

我發現了一個小的工作示例。但它只測試一個鍵是否被按下。 我怎樣才能檢查按下多個按鈕?

編輯:修飾符是一個空列表。我如何使用修飾符?

這裏是我試過的代碼:

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

是否CTRL特別是出現在你的代碼目前忽略'modifiers'說法? – inclement

回答

1

這裏是一個工作示例,如何處理修改字符。我知道這不是正確的解決方案,但它是有效的。如果你知道正確的方式,請在下面張貼...

代碼:

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

在我的機器,控制鍵沒有存儲在modifiers列表中,但它有一個特定的鍵碼。在我的情況下,打印的on_key_down參數按下Ctrl會產生類似時:

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

在我kivy版本,對on_key_down一個額外的參數,所以你必須做相應調整,以您的版本。僅供參考,對於「S」鍵,參數是:

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

要綁定多個按鍵,只需使用條件與多個語句。在我的情況下,我會這樣做:

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