2011-07-29 70 views
2

我需要以編程方式控制powerpoint/pdf演示文稿(4個方向按鍵需要最少工作才能轉到上一張幻燈片和下一張幻燈片)。如何通過Python生成鍵盤按鍵事件來控制PP顯示?

什麼庫/模塊/框架可以用於Python在OS X上執行此操作?

我在Windows和C#(或者OS X和Quartz)中看到了很多討論,但是沒有什麼特別與Python有關。跨平臺的庫/框架會更好。總的來說,我想以編程方式控制我在OS X上的Python演示文稿(作爲愛好項目的一部分,並且可能在我自己的簡短演示文稿中也可能有用)。

+0

對不起刪除我的答案,不知何故,我設法想念[標籤:OSX],對不起! – Trufa

回答

0
+2

謝謝,但不是**收集**按鍵事件的這些模塊?如果我錯了,請讓我知道。我想生成事件,以便通過代碼將演示文稿移動到下一張幻燈片。 – AJJ

+0

只是爲了澄清,例如,我想在1分鐘的計時器耗盡後移動到下一張幻燈片。所以我想寫一條命令,在1分鐘後在演示窗口中生成「前進鍵」事件。 – AJJ

+0

對不起,我認爲你是用Python創建演示程序。一個建議,我知道這不是在Python中,但你看過AppleScript?至於用於將鍵盤事件發送到操作系統的跨平臺Python庫,我唯一遇到的是使用wxPython - http://wxpython-users.1045709.n5.nabble.com/Create-a-mouse-keyboard -event-and-send-the-underlying-OS-td4400077.html – arunkumar

0

可以使用Quartz庫Python,例如

#!/usr/bin/python 
# Script simulating keyboard events in macOS. 
# See: https://stackoverflow.com/q/13564851/55075 

import sys 
import time 
from Quartz.CoreGraphics import CGEventCreateKeyboardEvent 
from Quartz.CoreGraphics import CGEventPost 
from Quartz.CoreGraphics import kCGHIDEventTap 
#from Quartz.CoreGraphics import CFRelease # Python releases things automatically. 

