Python3.5, Win32gui, Tkinter. Я не могу получить пиксель с экрана

1

Я пытаюсь сделать макрос с помощью Python 3.5.

Я сделал программу, которая ищет определенный цвет с экрана, а затем щелкните по нему.

Когда я тестировал его только с консольной средой, он работал. Но когда я добавил Tkinter GUI, это не сработает.

Сообщение об ошибке

Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Users\snowscale\AppData\Local\Programs\Python\Python35\lib\tkinter\__init__.py", line 1550, in __call__
    return self.func(*args)
  File "D:/PyCharm/macro/main.py", line 39, in macro
    color = win32gui.GetPixel(dc, x, y)
pywintypes.error: (0, 'GetPixel', 'No error message is available')

Как я могу это решить? Я просто угадываю что-то неправильно с DeviceContext, например, Tkinter root повлиял на него.

Я не нахожусь на Python и GUI. Поэтому я буду рад, если вы поможете мне.

здесь мой код.

import win32api
import win32gui
import win32con
import time
from tkinter import *


Area_Set = { "center_square" : (684, 471, 978, 706), "vertical_rect" : (703, 420, 1022, 838), "horizontal_rect" : (546, 524, 1152, 713), "default" : (747, 485, 1029, 814) }

selectedColor = (13421568, 13172889, 14494037)
avoidColor = (14803425, 16777215, 6908265, 16645629, 14540253, 16711422, 15592941)

clickPos = (1335, 954)
confirmPos = (1128,431)
confirmColor = 16024898
interval_arr = [35, 25, 15, 6]
x_interval = 35


def macro():
    global Area_Set
    global selectedColor
    global avoidColor
    searchArea = Area_Set["center_square"]
    global clickPos
    global confirmPos
    global confirmColor
    global interval_arr
    global x_interval

    print("started")
    while True:
        dc = win32gui.GetDC(win32gui.GetActiveWindow())
        reset = False
        for interval in interval_arr:
            for y in range(searchArea[1], searchArea[3], 8):
                endflag = False
                for x in range(searchArea[0], searchArea[2], interval):
                    color = win32gui.GetPixel(dc, x, y)
                    if color in selectedColor:
                        win32api.SetCursorPos((x, y))
                        time.sleep(0.01)
                        win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0)
                        time.sleep(0.01)
                        win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP, 0, 0, 0, 0)
                        time.sleep(0.01)
                        win32api.SetCursorPos(clickPos)
                        time.sleep(0.01)
                        win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0)
                        time.sleep(0.01)
                        win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP, 0, 0, 0, 0)
                        if win32gui.GetPixel(DC, confirmPos[0], confirmPos[1]) == confirmColor:
                            reset = True
                            win32api.SetCursorPos(confirmPos)
                            time.sleep(0.01)
                            win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0)
                            time.sleep(0.01)
                            win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP, 0, 0, 0, 0)
                        endflag = True
                        break
                if endflag:
                    break
            if endflag:
                break
        if (reset):
            continue
        else:
            break
        win32gui.ReleaseDC(dc)


root = Tk()
btn = Button(root, text="start", command=macro)
btn.pack()
root.wm_attributes("-topmost", 1)
root.mainloop()

Спасибо.

Теги:
python-3.x
tkinter
win32gui

1 ответ

0

Решаемые. Когда я только что изменил

dc = win32gui.GetDC(win32gui.GetActiveWindow())

в

dc = win32gui.getDC(0)

это сработало.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню