#python #multithreading #class #pynput
#python #многопоточность #класс #pynput
Вопрос:
итак, я возился с python, когда наткнулся на этот код автоклика в Интернете
import time
import threading
from pynput.mouse import Button, Controller
from pynput.keyboard import Listener, KeyCode
delay = 0.001
button = Button.left
start_stop_key = KeyCode(char='s')
exit_key = KeyCode(char='e')
class ClickMouse(threading.Thread):
def __init__(self, delay, button):
super(ClickMouse, self).__init__()
self.delay = delay
self.button = button
self.running = False
self.program_running = True
def start_clicking(self):
self.running = True
def stop_clicking(self):
self.running = False
def exit(self):
self.stop_clicking()
self.program_running = False
def run(self):
while self.program_running:
while self.running:
mouse.click(self.button)
time.sleep(self.delay)
time.sleep(0.1)
mouse = Controller()
click_thread = ClickMouse(delay, button)
click_thread.start()
def on_press(key):
if key == start_stop_key:
if click_thread.running:
click_thread.stop_clicking()
else:
click_thread.start_clicking()
elif key == exit_key:
click_thread.exit()
listener.stop()
with Listener(on_press=on_press) as listener:
listener.join()
после небольшого исследования я понимаю большую часть этого, но меня все еще смущает одна вещь,
почему команда run() в классе работает автоматически, даже если ее никто не вызывает? в этом коде нет ни одного другого «run»
заранее спасибо
Комментарии:
1. Ваш код вызывает ‘start()’, который сам вызывает ‘run()’
2. @quamrana, это вводит в заблуждение.
start()
Метод не вызываетrun()
метод.start()
Метод создает новый собственный поток, и что-то в новом потоке вызываетrun()
метод.
Ответ №1:
Это типичный шаблон «многопоточности». Сначала вы создаете подкласс «Thread» и переопределяете run()
метод.
После этого вы создаете экземпляр этого класса, который вы видите здесь:
click_thread = ClickMouse(delay, button)
click_thread.start()
Метод «start» запускает поток, который использует функцию «run». Итак, строка, которая эффективно «запускает run()
метод», является click_thread.start()
.
Вы можете найти более подробную информацию в документах threading.Нитки