How can I get my current mouse position in pyautogui? - python

So I was making an autotyper but I got stuck i want to find the current location of my mouse (on the search box) so that my program can click on the text box, but i cannot figure out how to get my current mouse X and Y. Any help is accepted!
Here is my code
import pyautogui
def autotyper():
pyautogui.click("textbox") # how can i get my current mouse x and y to put here?
pyautogui.write("text to search")
pyautogui.press("enter")
autotyper()
Thanks!

This function will give you the current X and Y position of your mouse, basically, wherever your mouse is hovering right now it will give you its X, and Y on the screen.
pyautogui.position()

Related

Python - How to stimulate mouse click without moving cursor?

I'm trying to use pyautogui and click at a certain area on my screen, but I want it to click without physically moving my cursor, kind of like an invisible click. So far, I have no idea how to do it, only the typical automate clicking and moving of cursor position to the area.
I used the following:
pyautogui.click(x=100, y=13)
But, it moved the cursor to that specific position instead of sending click. Is there any possible way to do so with pyautogui or any other module ?
import pyautogui
# Get the x and y coordinates of the target location
x = 100
y = 13
# Move the cursor to the target location
pyautogui.moveTo(x, y)
# Simulate a left mouse button down at the target location
pyautogui.mouseDown(button='left', x=x, y=y)
# Simulate a left mouse button up at the target location
pyautogui.mouseUp(button='left', x=x, y=y)
This usually works on the primary monitor. I tested with the right click.
import pyautogui
# Get the size of the primary monitor.
screenWidth, screenHeight = pyautogui.size()
print(screenWidth, screenHeight)
pyautogui.click(100, 200, button='right')
The pyautogui.click() function can simulate a mouse click without moving the cursor. You can use it by specifying the x and y coordinates of the location you want to click.
Here's an example code snippet:
import pyautogui
# Click at position (100, 13)
pyautogui.click(x=100, y=13)
This will simulate a left mouse click at the coordinates (100, 13) on the screen, without moving the cursor. Note that you may need to adjust the coordinates to match the position where you want to click on your specific screen.

Is there a way to record mouse movement and run it via python?

I searched for the answer but nothing comes up. I want to make a script for the game, but i also want to make my mouse movement more unpredictable so i want to record my own mouse movement. Or record macro mouse movement in another program and run it via python maybe? How can i do it?
There is a library called pyautogui which you can download using the pip command in your terminal pip install PyAutoGUI
import pyautogui
a = pyautogui.position()
print(a)
>>> Point(x=1290, y=342)
you can run pyautoqui.position() anytime you want to get the mouse coordinates on the screen or create a loop which repeatedly gets the position of the mouse. In the loop below I added a sleep(0.5) so that it waits a small second jsut to show taht it works since without the sleep function it would run so fast I didn't have time to move my mouse and show that it worked.
import pyautogui
from time import sleep
for i in range(10):
print(pyautogui.position())
sleep(0.5)
>>>Point(x=689, y=540)
>>>Point(x=820, y=503)
>>>Point(x=1122, y=698)
>>>Point(x=528, y=608)
>>>Point(x=1316, y=301)
>>>Point(x=937, y=288)
>>>Point(x=734, y=529)
>>>Point(x=1055, y=310)
>>>Point(x=584, y=763)
>>>Point(x=740, y=298)
To move the mouse use:
>>> pyautogui.moveTo(100, 200) # moves mouse to X of 100, Y of 200.
>>> pyautogui.moveTo(None, 500) # moves mouse to X of 100, Y of 500.
>>> pyautogui.moveTo(600, None) # moves mouse to X of 600, Y of 500.
Here none means to keep the x or y the same.
To move gradually over time use this:
>>> pyautogui.moveTo(100, 200, 2) # moves mouse to X of 100, Y of 200 over 2 seconds
use moveTo to move to a coordinate, you can change moveTo to move and set the pixels to how many pixels you want to move from the current location.

Autoclicker does not activate the window

I wanted to create an autoclicker that would "remember" current position of my mouse pointer, move to specific location on the desktop, perform a double click and then come back to where it was and will do this randomly every 1 to 4 seconds. This way I wanted to achieve an autoclick in a specific place and more or less be able to use my mouse to browse other stuff.
What I want to click is in a different window, it is a program that I leave open visible on one half of my desktop and on the other half I want to do other things. The problem is that auto clicker does not make the program an active window and the click does not work.
import pyautogui
import threading
import random
def makro():
z = random.randint(1,4) #timer set to random value between 1 and 4 seconds
(x, y) = pyautogui.position() #remember current position of mouse pointer
threading.Timer(z, makro).start()
pyautogui.doubleClick(1516, 141) #perform a double click in this location (this clicks do not make the window active and clicks do not work)
pyautogui.moveTo(x, y) #come back to original mouse pointer location
makro()
Thank you for help
I think adding
pyautogui.click(1516, 141) before pyautogui.doubleClick(1516, 141) could activate the window.

