2016-08-24 24 views
1

無論應用程序框架位於頂部/可見區域,還是未聚焦/最小化/在其他窗口下,我的wxpython應用程序都必須響應每次用戶點擊CTRL-C。基本上我想知道該用戶使用CTRL-C組合將某些內容複製到剪貼板中 - 剪貼板中的其他更改(例如,應該忽略鼠標右鍵單擊+「複製」),而不是將數據複製到剪貼板中。這就是爲什麼我使用pyHook,除非......「OnKeyboardEvent」中的所有代碼似乎都在CTRL-C執行「執行工作」(將任務複製到剪貼板)之前執行,所以一切看起來都很好,所以每次我都會的 「退一步」:捕獲CTRL-C並使用wxpython處理剪貼板數據

會發生什麼:

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() 

Second thi ng上面的代碼錯誤...在「OnKeyboardEvent」過程結束時查看此「打印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

但如果使用使用鼠標右鍵單擊,然後「複製」?你會如何檢測? –

+0

我只對「剪貼板中的CTRL-C更改」感興趣 - 根本不應該檢測到鼠標副本 – ttT

+0

wx.python有自己的剪貼板功能:https://wxpython.org/docs/api/wx.Clipboard- class.html –

回答

1

我花了一段時間來弄明白,但沒有它!

只需更改按鍵事件即可關閉並且工作正常。您的回調函數在釋放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()