2016-08-24 15 views
1

私のwxpythonアプリケーションは、アプリケーションのフレームが上にあるかどうかにかかわらずCTRL-Cを押すたびに応答する必要があります。そのユーザーはCTRL-Cの組み合わせを使用して何かをクリップボードにコピーしました - クリップボードにコピーされたデータを使用するよりもクリップボードの他の変更(マウスのr-クリック+ "コピー"は無視する必要があります)だからこそ私はpyHookを使用していますが、すべてがうまくいくようです...「OnKeyboardEvent」内のすべてのコードは、CTRL-Cが「アクロバールジョブ」(クリップボードにコピーする)の前に実行されているようです。wxpythonを使ってCTRL-Cを捕まえてクリップボードのデータを操作する

何が起こる:

私は2.の前に3を実行する必要があり
1. user hits CTRL-C 
2. my "OnKeyboardEvent" code is executed 
3. data is being copied to the clipboard (CTRL-C does its job) 

を.... :)とにかく

、ここでのコードだ:

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() 
"バック一歩" の

第2位上のコードで間違っています... "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 

を与える:/

+0

(また、コールバックが、私は例外メッセージの多くを得る他Trueを返さ固定)が、使用は、マウスの右クリックを使用している場合は、次に「コピー」?どのようにそれを検出するのですか? –

+0

私は「クリップボードのCTRL-Cの変更」でのみintrestedです - マウスコピーは全く検出されません – ttT

+0

wx.pythonは独自のクリップボード機能を持っています:https://wxpython.org/docs/api/wx.Clipboard- class.html –

答えて

1

はそれを把握するために私に時間がかかりましたが、やりましたそれ!

キーダウンイベントをキーアップに変更するだけで動作します。あなたのコールバックはCTRL + Cがリリースされたときに呼び出されるので、CTRL + Cが処理されてからクリップボードはすでに正しいです。

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() 
関連する問題