wxPython:全局热键循环切换

时间:2011-09-27 01:54:52

标签: python wxpython

我正在尝试创建一个热键切换(f12),按下一次将打开一个循环,然后再次按下时关闭该循环。切换时,每隔0.5秒单击一次鼠标。我在wxpython网站上找到了一个热键的配方,我可以让循环打开,但无法想办法让它关闭。我尝试创建一个单独的密钥,将其关闭但没有成功。 鼠标模块模拟1鼠标左键单击。

这是我目前的代码:

导入wx,win32con,鼠标

从时间导入睡眠

class Frameclass(wx.Frame):

    def __init__(self, parent, title):
            super(Frameclass, self).__init__(parent, title=title, size=(400, 200))
            self.Centre()
            self.Show()
            self.regHotKey()
            self.Bind(wx.EVT_HOTKEY, self.handleHotKey, id=self.hotKeyId)
            self.regHotKey2()
            self.Bind(wx.EVT_HOTKEY, self.handleHotKey2, id=self.hotKeyId2)
    def regHotKey(self):
            """
            This function registers the hotkey Alt+F12 with id=150
            """
            self.hotKeyId = 150
            self.RegisterHotKey(self.hotKeyId,win32con.MOD_ALT, win32con.VK_F12)#the key to watch for


    def handleHotKey(self, evt):
            loop=True
            print('clicks on')
            while loop==True:
            #simulated left mouse click
                 mouse.click()
                 sleep(0.50)

                 x=self.regHotKey2()
                 print(x)
                 if x==False:
                         print('Did it work?')
                         break
            else:
                 pass

---------------------第二个按键热键--------

    def regHotKey2(self):
            self.hotKeyId2 = 100
            self.RegisterHotKey(self.hotKeyId2,win32con.MOD_ALT, win32con.VK_F11)

    def handleHotKey2(self, evt):
            return False
            loop=False
            print(loop)

如果名称 =='主要':

showytitleapp=wx.App()
#gotta have one of these in every wxpython program apparently
Frameclass(None, title='Rapid Clicks')
showytitleapp.MainLoop()
#infinite manloop for catching all the program's stuff

2 个答案:

答案 0 :(得分:1)

您的loop变量位于handleHotKey内的本地范围内。由于regHotKey2绑定到handleHotKey2,这是一个不同的侦听器,因此它生成的事件永远不会影响handleHotKey中的循环。除此之外,handleHotKey2的第一行是一个返回值,它将在执行以下两行之前退出该函数。

出于好奇,x=self.regHotKey2(); print(x)会产生什么输出?

尝试在类级别而不是函数级别定义循环变量 -

def __init__(self, parent, title):
    ... your original stuff ...
    self.clicker_loop = False

然后在处理程序中修改 循环 -

def handleHotKey(self, evt):
    self.clicker_loop = True
    while self.clicker_loop:
        ... do the thing ...

def handleHotKey2(self, evt):
    self.clicker_loop = False

请尝试这个并告诉我这是否有效。

也许这会从相同的热键切换循环...

def handleHotKey(self, evt):
    if self.clicker_loop:
        self.clicker_loop = False
    else:
        self.clicker_loop = True

答案 1 :(得分:1)

我将这些模块添加到导入中:

subprocess,signal,sys

在我的课下,我添加了这些


def init(self, parent, title):
    self.clicker_loop = False
    self.PID=1

def openClicker(self,event): self.PID=subprocess.Popen([sys.executable, "123.py"])

我必须导入sys并将sys.executable添加到我的popen中,否则每次尝试打开另一个python程序时都会出错。


    def handleHotKey(self, evt):
        if self.clicker_loop:
            self.clicker_loop = False
            print(self.clicker_loop)
            self.PID.terminate()
        else:
            self.clicker_loop = True
            print(self.clicker_loop)
            self.openClicker(self)

我使用self.PID.terminate()终止被调用的循环过程,否则它会打开单独的123.py循环文件。

单独的123.py文件包含以下代码:


import mouse
from time import sleep

while True: mouse.click() sleep(1)

这基本上做的是在按下热键时调用带有子进程模块的单独python文件,然后在再次按下热键时终止该进程。谢谢你的帮助。