上一篇博文获得主窗口句柄使用的是root.frame或者通过子控件调用master.frame方法,但是子控件本身没有frame方法。那么怎么获得子控件的句柄呢?试过了很多办法,想过把Canvas当作tkinter子窗口,最后效果都不理想,最后无意看到有人用winfo_id()方法获得主窗口的句柄,而尝试去获得子窗口的句柄也可以。
所以把上一篇博文的代码修改了一下,实现使用win32在tkinter的canvas画布上画画
from win32gui import *
importwin32conimportpywintypesfrom tkinter import *root=Tk()
cv=Canvas(root,bg="white")
cv.pack(fill=BOTH,expand=1)
hwnd=cv.winfo_id()
hdc=GetDC(hwnd)
hbrush=GetStockObject(win32con.NULL_BRUSH)
oldbrush=SelectObject(hdc,hbrush)
cv.update()
Rectangle(hdc,50,50,100,100)defcallback(event):
cv.update()
Rectangle(hdc,50,50,100,100)
cv.bind("",callback)
root.geometry("400x400")#root.mainloop()
cv.mainloop()
当然这个程序是测试性质的,没有绑定窗口销毁消息释放环境设备等。另外还有一个要注意的是,类似于窗口重绘,但是在这个程序里,虽然为canvas绑定了事件,但是拖动改变窗口的大小,是改变了主窗口root的大小,所以这里把canvas设置为填充整个主窗口
---------------------
用pywin32获得tkinter窗口句柄,实现在上面绘图,其目的是,我试图找到一种利用python学习opengl的方法。我手里的几个opengl教程都是基于windows窗口的c/c++程序。那么我或许可以试着使用win32函数和一般的python函数,在tkinter窗口上使用opengl库。