Skip to content
Advertisement

How to get the coordinate of a checkbox created by tkinter package on a screen

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()
User contributions licensed under: CC BY-SA
7 People found this is helpful
Advertisement