使用Python测量两个事件之间的时间(像素颜色变化)会将所有内容冻结几秒钟

使用Python测量两个事件之间的时间(像素颜色变化)会将所有内容冻结几秒钟,python,timer,keyboard,mouse,Python,Timer,Keyboard,Mouse,我为Windows编写了一个非常简单的工具,用于在Python2.7中测量两个事件之间的时间。 具体而言: 用鼠标指向要作为参考的像素,然后按“左控制”键 要启动计时器时,请单击(任意位置) 代码如下: import pyHook, pythoncom import win32api import sys import time from ctypes import windll #from PIL import ImageGrab # alternative solution to windl

我为Windows编写了一个非常简单的工具,用于在Python2.7中测量两个事件之间的时间。 具体而言:

  • 用鼠标指向要作为参考的像素,然后按“左控制”键
  • 要启动计时器时,请单击(任意位置)
  • 代码如下:

    import pyHook, pythoncom
    import win32api
    import sys
    import time
    from ctypes import windll
    #from PIL import ImageGrab # alternative solution to windll
    
    class Timer:
        def __init__ (self):
            pass
    
        def Reset (self):
            self.t = time.clock ()
    
        def Stop (self):
            self.t = time.clock () - self.t
    
        def Get (self):
            return self.t
    
    def GetPixelColor (x, y):
        dc = windll.user32.GetDC (0)
        return windll.gdi32.GetPixel(dc, x, y)
    
    class Test:
        def __init__ (self):
            self.timer = Timer ()
            self.color = -1
            self.ready = False
    
        def OnKbEvent (self, e):
            if e.Key == "Lcontrol":
                self.x, self.y = win32api.GetCursorPos ()
                self.color = GetPixelColor (self.x, self.y)
                self.ready = True
                print ("Control point selected")
                print (self.color)
    
            return True
    
        def OnMouseEvent(self, e):
            if self.ready:
                if e.Message == 513: # mouse left down
                    self.timer.Reset ()
                    while self.color == GetPixelColor (self.x, self.y):
                        time.sleep (0.100)
                    self.timer.Stop ()
                    print "%.5f" % self.timer.Get ()
                    sys.exit ()
    
            return True
    
    t = Test ()
    hm = pyHook.HookManager ()
    hm.KeyDown = t.OnKbEvent
    hm.MouseAllButtonsDown = t.OnMouseEvent
    hm.HookKeyboard ()
    hm.HookMouse ()
    
    pythoncom.PumpMessages ()
    
    该脚本可以工作,但在我的机器(Win7)上比正常情况下需要5秒。 在这期间,一切似乎都冻结了

    有没有关于我做错了什么/如何改进脚本的提示?
    TIA

    注意,对于函数和方法,建议使用带下划线的
    小写字母
    CapWords
    应该为类保留。听起来你想在后台线程上工作。您所体验到的似乎是Windows应用程序的典型情况,它在前台线程上执行了太多操作,导致它暂时停止发送消息。比正常情况下需要5秒多的时间是什么?程序是否正常工作,但会减慢其他程序的速度?它在其他机器上工作吗?它以前工作过吗?不要在函数名和它的
    @BrianLyttle)之间添加空格。有什么解决方法吗?