【问题标题】:catching CTRL-C and manipulating clipboard data with wxpython使用 wxpython 捕获 CTRL-C 并操作剪贴板数据
【发布时间】:2016-08-24 10:21:35
【问题描述】:

我的 wxpython 应用程序必须在每次用户点击 CTRL-C 时做出响应,无论应用程序框架是否在顶部/可见但未聚焦/最小化/在其他窗口下等。基本上我想知道用户使用 CTRL-C 将某些内容复制到剪贴板组合 - 剪贴板中的其他更改(如鼠标 r-click +“复制”应该被忽略),而不是将数据复制到剪贴板中。这就是为什么我使用 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)

我需要在 2 之前做 3........ :)

不管怎样,代码如下:

import wx
import pyHook
import win32clipboard

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.KeyDown = self.OnKeyboardEvent
        hm.HookKeyboard()

    def OnKeyboardEvent(self,event):
        if event.Ascii == 3:
            win32clipboard.OpenClipboard()
            clipboarditem = win32clipboard.GetClipboardData()
            win32clipboard.CloseClipboard()
            print clipboarditem
            self.basicText.SetValue(clipboarditem)

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

上面代码的第二个问题...在“OnKeyboardEvent”过程的末尾看到这个“打印剪贴板项目”吗?如果我在下一个命令中删除它-“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

这让我大吃一惊:/

【问题讨论】:

  • 但是如果使用鼠标右键然后“复制”?您将如何检测到这一点?
  • 我只对“剪贴板中的 CTRL-C 更改”感兴趣 - 根本不应该检测到鼠标副本
  • wx.python 自带剪贴板功能:wxpython.org/docs/api/wx.Clipboard-class.html

标签: python wxpython clipboard


【解决方案1】:

我花了一段时间才弄明白,但确实做到了!

只需将 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()

【讨论】:

    猜你喜欢
    • 2011-06-28
    • 1970-01-01
    • 2013-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-23
    相关资源
    最近更新 更多