2012-06-12 99 views
0

我在嘗試讓WarpPointer適合我時遇到了一些麻煩。我試圖做的場景類似於錄製用戶的點擊,然後在屏幕上重播它們。我能夠無任何問題地記錄屏幕動作和點擊;然而,當我們重播用戶錄製的內容時,我感到非常沮喪。wxpython:將光標設置爲絕對屏幕位置並單擊

def MoveCursorAndClick(self, e): 
    # get the current screen position 
    sp = self.GetPosition() 
    p = self.getNextPosition() # returned in absolute x,y from screen rec 
    self.WarpPointer(p.x - sp[0], p.y - sp[1]) 
    # wx.PostEvent(EVT_LEFT_DOWN, self.GetId()) 

顯然,上面的代碼不正確,因爲WarpPointer出現在窗口,而不是全屏幕範圍內工作。試圖將協調關閉的功能窗口證明是麻煩的,因爲它們總是在Y方向上偏離約50 pix。我目前唯一的假設是,我正在努力做到這一點,因爲我對wxpython的經驗不足,所以我沒有看到更好的結果。

此外,搗毀的PostEvent線是我設法橫跨Google的唯一東西,看起來像將鼠標點擊發送到可能是或可能不是另一個窗口的東西是正確的。這是否是正確的方向?

更新 如下所述,沒有一個很好的跨平臺方式來實現這一點。這是我沒有(發現互聯網上的各種地方):

def ClickScreenPositon(self, x, y): 
    win32api.SetCursorPos((x,y)) 
    win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN,x,y,0,0) 
    win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP,x,y,0,0) 

回答

3

我不認爲你可以在wxPython中獨自做到這一點。正如你發現的那樣,wx.Window.WarpPointer()只能將鼠標移動到由該窗口控制的區域。同樣,你是wx.EVT_LEFT_DOWN調用將無法工作,因爲您將ID設置爲窗口,這意味着它是被點擊的窗口,而不是(x,y)處的點擊。

經過一些輕量級谷歌搜索,我發現this article on Unit Testing in wxPython輕聲談論在GUI級別的測試。這不是你想要做的,但它在概念上是相似的。他們建議使用外部庫來操作界面。他們注意到這種方法的主要問題是,大多數用於模擬GUI交互的工具都受到企業許可證和/或平臺的依賴。

該文章建議對Windows系統使用pywinauto。出於您的目的,pywinauto.controls.HwndWrapper似乎有您需要的方法; MoveMouse()Click()。如果您不使用Windows或需要跨平臺支持,則需要研究不同的庫。

基本上,您將需要安裝pywinauto並將其導入您的wxPython應用程序,並調用其方法而不是wxPython。只要跨平臺兼容性不是問題,我認爲這是您最簡單,最好的解決方案。

+0

我嘗試了這兩種方法,但沒有成功。可悲的是,你是正確的,因爲沒有任何好的X平臺方法來做到這一點。這是我最終做的事情(在互聯網上發現了其他幾個地方): def click(self,x,y): win32api.SetCursorPos((x,y)) win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN,x, y,0,0) win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP,x,y,0,0) – Wyatt

+0

對不起,我忍不住。我很高興你能找到可行的東西,即使它不是跨平臺的。 – acattle

+0

有時候...這只是可悲的方式。但也許一些冒險的程序員將使其未來的使命:) – Wyatt

1

wxPython只有在光標位於wxPython生成的窗口,框架或小部件上時才能控制光標。當你離開你的wxPython應用程序的限制時,它失去了對鼠標的控制。那時你必須掛鉤到操作系統。在Windows上,PyWin32包可能是您最好的選擇。

還有被稱爲sikuli可能的工作太多,如果你能弄清楚如何採取屏幕截圖涼爽的小項目:http://sikuli.org/