首页 文章

结合pyhook在kivy中失去按钮控制

提问于
浏览
0

我在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

dblButton.png

lblButton.png

Record.png

Stop.png

Pause-r.png

1 回答

  • 0

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

相关问题