Как я могу сделать, чтобы нажатие клавиши делало одну вещь в первый раз, а другую - во второй раз? - PullRequest
2 голосов
/ 07 февраля 2020

Итак, я собрал этот скрипт, который позволяет мне отправлять сообщение os c, (управление звуком), когда я нажимаю клавишу "w". (Мне нужно, чтобы это работало в фоновом режиме моего компьютера, поэтому любые предложения о том, как сделать его более эффективным, были бы оценены !! отправить другое сообщение, когда я нажму "W" во второй раз. (Вот тут и приходит client.send_message.) Вы увидите, что я начал писать это, но безрезультатно. Lol.

В двух словах, когда я нажимаю "w" в первый раз, он отлично работает , (Выполняет client.send_message("/TABS", "Mixer")). Теперь, когда я нажму его во второй раз, я хочу, чтобы он выполнил client.send_message("/TABS", "Instruments") Как я могу go сделать это?

Код:

import argparse
import pynput

from pythonosc import udp_client
from pynput.keyboard import Key, Listener
from pynput import keyboard
import keyboard

if __name__ == "__main__":
    parser = argparse.ArgumentParser()
    parser.add_argument("--ip", default="192.168.1.140",
        help="The ip of the OSC server")
    parser.add_argument("--port", type=int, default=8420,
        help="The port the OSC server is listening on")
    args = parser.parse_args()

    client = udp_client.SimpleUDPClient(args.ip, args.port)

    def on_press(key):
        if keyboard.is_pressed('w'):
            client.send_message("/TABS", "Mixer")
        else:
            client.send_message("/TABS", "Instruments")


    with Listener(on_press=on_press) as listener:
        listener.join()

1 Ответ

1 голос
/ 08 февраля 2020

Поскольку вы хотите циклически выполнять две операции вперед и назад, вы можете использовать itertools.cycle, чтобы сделать именно это.

Сначала вы захотите определить две маленькие функции для сделай две свои операции. В этом случае я посылаю client в качестве аргумента функциям.

def do_mixer(client_arg):
    client_arg.send_message("/TABS", "Mixer")

def do_instruments(client_arg):
    client_arg.send_message("/TABS", "Instruments")

Затем вы можете создать объект cycle для бесконечного переключения между двумя функциями при каждом нажатии на "w ":

import argparse
import pynput

from pythonosc import udp_client
from pynput.keyboard import Key, Listener
from pynput import keyboard
import keyboard

# Additional import
from itertools import cycle

# New funcs
def do_mixer(client_arg):
    client_arg.send_message("/TABS", "Mixer")

def do_instruments(client_arg):
    client_arg.send_message("/TABS", "Instruments")

if __name__ == "__main__":
    parser = argparse.ArgumentParser()
    parser.add_argument("--ip", default="192.168.1.140",
        help="The ip of the OSC server")
    parser.add_argument("--port", type=int, default=8420,
        help="The port the OSC server is listening on")
    args = parser.parse_args()

    client = udp_client.SimpleUDPClient(args.ip, args.port)

    # Function cycler
    func_cycler = cycle((do_mixer, do_instruments))

    def on_press(key):
        if keyboard.is_pressed('w'):
            # With each press of "w", call the function that is next in line
            # The cycle object will iterate the collection given to it infinitely
            # In this case, it will be: do_mixer, do_instruments, do_mixer, ...
            next(func_cycler)(client)

    with Listener(on_press=on_press) as listener:
        listener.join()
...