2016-02-19 3 views
1

Я пытаюсь имитировать клавиатуру с помощью python, и я не знаю, как бороться с несколькими нажатиями кнопки клавиатуры. Код ниже отлично работает с 1 или 2 нажатых одновременно («Ctrl + C» Fe):Есть ли способ создать/изменить функцию «на лету» в python

if '+' in current_arg: 
    current_arg = current_arg.split('+') 
    current_arg[0] = current_arg[0].strip() 
    current_arg[1] = current_arg[1].strip() 

    SendInput(Keyboard(globals()["VK_%s" % current_arg[0].upper()]), 
       Keyboard(globals()["VK_%s" % current_arg[1].upper()])) 
    time.sleep(input_time_down()) 

    if len(last_arg) > 1 and type(last_arg) == list: 
     SendInput(Keyboard(globals()["VK_%s" % last_arg[0].upper()], KEYEVENTF_KEYUP), 
        Keyboard(globals()["VK_%s" % last_arg[1].upper()], KEYEVENTF_KEYUP)) 
     time.sleep(input_time_down()) 
    else: 
     SendInput(Keyboard(globals()["VK_%s" % last_arg.upper()], KEYEVENTF_KEYUP)) 
     time.sleep(input_time_down()) 

Но что, если есть 3 или более кнопок нажата в то же время? Каков самый элегантный способ сделать это? Я мог бы просто добавить, если «+» count == 2, если «+» count == 3 и т. Д., Но должен быть лучший способ сделать это. Я хотел бы, чтобы моя функция настраивалась на количество аргументов.

Например:

keyboard_sim ('Ctrl + Shift + Esc'):

if '+' in current_arg: 
    current_arg = current_arg.split('+') 
    current_arg[0] = current_arg[0].strip() 
### function adds another current_arg for each argument 
    current_arg[1] = current_arg[1].strip() 
    current_arg[2] = current_arg[2].strip() 

    SendInput(Keyboard(globals()["VK_%s" % current_arg[0].upper()]), 
### function adds another Keyboard for each argument 
       Keyboard(globals()["VK_%s" % current_arg[1].upper()])) 
       Keyboard(globals()["VK_%s" % current_arg[2].upper()])) 
    time.sleep(input_time_down()) 

    if len(last_arg) > 1 and type(last_arg) == list: 
### function adds another Keyboard KEYEVENTF for each argument 
     SendInput(Keyboard(globals()["VK_%s" % last_arg[0].upper()], KEYEVENTF_KEYUP), 
        Keyboard(globals()["VK_%s" % last_arg[1].upper()], KEYEVENTF_KEYUP)) 
        Keyboard(globals()["VK_%s" % last_arg[2].upper()], KEYEVENTF_KEYUP)) 

     time.sleep(input_time_down()) 
    else: 
    ### this is added so I won't get error if there is single key pressed 
     SendInput(Keyboard(globals()["VK_%s" % last_arg.upper()], KEYEVENTF_KEYUP)) 
     time.sleep(input_time_down()) 
+1

Это [это] (http://stackoverflow.com/questions/3394835/args-and-kwargs), что вам нужно? – JETM

+0

Нет. Я уже использую args. Я хочу, чтобы функция менялась в зависимости от количества аргументов в списке после split. Если я хочу нажимать кнопки одновременно, я должен использовать их в одном выражении SendInput (Keyboard(), как вы видите выше. Этот оператор if уже находится в функции. – Gunnm

ответ

1

Я не знаком с SendInput/Keyboard материал, который вы используете, так я предполагаю, что они на заказ и написано вами.

Предполагая, что SendInput определяется как def SendInput(*args) (как это было предложено @JETM) и last_arg фактически должны быть current_arg, вы должны быть в состоянии назвать это так:

arglist = current_arg.split('+') 
# This will create a list of Keyboard objects 
keys = [KeyBoard(globals()["VK_%s" % key.upper()]) for key in arglist] 
# *keys splits the list of Keyboard objects so that SendInput receives 
# one entry in it's argument list for each Keyboard object in keys 
SendInput(*keys) 

Используя это, в SendInput в арг переменной будет список с одним объектом Keyboard для каждого ключа.

+0

Он отлично работает. Спасибо за помощь. – Gunnm

 Смежные вопросы

  • Нет связанных вопросов^_^