I created a graphical user interface that has 3 checkboxes by using the Checkbox class given in tkinter package. I want to retrieve the screen coordinate of each checkbox. I have been trying to use pyautogui.position() to retrieve the coordianates. However, those values seem wrong because when I used those coordinates for the pyautogui engine to click on the box, it did not click. Also it seems that the window contained the checkboxes does not let me to check the boxes, when I was debugging it. What would be other possible ways that I can fix these problems?
from tkinter import * import SpeechToDictation as Std import pyautogui import time def speech_to_dictation(): speech_inst = Std.SpeechToDictation() dictation.append(speech_inst.read_audio()) def user_speech_to_dictation(): main_window = Tk() button = Button(text='Recording') button.pack() # have a while true at here so that when the function executes, it quits out of the loop button.config(command=speech_to_dictation) main_window.mainloop() class Test(Frame): def __init__(self, parent=None, picks=[]): Frame.__init__(self, parent) self.vars = [] self.checkboxes = [] Label(self, text='Lab Works').grid(row=0, padx=10, pady=10) i = 1 for pick in picks: var = IntVar() chk = Checkbutton(self, text=pick, variable=var) chk.grid(row=i, pady=4, padx=10) self.vars.append(var) self.checkboxes.append(chk) i += 1 def state(self): return map((lambda var: var.get()), self.vars) def full_screen(window): width = window.winfo_screenwidth() height = window.winfo_screenheight() window.geometry("%dx%d" % (width, height)) def allstates(): print(list(lng.state())) def make_test(window): full_screen(window=root) window.grid(row=1, column=0) Button(root, text='Quit', command=root.quit).grid(row=10, padx=10, pady=10) Button(root, text='Peek', command=allstates).grid(row=12, padx=10, pady=10) if __name__ == '__main__': # store dictation at dictation[] dictation = [] user_speech_to_dictation() is_string_complete = dictation[0]['text'][:8] if is_string_complete == 'complete': start_time = time.time() # returns number of seconds passed since epoch max_loop_time = 1 # 1 seconds while True: if (time.time() - start_time) >= max_loop_time: root = Tk() lng = Test(root, ['Blood Count', 'Lipid Panel', 'Hemoglobin A1C']) make_test(window=lng) root.state('zoomed') root.update() x_position, y_position = pyautogui.position() print(x_position, y_position) max_loop_time = time.time() - start_time + max_loop_time # Coordinate of each boxes: they seem wrong locations = [(53, 158), (84, 228), (36, 302)] blood_count_string = dictation[0]['text'][9:] if blood_count_string == 'blood count': x_coordinate = locations[0][0] y_coordinate = locations[0][1] pyautogui.click(x_coordinate, y_coordinate) allstates() root.destroy() # quit the program after the window is destroyed if max_loop_time > 2: break
Advertisement
Answer
Here is a quick example of how to get the coordinates and click the checkbutton (simply use .winfo_rootx()
and .winfo_rooty()
):
import tkinter as tk import pyautogui as pag def click_btn(): x = check_btn.winfo_rootx() y = check_btn.winfo_rooty() pag.click(x, y) root = tk.Tk() check_btn = tk.Checkbutton(root, text='This will be clicked in 3 seconds') check_btn.pack() root.after(3 * 1000, click_btn) root.mainloop()