Hi. I am an A-level student studying computer science. I have taken it upon
myself to learn python. It is now my weapon of choice. I have had a problem
trying to creating a clipboard monitor in Windows(XP,Vista) that is linked to a
tkinter GUI. I have a perfectly good code for clipboard monitoring, but as soon
as it is linked to a tkinter gui, the gui locks when a WM.DRAWCLIPBOARD message
is recieved. I am at the point of giving up. If anyone can help or offer an
alternativethat is not pollingI would be very happy. Thanks. Peter
import win32ui, win32clipboard, win32con, win32api, win32gui
from Tkinter import *
def paste():
win32clipboard.OpenClipboard(0)
data = win32clipboard.GetClipboardData()
win32clipboard.CloseClipboard()
return data
class ClipRecord(object):
def __init__(self):
self.gui = Tk()
self.hPrev = 0
self.first = True
self.win = win32ui.CreateFrame()
self.win.CreateWindow(None,'',win32con.WS_OVERLAPPEDWINDOW)
self.win.HookMessage(self.OnDrawClipboard,win32con.WM_DRAWCLIPBOARD)
self.win.HookMessage(self.OnChangeCBChain,win32con.WM_CHANGECBCHAIN)
self.win.HookMessage(self.OnDestroy,win32con.WM_DESTROY)
try:
self.hPrev=win32clipboard.SetClipboardViewer(self.win.GetSafeHwnd())
except win32api.error, err:
if win32api.GetLastError () == 0:
# information that there is no other window in chain
pass
else:
raise
self.l = Label(self.gui,text="I have losted the will to live")
self.l.pack()
self.gui.mainloop()
def OnChangeCBChain(self, *args):
msg, wParam, lParam = args[-1][1:4]
if self.hPrev == wParam:
# repair the chain
self.hPrev = lParam
if self.hPrev:
# pass the message to the next window in chain
win32api.SendMessage (self.hPrev, msg, wParam, lParam)
def OnDrawClipboard(self, *args):
msg, wParam, lParam = args[-1][1:4]
if self.first:
self.first = False
else:
self.l["text"] = "Lord be Praised"
print paste()
if self.hPrev:
# pass the message to the next window in chain
win32api.SendMessage (self.hPrev, msg, wParam, lParam)
def OnDestroy(self):
if self.hPrev:
win32clipboard.ChangeClipboardChain(self.win.GetSafeHwnd(),self.hPrev)
else:
win32clipboard.ChangeClipboardChain(self.win.GetSafeHwnd(),0)
if __name__ == "__main__":
cr = ClipRecord()
___
Yahoo! Answers - Got a question? Someone out there knows the answer. Try it
now.
http://uk.answers.yahoo.com/ --
http://mail.python.org/mailman/listinfo/python-list