pywin32获得tkinter的Canvas窗口句柄,并在上面绘图

上一篇博文获得主窗口句柄使用的是root.frame或者通过子控件调用master.frame方法,但是子控件本身没有frame方法。那么怎么获得子控件的句柄呢?试过了很多办法,想过把Canvas当作tkinter子窗口,最后效果都不理想,最后无意看到有人用winfo_id()方法获得主窗口的句柄,而尝试去获得子窗口的句柄也可以。

所以把上一篇博文的代码修改了一下,实现使用win32在tkinter的canvas画布上画画

from win32gui import *
import win32con
import pywintypes
from 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)

def callback(event):
    cv.update()
    Rectangle(hdc,50,50,100,100)


cv.bind("<Configure>",callback)

root.geometry("400x400")
#root.mainloop()
cv.mainloop()

pywin32获得tkinter的Canvas窗口句柄,并在上面绘图

当然这个程序是测试性质的,没有绑定窗口销毁消息释放环境设备等。另外还有一个要注意的是,<Configure>类似于窗口重绘,但是在这个程序里,虽然为canvas绑定了<Configure>事件,但是拖动改变窗口的大小,是改变了主窗口root的大小,所以这里把canvas设置为填充整个主窗口

---------------------

用pywin32获得tkinter窗口句柄,实现在上面绘图,其目的是,我试图找到一种利用python学习opengl的方法。我手里的几个opengl教程都是基于windows窗口的c/c++程序。那么我或许可以试着使用win32函数和一般的python函数,在tkinter窗口上使用opengl库。

 

pywin32获得tkinter的Canvas窗口句柄,并在上面绘图

上一篇:C# 格式化百分比


下一篇:Windows安装程序遇到错误:0x80240037