傻纸 发表于 2019-9-10 11:52:48

使用pywin32在tkinter上画图的问题

本帖最后由 傻纸 于 2019-9-10 11:59 编辑

获得了tkinter的窗口句柄之后,貌似还要捕获tkinter窗口的创建事件(消息)和重绘事件(消息)
因为我直接在tkinter上写绘图的代码是无效的,所以不得不创建一个按钮,通过按钮的回调事件,把图形画出来
from win32gui import *
import win32con
import pywintypes

from tkinter import *

root=Tk()

root.title("tkinterApp")

hwnd = pywintypes.HANDLE(int(root.frame(), 16))

print(hwnd)

hdc=GetDC(hwnd)

def callback():
    hbrush=GetStockObject(win32con.NULL_BRUSH)
    oldbrush=SelectObject(hdc,hbrush)
    Rectangle(hdc,50,50,100,100)

Button(root,text="显示画图",command=callback).pack()
#
#ReleaseDC(hwnd,hdc)

root.geometry("400x400")

#root.mainloop()

这个程序通过点击按钮,画出图形,但是我改变窗口大小的时候,图形就消失了
(我想实现的效果是,tkinter窗口加载完就显示图形,而不需要使用控件的事件回调,窗口刷新的时候,图形还能保持不变)
有熟悉pywin32和tkinter的小伙伴吗,能不能告诉我解决的办法....

塔利班 发表于 2019-9-10 13:17:56

什么无效

傻纸 发表于 2019-9-10 13:46:20

塔利班 发表于 2019-9-10 13:17
什么无效

比方我这样写,它就显示不了...
from win32gui import *
import win32con
import pywintypes
from tkinter import *

root=Tk()

hwnd = pywintypes.HANDLE(int(root.frame(), 16))

hdc=GetDC(hwnd)

hbrush=GetStockObject(win32con.NULL_BRUSH)
oldbrush=SelectObject(hdc,hbrush)
Rectangle(hdc,50,50,100,100)

root.geometry("400x400")

傻纸 发表于 2019-9-10 13:55:43

本帖最后由 傻纸 于 2019-9-10 14:17 编辑

塔利班 发表于 2019-9-10 13:17
什么无效

按理来说,可能也是要写在回调函数里面,就像win32,它也是在回调函数的,窗口重绘消息里面去画图。可能是要怎么捕获到tkinter窗口的重绘消息,然后把绘图的代码加进去。或者要在tk窗口的WM_CREATE消息里面,加入。。。感觉我对tkinter的事件都感到迷惑了,我理解得有点混乱

-----------
我好像又明白了一些,比如
from win32gui import *
import win32con
import pywintypes
from tkinter import *

root=Tk()

hwnd = pywintypes.HANDLE(int(root.frame(), 16))
hdc=GetDC(hwnd)

def callback(event):
    #root.destroy()

    hbrush=GetStockObject(win32con.NULL_BRUSH)
    oldbrush=SelectObject(hdc,hbrush)
    Rectangle(hdc,50,50,100,100)

root.geometry("400x400")

root.bind("<1>",callback)

#root.mainloop()
这样点击鼠标左键画出图。。那应该相当于win32里面的
case WM_LBUTTONDOWN:
{
}

那root窗口重绘事件也应该有,我还没找到...

傻纸 发表于 2019-9-10 14:26:28

我貌似找到解决办法了
from win32gui import *
import win32con
import pywintypes
from tkinter import *

root=Tk()

hwnd = pywintypes.HANDLE(int(root.frame(), 16))
hdc=GetDC(hwnd)

def callback(event):
    root.update()

    hbrush=GetStockObject(win32con.NULL_BRUSH)
    oldbrush=SelectObject(hdc,hbrush)
    Rectangle(hdc,50,50,100,100)

root.geometry("400x400")

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

root.mainloop()

这样感觉就没啥问题

心驰神往 发表于 2020-11-23 08:31:21

顶上去
页: [1]
查看完整版本: 使用pywin32在tkinter上画图的问题