结合pyhook在kivy中松开按钮控制
loosing button control in kivy in combination with pyhook
我在 kivy 中有一个小的录音机应用程序,它应该控制屏幕捕获 activity。录音机应用程序应根据录音机的状态显示状态行和录音/暂停按钮。初始顺序是:等待(即等待某些操作 - 按录制按钮)> 设置应用程序(即最终用户应通过鼠标单击将其他应用程序 window 带到前台)> 记录(从鼠标单击捕获屏幕图像)> 暂停或停止。为了触发捕获 activity,我正在使用 pyHook 来读取鼠标事件。但是,一旦 pyHook.HookManager() 被调用,我就失去了对 kivy 记录器应用程序的访问权限,并且无法控制记录过程:未捕获按钮点击,状态行和事件 ID 未更新。我在这里错过了什么?
附上Python代码、kv文件和为方便起见的图像文件。
感谢您的帮助和提前时间。
import os
import pyHook
import pythoncom
from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.core.window import Window
from kivy.properties import StringProperty, NumericProperty
from kivy.clock import Clock
hm = None
recStatus = None
eventListID = 0
class hookHome(BoxLayout):
curevent = NumericProperty()
recpbutton = StringProperty()
stopbutton = StringProperty()
status = StringProperty()
def init_recorder(self):
global recStatus
global eventListID
self.recpbutton = './Record.png'
self.stopbutton = './Stop.png'
self.curevent = eventListID
self.status = 'waiting'
recStatus = 'INIT'
def recording_pause_proc(self):
global recStatus
global hm
if recStatus == 'INIT':
self.recpbutton = './Pause-r.png'
recStatus = 'SETAPPL'
self.status = 'set applic.'
Clock.schedule_once(self.proc_recorder, 0)
elif recStatus == 'RECORD':
self.recpbutton = './Record.png'
recStatus = 'PAUSE'
self.status = 'pause'
hm.UnhookMouse()
hm.UnhookKeyboard()
elif recStatus == 'PAUSE':
self.recpbutton = './Pause-r.png'
recStatus = 'RECORD'
self.status = 'recording'
hm.HookMouse()
hm.HookKeyboard()
elif recStatus == 'SETAPPL':
self.recpbutton = './Pause-r.png'
recStatus = 'RECORD'
self.status = 'recording'
def stop_recorder(self):
hm.UnhookMouse()
hm.UnhookKeyboard()
os._exit(0)
def onMouseEvent(self, event):
global recStatus
if recStatus == 'SETAPPL':
recStatus = 'RECORD'
self.status = 'recording'
elif recStatus == 'RECORD':
print "Capture window..."
return True
def proc_recorder(self, *args):
global hm
hm = pyHook.HookManager()
hm.MouseAllButtonsDown = self.onMouseEvent
hm.HookMouse()
pythoncom.PumpMessages()
class hooktestApp(App):
def build(self):
Window.clearcolor = (1,1,1,1)
Window.size = (180, 55)
homeWin = hookHome()
homeWin.init_recorder()
return homeWin
if __name__ == '__main__':
hooktestApp().run()
和 kv 文件:
<hookHome>:
orientation: "vertical"
BoxLayout:
orientation: 'vertical'
BoxLayout:
orientation: 'horizontal'
height: "15dp"
size_hint_y: None
Label:
canvas.before:
Color:
rgb: 0.7,0.9,1
Rectangle:
pos: self.pos
size: self.size
size_hint: 0.6,1
text: "Recorder"
text_size: self.width -10, self.height
halign: 'left'
valign: 'middle'
font_size: 12
color: .3,.3,.3,1
Label:
canvas.before:
Color:
rgb: 0.7,0.9,1
Rectangle:
pos: self.pos
size: self.size
size_hint: 0.4,1
text: root.status
text_size: self.width-10, self.height
halign: 'right'
valign: 'middle'
font_size: 12
color: .3,.3,.3,1
BoxLayout:
height: "40dp"
size_hint_y: None
orientation: "horizontal"
BoxLayout:
orientation: "vertical"
size_hint: 0.33,1
Label:
canvas.before:
Color:
rgb: 0,.24,.42
Rectangle:
pos: self.pos
size: self.size
size_hint: 1,0.65
text: str(root.curevent)
size: self.texture_size
halign: 'center'
valign: 'middle'
font_size: 16
color: 1,1,1,1
Label:
canvas.before:
Color:
rgb: 0,.24,.42
Rectangle:
pos: self.pos
size: self.size
size_hint: 1,0.35
#text: root.curevent
text: 'Event'
size: self.texture_size
halign: 'center'
valign: 'middle'
font_size: 14
color: 1,1,1,1
Button:
size_hint: 0.33,1
background_normal: './dblButton.png'
background_down: './lblButton.png'
on_press: root.recording_pause_proc()
Image:
source: root.recpbutton
center_x: self.parent.center_x
center_y: self.parent.center_y
Button:
size_hint: 0.33,1
background_normal: './dblButton.png'
background_down: './lblButton.png'
on_press: root.stop_recorder()
Image:
source: root.stopbutton
center_x: self.parent.center_x
center_y: self.parent.center_y
仅作记录,将 pumpmessages 和 pyhook 与 Kivy 架构混用可能不是一个好主意。所以我将实际的录音功能分离到一个单独的进程中,其中 kivy 应用程序(通过 kivy 按钮控制录音机)和录音机之间的状态处理通过双向队列进行通信。
我在 kivy 中有一个小的录音机应用程序,它应该控制屏幕捕获 activity。录音机应用程序应根据录音机的状态显示状态行和录音/暂停按钮。初始顺序是:等待(即等待某些操作 - 按录制按钮)> 设置应用程序(即最终用户应通过鼠标单击将其他应用程序 window 带到前台)> 记录(从鼠标单击捕获屏幕图像)> 暂停或停止。为了触发捕获 activity,我正在使用 pyHook 来读取鼠标事件。但是,一旦 pyHook.HookManager() 被调用,我就失去了对 kivy 记录器应用程序的访问权限,并且无法控制记录过程:未捕获按钮点击,状态行和事件 ID 未更新。我在这里错过了什么?
附上Python代码、kv文件和为方便起见的图像文件。 感谢您的帮助和提前时间。
import os
import pyHook
import pythoncom
from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.core.window import Window
from kivy.properties import StringProperty, NumericProperty
from kivy.clock import Clock
hm = None
recStatus = None
eventListID = 0
class hookHome(BoxLayout):
curevent = NumericProperty()
recpbutton = StringProperty()
stopbutton = StringProperty()
status = StringProperty()
def init_recorder(self):
global recStatus
global eventListID
self.recpbutton = './Record.png'
self.stopbutton = './Stop.png'
self.curevent = eventListID
self.status = 'waiting'
recStatus = 'INIT'
def recording_pause_proc(self):
global recStatus
global hm
if recStatus == 'INIT':
self.recpbutton = './Pause-r.png'
recStatus = 'SETAPPL'
self.status = 'set applic.'
Clock.schedule_once(self.proc_recorder, 0)
elif recStatus == 'RECORD':
self.recpbutton = './Record.png'
recStatus = 'PAUSE'
self.status = 'pause'
hm.UnhookMouse()
hm.UnhookKeyboard()
elif recStatus == 'PAUSE':
self.recpbutton = './Pause-r.png'
recStatus = 'RECORD'
self.status = 'recording'
hm.HookMouse()
hm.HookKeyboard()
elif recStatus == 'SETAPPL':
self.recpbutton = './Pause-r.png'
recStatus = 'RECORD'
self.status = 'recording'
def stop_recorder(self):
hm.UnhookMouse()
hm.UnhookKeyboard()
os._exit(0)
def onMouseEvent(self, event):
global recStatus
if recStatus == 'SETAPPL':
recStatus = 'RECORD'
self.status = 'recording'
elif recStatus == 'RECORD':
print "Capture window..."
return True
def proc_recorder(self, *args):
global hm
hm = pyHook.HookManager()
hm.MouseAllButtonsDown = self.onMouseEvent
hm.HookMouse()
pythoncom.PumpMessages()
class hooktestApp(App):
def build(self):
Window.clearcolor = (1,1,1,1)
Window.size = (180, 55)
homeWin = hookHome()
homeWin.init_recorder()
return homeWin
if __name__ == '__main__':
hooktestApp().run()
和 kv 文件:
<hookHome>:
orientation: "vertical"
BoxLayout:
orientation: 'vertical'
BoxLayout:
orientation: 'horizontal'
height: "15dp"
size_hint_y: None
Label:
canvas.before:
Color:
rgb: 0.7,0.9,1
Rectangle:
pos: self.pos
size: self.size
size_hint: 0.6,1
text: "Recorder"
text_size: self.width -10, self.height
halign: 'left'
valign: 'middle'
font_size: 12
color: .3,.3,.3,1
Label:
canvas.before:
Color:
rgb: 0.7,0.9,1
Rectangle:
pos: self.pos
size: self.size
size_hint: 0.4,1
text: root.status
text_size: self.width-10, self.height
halign: 'right'
valign: 'middle'
font_size: 12
color: .3,.3,.3,1
BoxLayout:
height: "40dp"
size_hint_y: None
orientation: "horizontal"
BoxLayout:
orientation: "vertical"
size_hint: 0.33,1
Label:
canvas.before:
Color:
rgb: 0,.24,.42
Rectangle:
pos: self.pos
size: self.size
size_hint: 1,0.65
text: str(root.curevent)
size: self.texture_size
halign: 'center'
valign: 'middle'
font_size: 16
color: 1,1,1,1
Label:
canvas.before:
Color:
rgb: 0,.24,.42
Rectangle:
pos: self.pos
size: self.size
size_hint: 1,0.35
#text: root.curevent
text: 'Event'
size: self.texture_size
halign: 'center'
valign: 'middle'
font_size: 14
color: 1,1,1,1
Button:
size_hint: 0.33,1
background_normal: './dblButton.png'
background_down: './lblButton.png'
on_press: root.recording_pause_proc()
Image:
source: root.recpbutton
center_x: self.parent.center_x
center_y: self.parent.center_y
Button:
size_hint: 0.33,1
background_normal: './dblButton.png'
background_down: './lblButton.png'
on_press: root.stop_recorder()
Image:
source: root.stopbutton
center_x: self.parent.center_x
center_y: self.parent.center_y
仅作记录,将 pumpmessages 和 pyhook 与 Kivy 架构混用可能不是一个好主意。所以我将实际的录音功能分离到一个单独的进程中,其中 kivy 应用程序(通过 kivy 按钮控制录音机)和录音机之间的状态处理通过双向队列进行通信。