0

我在 kivy 中有一个小型记录器应用程序,它应该控制屏幕捕获活动。录音机应用程序应根据录音机的状态显示状态行和录音/暂停按钮。初始顺序是:等待(即等待某些操作- 按下rec 按钮)> 设置应用程序(即最终用户应通过鼠标单击将其他应用程序窗口置于前台)> 录制(通过鼠标单击捕获屏幕图像)> 暂停或停止。为了触发捕获活动,我使用 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

dblButton.png

lblButton.png

记录.png

停止.png

暂停-r.png

4

1 回答 1

0

只是为了记录,将 pumpmessages 和 pyhook 与 Kivy 架构混为一谈可能不是一个好主意。因此,我将实际录制功能分离到一个单独的进程中,其中 kivy 应用程序(通过 kivy 按钮控制录制器)和录制器之间的状态处理通过双向队列进行通信。

于 2016-02-24T21:07:46.617 回答