Retrieve x coordinate of left bound of upcoming stimulus sentence
I'm preparing an eye-tracking experiment, for which I have included stimulus sentences that are randomly presented from an item in the file pool (i.e., a canvas which contains a text element with "[Sentence]"). Is it possible to retrieve the x coordinate of the left boundary of each upcoming sentence within a trial sequence so that I can make the fixation dot that precedes the sentence appear at the start of the sentence?
I know where I can find where to set the x coordinates in the script, but I can't find a function that extracts the x coordinate of the to-be-presented stimulus.
Comments
Found a temporary fix by calculating the width in pixels of each stimulus, and consequently using an in-line script to create a canvas with a fixdot element where I input the x coordinates as the negative width in pixels of the upcoming stimulus. For some reason this makes the fixdot appear slightly left of the upcoming sentence, but at least it is better than having a fixation dot in the middle.
The code I used to make this work is as follows (in case anyone else would like to achieve something similar):
import ctypes def GetTextDimensions(text, points, font): class SIZE(ctypes.Structure): _fields_ = [("cx", ctypes.c_long), ("cy", ctypes.c_long)] hdc = ctypes.windll.user32.GetDC(0) hfont = ctypes.windll.gdi32.CreateFontA(points, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, font) hfont_old = ctypes.windll.gdi32.SelectObject(hdc, hfont) size = SIZE(0, 0) ctypes.windll.gdi32.GetTextExtentPoint32A(hdc, text, len(text), ctypes.byref(size)) ctypes.windll.gdi32.SelectObject(hdc, hfont_old) ctypes.windll.gdi32.DeleteObject(hfont) return (size.cx, size.cy) size = GetTextDimensions([Sentence][0], 20, "Droid Sans Mono")I have found a workaround using a code snippet to retrieve the pixel width of the upcoming stimulus, and then using the negative width as the x coordinate for the fixdot object. This makes the fixdot appear somewhat to the left of the upcoming sentence (not entirely sure why yet), but at least this is better than having it appear in the middle.
The code I used for this is as follows:
import ctypes def GetTextDimensions(text, points, font): class SIZE(ctypes.Structure): _fields_ = [("cx", ctypes.c_long), ("cy", ctypes.c_long)] hdc = ctypes.windll.user32.GetDC(0) hfont = ctypes.windll.gdi32.CreateFontA(points, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, font) hfont_old = ctypes.windll.gdi32.SelectObject(hdc, hfont) size = SIZE(0, 0) ctypes.windll.gdi32.GetTextExtentPoint32A(hdc, text, len(text), ctypes.byref(size)) ctypes.windll.gdi32.SelectObject(hdc, hfont_old) ctypes.windll.gdi32.DeleteObject(hfont) return (size.cx, size.cy) size = GetTextDimensions([Sentence], 20, "Droid Sans Mono") xfix = size[0] * -1 my_canvas = Canvas() my_canvas.fixdot(x = xfix, color = 'yellow') my_canvas.show() clock.sleep(1000)Managed to find a workaround in which I extract the width of the sentence stimulus in pixels, so that I can set that as the negative x coordinate of the fixdot. This allows the fixdot to appear slightly to the left of the upcoming sentence stimulus.
The code for this is as follows (in case anyone else might need something similar in the future):
import ctypes def GetTextDimensions(text, points, font): class SIZE(ctypes.Structure): _fields_ = [("cx", ctypes.c_long), ("cy", ctypes.c_long)] hdc = ctypes.windll.user32.GetDC(0) hfont = ctypes.windll.gdi32.CreateFontA(points, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, font) hfont_old = ctypes.windll.gdi32.SelectObject(hdc, hfont) size = SIZE(0, 0) ctypes.windll.gdi32.GetTextExtentPoint32A(hdc, text, len(text), ctypes.byref(size)) ctypes.windll.gdi32.SelectObject(hdc, hfont_old) ctypes.windll.gdi32.DeleteObject(hfont) return (size.cx, size.cy) size = GetTextDimensions([Sentence], 20, "Droid Sans Mono") xfix = size[0] * -1 my_canvas = Canvas() my_canvas.fixdot(x = xfix, color = 'yellow') my_canvas.show() clock.sleep(1000)Thanks for sharing!