How to delay mouse click using python?

I am using pynput based listener to detect and record mouse clicks using python.
def on_click(x, y, button, pressed):
if pressed:
on_release("clicked")
button = str(button).replace("Button.","")
inverted_comma = "'"
button = f"{inverted_comma}{button}{inverted_comma}"
mouse_values = [x, y, button]
macro_writer('click',mouse_values)
#image based click
time.sleep(1)
pyautogui.moveTo(1,1)
time.sleep(2)
x = x-50
y = y-50
im3 = pyautogui.screenshot(r"D:\Library\Project\Project\theautomater\src\macro\prett2.png",region=(x,y, 100 , 100))
I am able to record the coordinates of the mouse. Problem is I want to record the image/icon where the mouse clicks and as you can see the last line, I can do that but it happens AFTER the click.
This creates the problem that the icon is in "clicked" or "hover" state.
The solution I am thinking of implementing is pausing the click function taking screenshot then clicking.
For this, I need to figure out how to delay the mouse click using python. Can anyone suggest something?
The other question on SO, does not work as intended (Delay mouse click 0.5 second), please do not mark as duplicate.

psychopy event based on mouse position

I am setting up a Fitts' law experiment where I would like a participant to click on a start button, move the mouse in a straight line, and then click on a target. After clicking start, if the participant moves their mouse too far up or down in the vertical direction I would like to display a white screen for 30 seconds and accept no input, afterward moving to the next trial.
Currently, no matter what, the experiment is behaving as if I'm moving outside the acceptable range and always executes the if statement.
Here is the code for it that I have right now:
from psychopy import core
start = mouse.isPressedIn(polygon, buttons=[0])
if start==True:
thisExp.addData('starttime',core.getTime())
x, y = mouse.getPos()
mouse.x.append(x)
mouse.y.append(y)
if y>10 or y<-10: #this is the statement that isn't resulting in what I would expect
thisExp.addData('penalty',1)
finish = mouse.isPressedIn(polygon2, buttons=[0])
if finish==True:
thisExp.addData('stoptime',core.getTime())
continueRoutine=False
I haven't figured out everything I need under the nested if statement yet. Right now I am just trying to make sure it works correctly. It never evaluates the if statement as true and never adds the penalty, even though looking at the collected mouse.y list data in the csv file I can see that there were instances where y was outside of whatever range I set.
It appears that mouse position data is being collected as soon as the trial begins, not just after polygon is clicked. However, starttime and stoptime do appear to be based on when polygon and polygon2 are clicked. I'm really not sure what is going on.
UPDATE:
I didn't get notified about Jonas' response until a day later for some reason. I wish I had because it would have put me on the right track a few hours earlier. It's a builder code component.
My code was all running each frame. At the beginning of the routine I added:
checkstart = False
That with the following code each frame solves this particular problem:
start = mouse.isPressedIn(polygon, buttons=[0])
if start==True:
thisExp.addData('starttime',core.getTime())
x, y = mouse.getPos()
mouse.x.append(x)
mouse.y.append(y)
checkstart=True;
if checkstart==True:
if y>10 or y <-10:
thisExp.addData('penalty',1)
finish = mouse.isPressedIn(polygon2, buttons=[0])
if finish==True:
thisExp.addData('stoptime',core.getTime())
continueRoutine=False
I still don't know why mouse position is collected before polygon is clicked but it doesn't actually matter to me. I can match the data for the frame where the mouse was clicked to the position that corresponds to the start button to get the beginning of the mouse path trace.
My code was all running each frame. At the beginning of the routine I added:
checkstart = False
That with the following code each frame solves this particular problem:
start = mouse.isPressedIn(polygon, buttons=[0])
if start==True:
thisExp.addData('starttime',core.getTime())
x, y = mouse.getPos()
mouse.x.append(x)
mouse.y.append(y)
checkstart=True;
if checkstart==True:
if y>10 or y <-10:
thisExp.addData('penalty',1)
finish = mouse.isPressedIn(polygon2, buttons=[0])
if finish==True:
thisExp.addData('stoptime',core.getTime())
continueRoutine=False
I still don't know why mouse position is collected before polygon is clicked but it doesn't actually matter to me. I can match the data for the frame where the mouse was clicked to the position that corresponds to the start button to get the beginning of the mouse path trace.

Categories