#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 раз. Спасибо за ответ, я узнал кое-что новое.