Последователь путевых точек получает пустую коллекцию путевых точек из экземпляра класса - PullRequest
0 голосов
/ 03 сентября 2018

Я пишу простой путевой точки, и я столкнулся с проблемой. Все идет гладко (это означает добавление новых путевых точек и их отображение работает), пока я не хочу "начать следовать". Если я хочу, чтобы этот список путевых точек вел себя так, как если бы он был пустым («путевых точек нет»), но если я хочу отобразить их, все выглядит нормально. Я не знаю, что мне делать.

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 Ответ

0 голосов
/ 03 сентября 2018

Ваши путевые точки являются переменными экземпляра - они принадлежат не самому классу, а экземпляру. В 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)
...