Search code examples
pythonpynput

pynput - Importing keyboard and mouse


I am having some trouble importing some things from pynput library.

In my code I want use the a python library (pynput) to do some actions in the mouse and in keyboard. When I import just the keyboard or the mouse it works but when importing both at some time it give me some errors.

Here is my code:

from pynput.mouse import Button, Controller
from pynput.keyboard import Key, Controller

from time import sleep

mouse = Controller()
keyboard = Controller()
rock1x = 691
rock1y = 466
rock2x = 548
rock2y = 350
rock3x = 687
rock3y = 234

while (1):
    drop1x = 1183
    drop1y = 325
    drop2x = 1220
    drop2y = 325
    drop3x = 1263
    drop3y = 325
    drop4x = 1303
    drop4y = 325

    for i in range(8):
        sleep(2.5)
        mouse.position = (rock2x,rock2y)
        sleep(0.3)
        mouse.press(Button.left)
        mouse.release(Button.left)
        sleep(2.1)

        mouse.position = (rock3x,rock3y)
        sleep(0.3)

        mouse.press(Button.left)
        mouse.release(Button.left)
        sleep(2.1)

        mouse.position = (rock1x,rock1y)

        sleep(0.2)
        mouse.press(Button.left)
        mouse.release(Button.left)

    for i in range(3):
        keyboard.press(Key.shift)
        for x in range(6):
            mouse.position = (drop1x,drop1y)
            sleep(0.3)
            mouse.press(Button.left)
            mouse.release(Button.left) 
            drop1y=drop1y+35
        for x in range(6):
            mouse.position = (drop2x,drop2y)
            sleep(0.3)
            mouse.press(Button.left)
            mouse.release(Button.left) 
            drop2y=drop2y+35
        for x in range(6):
            mouse.position = (drop3x,drop3y)
            sleep(0.3)
            mouse.press(Button.left)
            mouse.release(Button.left) 
            drop3y=drop3y+35
        for x in range(6):
            mouse.position = (drop4x,drop4y)
            sleep(0.3)
            mouse.press(Button.left)
            mouse.release(Button.left) 
            drop4y=drop4y+35
        keyboard.release(Key.shift)
    sleep(3)

When I run this code the follow error show up:

Traceback (most recent call last):
  File "mining.py", line 29, in <module>
    mouse.press(Button.left)
  File "/home/filipe/.local/lib/python2.7/site-packages/pynput/keyboard/_base.py", line 366, in press
    if resolved.is_dead:
AttributeError: 'NoneType' object has no attribute 'is_dead'

But when I comment the second line:

from pynput.keyboard import Key, Controller

the code runs until:

keyboard.press(Key.shift)

and gives me the error:

Traceback (most recent call last):
  File "mining.py", line 48, in <module>
    keyboard.press(Key.shift)
NameError: name 'Key' is not defined

How should I import from pynput library to use the mouse and keyboard?


Solution

  • I think that the problem is that you are importing two different Controllers.

    The second one (pynput.keyboard.Controller) overrides the first one since it is the last one defined. Therefore, your variable mouse is actually a pynput.keyboard.Controller object and not a pynput.mouse.Controller object like you expected.

    The error happens when you call mouse.press(Button.left) because the Keyboard object is trying to press a Button, which it cannot do (it can only press Keys).

    To fix this, import the modules "generally" using import/as instead of importing "specific" parts of them using from/import:

    import pynput.mouse    as ms
    import pynput.keyboard as kb
    

    This way, you can differentiate between the two controllers:

    mouse    = ms.Controller()
    keyboard = kb.Controller()
    

    Hope this helps – please respond with any feedback!