Python 2.7带有gtk的getPixel函数的奇怪行为

时间:2017-04-11 21:27:03

标签: python python-2.7 gtk gdk

我的代码中的pixel_at函数有问题。以下是所有必要的代码片段。

这是我的助手模块:

import gtk.gdk
def pixel_at(x, y):
    gtk.gdk
    rw = gtk.gdk.get_default_root_window()
    pixbuf = gtk.gdk.Pixbuf(gtk.gdk.COLORSPACE_RGB, False, 8, 1, 1)
    pixbuf = pixbuf.get_from_drawable(rw, rw.get_colormap(), x, y, 0, 0, 1, 1)
    return tuple(pixbuf.pixel_array[0, 0])

这是用于初始化的Controller类:

 import Sensors as sensor
 import Scanner as sc
 import pyautogui
 import time


class GameController(object):
    COLOR_DINOSAUR = (83, 83, 83)

    def __init__(self):
        self.offset = (230, 270) #hardcoded Offset 
        self.width = 600 # hardcoded but alwways the same

        # Stores points (jumps)
        self.points = 0

        #Listeners
        self.onGameEnd = None
        self.onGameStart = None
        self.onSensorData = None

        #Game State
        self.gameState = 'OVER'

        self.sensor = sensor.Sensors()
        self.Scanner = sc.Scanner()

这是我的主要功能:

import pyautogui
import Helper
import GameController as GC

def main():
     print Helper.pixel_at(25, 5)
     Controller = GC.GameController()
     # Just test values for this function
     Controller.Scanner.scanUntil([75, 124], 
                             (-2, 0),
                             (83, 83, 83),
                             75 / 2)

以下是扫描仪的代码:

import pyautogui
import Helper

 def scanUntil(self, start, step, matchColor, iterLimit):
    iterations = 0
    current = self.makeInBounds(start)

    if step[X] == 0 and step[Y] == 0:
        return None

    while not self.isOutOfBound(current):
        color = Helper.pixel_at(current[X], current[Y])
        # to slow color = pyautogui.pixel(current[X], current[Y])
        if color == matchColor: # Tuple comparison
            return current

        current[X] += step[X]
        current[Y] += step[Y]
        iterations += 1
        if iterations > iterLimit:
            return None

    return None

扫描程序中的这一行color = Helper.pixel_at(current[X], current[Y])会引发错误:Fatal IO error 0 (Success) on X server :0.但是print Helper.pixel_at(25, 5)中的main()调用会返回正确的RGB元组。

错误在pixbuf = pixbuf.get_from_drawable(rw, rw.get_colormap(), x, y, 0, 0, 1, 1)的{​​{1}}处抛出,所以我认为这与此有关。

http://www.pygtk.org/pygtk2reference/class-gdkpixbuf.html#method-gdkpixbuf--get-from-drawable的文档中我得到了这样的线索:换句话说,将图像数据从服务器端可绘制复制到客户端RGB(A)缓冲区。

但我不明白这个服务器端和客户端,为什么它在我的第一次打印电话中工作但不适用于pixel_at(x,y)

0 个答案:

没有答案