用wxpython捕获CTRLC并操作剪贴板数据

2024-09-30 06:22:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我的wxpython应用程序必须响应每次用户点击CTRL-C,无论应用程序框架是在顶部/可见但未聚焦/最小化/在其他窗口下等等。基本上我想知道用户使用CTRL-C组合复制了一些东西到剪贴板中-剪贴板中的其他更改(如鼠标r-click+“copy”应该被忽略),而不是把数据复制到剪贴板。这就是为什么我使用pyHook,一切似乎都很好,除了。。。“OnkeyboardEvent”中的所有代码似乎都是在CTRL-C执行其“实际工作”(将内容复制到剪贴板)之前执行的,因此每次我都有点“后退一步”:

发生了什么:

1. user hits CTRL-C
2. my "OnKeyboardEvent" code is executed 
3. data is being copied to the clipboard (CTRL-C does its job)

我要做3次。在2…..之前。。。。:)

总之,代码如下:

^{pr2}$

上面代码的第二个错误。。。看到“OnKeyboardEvent”过程末尾的“print clipboarditem”了吗?如果我删除它下一个命令-self.basicText.SetValue(clipboarditem)“停止工作并给出

line 23, in OnKeyboardEvent
self.basicText.SetValue(clipboarditem)
File "C:\Python27\lib\site-packages\wx-3.0-msw\wx\_core.py", line 13075, in SetValue
return _core_.TextEntryBase_SetValue(*args, **kwargs)
TypeError: an integer is required

对我来说真是太棒了:/


Tags: 代码用户incoreself应用程序isline
1条回答
网友
1楼 · 发布于 2024-09-30 06:22:32

我花了一段时间才弄明白,但还是做到了!在

只需将key down事件更改为key up,它就可以工作了。您的回调是在释放CTRL+C时调用的,因此剪贴板已经是正确的,因为CTRL+C已经被处理。在

(还修复了返回的回调True否则我会收到很多异常消息)

import wx
import pyHook
import win32clipboard
import time


class TextFrame(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, None, -1, 'Frame', size=(300, 100))
        panel = wx.Panel(self, -1)
        self.basicText = wx.TextCtrl(panel, -1, "", size=(175, -1))

        self.basicText.SetValue("Press CTRL-C")
        hm = pyHook.HookManager()
        hm.KeyUp = self.OnKeyboardEvent  # key up!!
        hm.HookKeyboard()


    def OnKeyboardEvent(self,event):
        if event.Ascii == 3:
            print("control c released")
            win32clipboard.OpenClipboard()
            clipboarditem = win32clipboard.GetClipboardData()
            win32clipboard.CloseClipboard()
            print("contents "+clipboarditem)
            self.basicText.SetValue(clipboarditem)
        return True

app = wx.PySimpleApp()
frame = TextFrame()
frame.Show()
app.MainLoop()

相关问题 更多 >

    热门问题