我在kivy有一个小型录音机应用程序,它应该控制屏幕捕获活动 . 录像机应用程序应根据录像机的状态显示状态行和录制/暂停按钮 . 初始序列为:等待(即等待某些操作 - 按录制按钮)>设置应用程序(即最终用户应通过鼠标单击将其他应用程序窗口置于前台)>录制(从鼠标单击捕获屏幕图像)>暂停或停止 . 要触发捕获活动,我使用pyHook来读取鼠标事件 . 但是,一旦调用了pyHook.HookManager(),我就无法访问kivy Logger 应用程序而无法控制记录过程:未捕获按钮单击,状态行和事件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
1 回答
仅仅为了记录,将pumpmessages和pyhook与Kivy架构混合起来可能不是一个好主意 . 因此,我将实际录制功能分离为一个单独的过程,其中kivy应用程序(通过kivy按钮的录像机控制)和录像机之间的状态处理通过双向队列进行通信 .