Последователь путевых точек получает пустую коллекцию путевых точек из экземпляра класса
Я пишу простые путевые точки, и я столкнулся с проблемой. Все идет гладко (это означает, что добавление новых путевых точек и их отображение работает), пока я не хочу "начать следовать". Если я хочу сделать этот список путевых точек ведет себя так, как если бы он был пустым ("нет путевых точек"), но если я хочу отобразить их, все выглядит нормально. Я не знаю, что мне делать.
import pyautogui
from pynput import mouse, keyboard
import os
class Mouse_Part:
def __init__(self):
self.waypoints = []
def on_click(self, x, y, button, pressed):
if button == button.left and (x, y) not in self.waypoints:
self.waypoints.append((x, y))
print('{}, {} has been added'.format(x, y))
def show_waypoints(self):
print(self.waypoints)
class Keyboard_Part:
def __init__(self):
self.mouse_part = Mouse_Part()
self.mouse_listener =
mouse.Listener(on_click=self.mouse_part.on_click)
self.bot = Bot()
def on_press(self, key):
if key == keyboard.KeyCode.from_char('a'):
os.system('clear')
menu_print()
self.mouse_listener.start()
if key == keyboard.KeyCode.from_char('s'):
os.system('clear')
menu_print()
self.mouse_listener.stop()
if key == keyboard.KeyCode.from_char('d'):
os.system('clear')
menu_print()
self.mouse_part.show_waypoints()
if key == keyboard.KeyCode.from_char('f'):
os.system('clear')
menu_print()
self.bot.start()
class Bot:
def __init__(self):
self.mouse_part = None
def start(self):
self.mouse_part = Mouse_Part()
if len(self.mouse_part.waypoints) > 0:
for x in self.mouse_part.waypoints:
pyautogui.moveTo(x, duration=0.25)
else:
print('there are no waypoints')
def menu_print():
print('1.To add new waypoints click \'a\' then click at desired
position on the screen\n2.To stop adding new waypoints click
\'s\'\n3.To print waypoints click \'d\'\n4.To start follow
waypoints
click\'f\'\n')
if __name__ == '__main__':
menu_print()
keyboard_part = Keyboard_Part()
with keyboard.Listener(on_press=keyboard_part.on_press) as
listener:
listener.join()
1 ответ
Решение
Ваши путевые точки являются переменными экземпляра - они принадлежат не самому классу, а экземпляру. В Bot.start(..)
вы назначаете новый Mouse_Part()
экземпляр с пустыми путевыми точками для ваших ботов self.mouse_part
переменная.
Fix:
учебный класс
Bot:
def __init__(self):
self.mouse_part = None
def start(self, mouseParts):
# this creates a new Mouse_Part() instance that is empty
# self.mouse_part = Mouse_Part() - replace with given one
self.mouse_part = mouseParts
if len(self.mouse_part.waypoints) > 0:
for x in self.mouse_part.waypoints:
pyautogui.moveTo(x, duration=0.25)
else:
print('there are no waypoints')
keyboard_part = Keyboard_Part()
with keyboard.Listener(on_press=keyboard_part.on_press) as
listener:
listener.join()
когда закончите запись путевых точек:
b = Bot()
# provide the instance of Keyboard_part.mouse_part that was filled
# before to your bot:
b.start(keyboard_part.mouse_part)