Не могу вытащить переменную из функции, которая вызывается из библиотеки Python pynput
Элемент списка
Есть код , который заносит координаты кликов мыши в список w . Нужно вытащить w из функции в глобальную область. Пробовал объявлять w как global, но не работает. Оборачивал в другую функцию, не работает. Пробовал через дополнительный параметр w=[0] таким образом on_click(x, y, button, pressed, w=[0]), тоже не работает. Как это сделать, может кто знает? Нужно передать значения из w в другой участок кода. Вообще возможно ли вытащить w из потока ?
from pynput import mouse
w=[]
def on_click(x, y, button, pressed):
global w
if pressed and button == mouse.Button.left:
w.append([x,y])
print(f'Координаты {(x,y)}')
print(w)
print(len(w))
return w
with mouse.Listener( on_click = on_click) as listener:
listener.join()
print(w) # здесь w невидима
Изменил код немного:
from pynput import mouse
w=[]
def on_click(x, y, button, pressed):
global w
if pressed and button == mouse.Button.left:
w.append([x,y])
print(f'Координаты {(x,y)}')
print(w)
print(len(w))
if len(w)==4:
listener.stop()
return w
listener = mouse.Listener(on_click=on_click )
listener.start()
print(w) # здесь печатает пустой список [] , т.к в самом начале w
#пустой. После четырёх кликов, w имеет 4 координаты.
# как получить эти координаты , условно на 154 -й строке кода,
# если допустить, что код длинный ?
Поток после 4 кликов прерывается. В консоле, если нажать на w можно видеть что переменной w присвоились все 4 координаты.
Ответы (2 шт):
Зачем Вам вообще глобальная переменная? Можно реализовать так.
from pynput import mouse
w = []
def on_click(x, y, button, pressed):
if pressed and button == mouse.Button.left
w.append([x,y])
print(f'Координаты {(x,y)}')
print(w)
print(len(w))
with mouse.Listener( on_click = on_click) as listener:
listener.join()
print(w) # эта строчка не выполнится, т.к, код находится в потоке и продолжает работать
Решил вот так. Вытащил переменную из функции используя клавишу 'm'
import keyboard
from pynput import mouse
# pause() функция останавливает поток пока не нажмешь клавишу 'm'
def pause():
while True: # запуск прослушивателя клавиатуры
if keyboard.read_key() == 'm':
break
print(" перед паузой")
w=[]
#print(mouse_2.position)
def tutu(x, y, button, pressed):
#global w
if pressed and button == mouse.Button.left :
w.append([x,y])
print(w)
q= mouse.Listener(on_move=None , on_click= tutu , on_scroll=None)
q.start()
pause() #здесь поток прерывается до нажатия 'm'
q.stop() #здесь остановка прослушивателя мыши
print("После паузы после нажатия клавиши 'm' ")
print(w) # здесь вытаскиваем w из функции tutu