Как открыть программу с помощью ввода с клавиатуры?

#python #windows #input #keyboard

Вопрос:

Мой проект состоит в том, чтобы создать программу, которую вы можете запускать, играя в игры или другие программы в фоновом режиме. Когда вы нажимаете определенную клавишу, ваш блокнот должен открываться и закрываться после повторного нажатия той же клавиши.

Мне удалось открыть блокнот с помощью подпроцесса, и это работает нормально, но я понятия не имею, как сделать так, чтобы он открывался только при нажатии определенной клавиши. Спасибо за любую помощь!

РЕДАКТИРОВАТЬ: То, что я уже пробовал:

 import subprocess
import keyboard

if keyboard.is_pressed('k'):
    subprocess.Popen('C:\Windows\System32\notepad.exe')

input()
 

здесь он просто не обнаруживает никакого ввода с клавиатуры, ввод() в конце заставляет программу не закрываться мгновенно

 import subprocess
import keyboard

keyboard.add_hotkey('ctrl k', print,args=("hello", "test"))

input()
 

Здесь, если я нажму «ctrl k», он напечатает приветственный тест, что означает, что горячая клавиша работает нормально. Когда я переключаю эту часть «печать,args=(«привет», «тест»)» на «подпроцесс.Попен(‘C:WindowsSystem32notepad.exe’)»(он должен открыть программу вместо печати приветственного теста) блокнот открывается мгновенно после запуска программы, и когда я нажимаю «ctrl k», я получаю большую ошибку.

Комментарии:

1. Привет, Дэни, добро пожаловать. Вам повезет больше, если вы опубликуете минимальный воспроизводимый пример, чтобы людям было легче увидеть, что вы пробовали, и предложить различные подходы.

2. @afterburner Хорошо, я попытаюсь воспроизвести код, который я делал раньше.

Ответ №1:

Более сложным, но все еще работающим примером может быть следующий. С помощью этого кода ваша программа будет всегда прослушивать клавиатуру, а не только тогда, когда вы сосредоточены на вводе, поэтому это может быть очень практично в вашем случае

 from pynput import keyboard
import subprocess
import threading

class MyException(Exception): pass

class Listening:
    """Is allways waiting for the keyboard input"""
    def __init__(self):
        self.notepad_open = False # to know the state
        with keyboard.Listener(
                on_press=self.on_press) as listener:
            try:
                listener.join()
            except:
                pass
    
    def on_press(self, key):
        try:
            if key.char == "k":
                if not self.notepad_open:
                    self.subprocess = 
                        subprocess.Popen('C:\Windows\System32\notepad.exe')
                    self.notepad_open = True # update state
                else:
                    self.subprocess.kill()
                    self.notepad_open = False # update state
        except: # special key was pressed
            pass

thread = threading.Thread(target=lambda: Listening())
thread.start()
 

Комментарии:

1. Большое вам спасибо, это именно то, что я пытался сделать!!

Ответ №2:

Проблема в том, что вы проверяете наличие ключа » k » только один раз в начале. Если вы хотите, чтобы программа работала правильно, вам следует попробовать это:

 import time
import subprocess
import keyboard
while True:
    if keyboard.is_pressed('k'):
        subprocess.Popen('C:\Windows\System32\notepad.exe')
        time.sleep(5)
 

-Я использовал время так, чтобы вы могли открывать программу только один раз в 5 секунд(если вам интересно, посмотрите, что происходит без этого)-

Комментарии:

1. Спасибо! Я забыл, что он проверяет только k один раз и без времени.sleep(5) он просто спамит открытый блокнот примерно 100 раз. Спасибо за ответ, я узнал кое-что новое.