WxPython - 鼠标单击未在GUI上识别

时间:2013-12-16 08:28:07

标签: python wxpython

我是python的新手。我正在尝试根据搜索字符串从youtube收集链接。假设是我想要的链接将是我搜索结果的第一个结果。 我面临的问题是gui上无法识别鼠标点击。它只是移动到x,y坐标但我看不到它被点击了。请帮助我理解为什么无法识别此点击次数。

下面是代码:我在wxpython中创建了一个GUI,我试图点击youtube的搜索栏,然后粘贴搜索字符串,然后点击搜索从第一个结果中获取链接地址。下面的代码是示例代码。在我的实际代码中,搜索字符串将从excel表传递。

   import win32api, win32con
   import win32com.client as win32
   from win32com.client import Dispatch, Constants
   import os
   import time
   import win32clipboard
   import wx
   import wx.html2
   import sys




   x_pad = 0
   y_pad = 0


   def leftClick():
       wx.EVT_LEFT_DOWN
       time.sleep(.1)
       wx.EVT_LEFT_UP
       print "Click."          #completely optional. But nice for debugging purposes.

   def rightClick():
       wx.EVT_RIGHT_DOWN
       time.sleep(.1)
       wx.EVT_RIGHT_UP
       print "Right Click."     #completely optional. But nice for debugging purposes.


   def mousePos(cord):
       win32api.SetCursorPos((x_pad + cord[0], y_pad + cord[1]))

   class URL(wx.Frame):

       def __init__(self, *args, **kw):
           super(URL, self).__init__(*args, **kw) 

           self.InitUI()




       def InitUI(self):   
           pnl = wx.Panel(self)
           sbtn = wx.Button(pnl, label='Start', pos=(850, 560))
           cbtn = wx.Button(pnl, label='Close', pos=(850, 610))
           stdot = wx.TextCtrl(pnl, pos =(400,580),size=(400,80), style=wx.TE_MULTILINE|wx.TE_READONLY|wx.HSCROLL)
           sys.stdout = stdot
           sys.stderr = stdot

           sbtn.Bind(wx.EVT_BUTTON, self.OnStart)
           cbtn.Bind(wx.EVT_BUTTON, self.OnClose)



           brwser = wx.html2.WebView.New(pnl, size = (1280,550), pos = (0,0), url =("http://www.youtube.com/results?search_query=sarabhai+vs+sarabhai+episode+25&sm=3"))        


           self.SetSize((1280, 720))
           self.SetTitle('YouTube URL Grab')
           self.SetPosition((0,0))
           self.Show(True)


       def OnStart(self,e):
           win32clipboard.OpenClipboard()
           win32clipboard.EmptyClipboard()
           win32clipboard.SetClipboardText("Sarabhai vs Sarabhai episode 31") #Sample string for search
           win32clipboard.CloseClipboard()
           mousePos((252, 53))
           leftClick()
           leftClick()
           leftClick()
           rightClick()
           time.sleep(5)
           mousePos((280, 144))
           leftClick()
           time.sleep(5)
           mousePos((755, 53))
           leftClick()
           time.sleep(7)
           mousePos((467, 140))
           rightClick()
           time.sleep(5)
           mousePos((514, 321))
           leftClick()


       def OnClose(self, e):

           self.Close(True) 


   def main():

       ex = wx.App()
       URL(None)
       ex.MainLoop()    


   if __name__ == '__main__':
       main()  

1 个答案:

答案 0 :(得分:1)

名称wx.EVT_LEFT_DOWNwx.EVT_LEFT_UP实际上只是您需要绑定到事件标识的数字不会导致事件发生!请查看docs and demos包中的示例。

基本过程是:

在帧初始化期间将处理程序绑定到您需要处理的事件,这些事件应该是fn(self, evt)类型,并且按照惯例命名为onNameOfEvent,例如def onLeftBtnDown(self, evt)self.Bind(wx.EVT_NAME_OF_EVENT, onNameOfEvent)这些包含您需要响应的事件,evt参数为您提供一个事件对象,其成员依赖于事件类型。事件绑定使用格式__init__,通常在windows {{1}}方法中,(这是绝大多数GUI代码所做的,包括非wx GUI)。< / p>

如果,(更少见),您需要从代码 生成事件 ,而不是仅仅对事件做出反应 您还需要执行以上 ,然后通过声明适当类型的事件对象来创建事件,例如wx.CommandEvent,(请注意,您可以创建自己的事件类型),填充所需的值,然后使用'wx.PostEvent'将其添加到窗口的事件队列或控制它适用于。稍后,当它到达队列的顶部时,将使用此事件调用您的事件处理程序。