class Keyboard(): 
    shiftChars = { 
     '~': '`', 
     '!': '1', 
     '@': '2', 
     '#': '3', 
     '$': '4', 
     '%': '5', 
     '^': '6', 
     '&': '7', 
     '*': '8', 
     '(': '9', 
     ')': '0', 
     '_': '-', 
     '+': '=', 
     '{': '[', 
     '}': ']', 
     '|': '\\', 
     ':': ';', 
     '"': '\'', 
     '<': ',', 
     '>': '.', 
     '?': '/' 
    } 


    keyCodeMap = { 
     'a'    : 0x00, 
     's'    : 0x01, 
     'd'    : 0x02, 
     'f'    : 0x03, 
     'h'    : 0x04, 
     'g'    : 0x05, 
     'z'    : 0x06, 
     'x'    : 0x07, 
     'c'    : 0x08, 
     'v'    : 0x09, 
     'b'    : 0x0B, 
     'q'    : 0x0C, 
     'w'    : 0x0D, 
     'e'    : 0x0E, 
     'r'    : 0x0F, 
     'y'    : 0x10, 
     't'    : 0x11, 
     '1'    : 0x12, 
     '2'    : 0x13, 
     '3'    : 0x14, 
     '4'    : 0x15, 
     '6'    : 0x16, 
     '5'    : 0x17, 
     '='    : 0x18, 
     '9'    : 0x19, 
     '7'    : 0x1A, 
     '-'    : 0x1B, 
     '8'    : 0x1C, 
     '0'    : 0x1D, 
     ']'    : 0x1E, 
     'o'    : 0x1F, 
     'u'    : 0x20, 
     '['    : 0x21, 
     'i'    : 0x22, 
     'p'    : 0x23, 
     'l'    : 0x25, 
     'j'    : 0x26, 
     '\''    : 0x27, 
     'k'    : 0x28, 
     ';'    : 0x29, 
     '\\'    : 0x2A, 
     ','    : 0x2B, 
     '/'    : 0x2C, 
     'n'    : 0x2D, 
     'm'    : 0x2E, 
     '.'    : 0x2F, 
     '`'    : 0x32, 
     'k.'    : 0x41, 
     'k*'    : 0x43, 
     'k+'    : 0x45, 
     'kclear'   : 0x47, 
     'k/'    : 0x4B, 
     'k\n'   : 0x4C, 
     'k-'    : 0x4E, 
     'k='    : 0x51, 
     'k0'    : 0x52, 
     'k1'    : 0x53, 
     'k2'    : 0x54, 
     'k3'    : 0x55, 
     'k4'    : 0x56, 
     'k5'    : 0x57, 
     'k6'    : 0x58, 
     'k7'    : 0x59, 
     'k8'    : 0x5B, 
     'k9'    : 0x5C, 

     # keycodes for keys that are independent of keyboard layout 
     '\n'    : 0x24, 
     '\t'    : 0x30, 
     ' '    : 0x31, 
     'del'   : 0x33, 
     'delete'   : 0x33, 
     'esc'   : 0x35, 
     'escape'   : 0x35, 
     'cmd'   : 0x37, 
     'command'  : 0x37, 
     'shift'   : 0x38, 
     'caps lock'  : 0x39, 
     'option'   : 0x3A, 
     'ctrl'   : 0x3B, 
     'control'  : 0x3B, 
     'right shift' : 0x3C, 
     'rshift'   : 0x3C, 
     'right option' : 0x3D, 
     'roption'  : 0x3D, 
     'right control' : 0x3E, 
     'rcontrol'  : 0x3E, 
     'fun'   : 0x3F, 
     'function'  : 0x3F, 
     'f17'   : 0x40, 
     'volume up'  : 0x48, 
     'volume down' : 0x49, 
     'mute'   : 0x4A, 
     'f18'   : 0x4F, 
     'f19'   : 0x50, 
     'f20'   : 0x5A, 
     'f5'    : 0x60, 
     'f6'    : 0x61, 
     'f7'    : 0x62, 
     'f3'    : 0x63, 
     'f8'    : 0x64, 
     'f9'    : 0x65, 
     'f11'   : 0x67, 
     'f13'   : 0x69, 
     'f16'   : 0x6A, 
     'f14'   : 0x6B, 
     'f10'   : 0x6D, 
     'f12'   : 0x6F, 
     'f15'   : 0x71, 
     'help'   : 0x72, 
     'home'   : 0x73, 
     'pgup'   : 0x74, 
     'page up'  : 0x74, 
     'forward delete' : 0x75, 
     'f4'    : 0x76, 
     'end'   : 0x77, 
     'f2'    : 0x78, 
     'page down'  : 0x79, 
     'pgdn'   : 0x79, 
     'f1'    : 0x7A, 
     'left'   : 0x7B, 
     'right'   : 0x7C, 
     'down'   : 0x7D, 
     'up'    : 0x7E 
    } 

    # See: https://stackoverflow.com/q/3202629/55075 
    def toKeyCode(self, c): 
     shiftKey = False 
     # Letter 
     if c.isalpha(): 
      if not c.islower(): 
       shiftKey = True 
       c = c.lower() 
     if c in Keyboard.shiftChars: 
      shiftKey = True 
      c = Keyboard.shiftChars[c] 
     if c in Keyboard.keyCodeMap: 
      keyCode = Keyboard.keyCodeMap[c] 
     else: 
      keyCode = ord(c) 
     return keyCode, shiftKey 

    def KeyDown(self, k): 
     keyCode, shiftKey = self.toKeyCode(k) 

     time.sleep(0.0001) 

     if shiftKey: 
      CGEventPost(kCGHIDEventTap, CGEventCreateKeyboardEvent(None, 0x38, True)) 
      time.sleep(0.0001) 

     CGEventPost(kCGHIDEventTap, CGEventCreateKeyboardEvent(None, keyCode, True)) 
     time.sleep(0.0001) 

     if shiftKey: 
      CGEventPost(kCGHIDEventTap, CGEventCreateKeyboardEvent(None, 0x38, False)) 
      time.sleep(0.0001) 

    def KeyUp(self, k): 
     keyCode, shiftKey = self.toKeyCode(k) 

     time.sleep(0.0001) 

     CGEventPost(kCGHIDEventTap, CGEventCreateKeyboardEvent(None, keyCode, False)) 
     time.sleep(0.0001) 

    def KeyPress(self, k): 
     keyCode, shiftKey = self.toKeyCode(k) 

     time.sleep(0.0001) 

     if shiftKey: 
      CGEventPost(kCGHIDEventTap, CGEventCreateKeyboardEvent(None, 0x38, True)) 
      time.sleep(0.0001) 

     CGEventPost(kCGHIDEventTap, CGEventCreateKeyboardEvent(None, keyCode, True)) 
     time.sleep(0.0001) 

     CGEventPost(kCGHIDEventTap, CGEventCreateKeyboardEvent(None, keyCode, False)) 
     time.sleep(0.0001) 

     if shiftKey: 
      CGEventPost(kCGHIDEventTap, CGEventCreateKeyboardEvent(None, 0x38, False)) 
      time.sleep(0.0001) 

    def Type(self, text): 
     for key in text: 
      self.KeyDown(key) 
      self.KeyUp(key) 

下面是使用上面的類的演示代碼:

# DEMO 
if __name__ == '__main__': 
    keyboard = Keyboard() 
    if sys.platform == "darwin": 
     keyboard.Type('Hello World!') 
    elif sys.platform == "win32": 
     print("Error: Platform not supported!") 

這將模擬輸入當前窗口上Hello World!文本。

您可以將上面的代碼作爲shell腳本運行。檢查鏈接到keyboard.py file

相關問題:Generate keyboard events