Не могу вытащить переменную из функции, которая вызывается из библиотеки Python pynput

Рейтинг: 0Ответов: 2Опубликовано: 11.01.2023

Элемент списка

Есть код , который заносит координаты кликов мыши в список 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 координаты.

Ответы

▲ 0

Зачем Вам вообще глобальная переменная? Можно реализовать так.

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)  # эта строчка не выполнится, т.к, код находится в потоке и продолжает работать
▲ 0

Решил вот так. Вытащил переменную из функции используя клавишу '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