Я пробовал ниже этого два дня, но не могу заставить его работать.
Я пытался
except KeyboardInterrupt:
sys.exit()
exit()
control+C
, и так далее.
Я попробовал код, но он завершается только через 30 секунд или 1 минуту. Кажется, что «слушатель» в коде усложняет код.
Мне нужно, чтобы код завершался немедленно, когда я нажимаю ESC. «Завершить» здесь означает остановить выполнение кода или закрыть весь терминал. В любом случае это нормально, но он должен работать «немедленно».
Я использую Windows10. Он не должен быть совместим с ОС MAC.
import pydirectinput
import datetime
import time
import threading
from pynput.mouse import Controller, Button
from pynput.keyboard import Listener, KeyCode
TOGGLE_KEY = KeyCode(char = "`")
clicking = False
mouse = Controller()
def clicker():
global fishpause
global a_press
global d_press
global maxtime
duration = 0
while True and duration <= maxtime:
qtime = datetime.datetime.utcnow()
if qtime.hour == 11 and qtime.minute == 30:
print("Quiting by using an error...")
pydirectinput.keydown('alt')
else:
if clicking:
mouse.press(Button.right)
#print("Button pressed")
goleft(fishpause, a_press)
duration += 1
print(f"Duration is: {duration}")
time.sleep(0.5)
time.sleep(0.5)
mouse.release(Button.right)
def toggle_event(key):
if key == TOGGLE_KEY:
global clicking
clicking = not clicking
print("Clicking changed")
def goleft(fishpause, a_press):
pydirectinput.press('a', presses=1, interval=a_press)
print("Moving left")
pydirectinput.PAUSE = fishpause
print(f"PAUSING: {fishpause}")
maxtime = 4500
fishpause = 9.0
a_press = 0.1
time.sleep(1)
print("Starting")
pydirectinput.press('esc', presses=1, interval=0.1)
click_thread = threading.Thread(target=clicker)
click_thread.start()
time.sleep(3)
with Listener(on_press=toggle_event) as listener:
listener.join()
Да, я также пытался убить -9, но он останавливается очень медленно
Программа не завершится, пока click_thread все еще работает. Если кликер знает, что он должен выйти, он может разорвать цикл и вернуться. В качестве альтернативы, если вы пометите поток как демон:
click_thread = threading.Thread(target=clicker, daemon=True)
Затем он завершится при выходе из основной программы.
Вы можете проверить это с помощью крошечной программы ниже. Попробуйте с daemon=True и с daemon=None:
import threading
import time
def thread_loop():
while True:
print("!");
time.sleep(.5)
if __name__ == '__main__':
bkgnd = threading.Thread(target=thread_loop, daemon=True)
bkgnd.start()
print("exit main")
Текущие документы docs.python.org/3/library/threading.html#thread-objects
Я думаю, вы найдете свой ответ здесь ссылка, но если мне нужно что-то с этим сделать, я предлагаю вам попробовать os._exit и процесс kill (pkill -f name-of-the-python-script)