Python3.5、Win32gui、Tkinter。我无法从屏幕获取 Pixel

Posted

技术标签:

【中文标题】Python3.5、Win32gui、Tkinter。我无法从屏幕获取 Pixel【英文标题】:Python3.5, Win32gui, Tkinter. I can't get Pixel from screen 【发布时间】:2018-06-20 20:17:13 【问题描述】:

我正在尝试使用 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()

【问题讨论】:

【参考方案1】:

解决了。当我刚改变时

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

dc = win32gui.getDC(0)

成功了。

【讨论】:

以上是关于Python3.5、Win32gui、Tkinter。我无法从屏幕获取 Pixel的主要内容,如果未能解决你的问题,请参考以下文章

python win32gui模块下载

如何使用“pip”安装“win32gui”?

win32gui:如何获取窗口的状态栏文本?

win32gui.FindWindow 找不到窗口

win32gui findwindow 不工作 win7

Win32::GUI 更新托盘图标不起作用