想实现用win32 API在tkinter窗口上画图,那么应该先获得tkinter窗口的句柄hwnd,然后再获得tkinter的设备hdc。尝试了FindWindow(),GetActiveWindow(),GetForegroundWindow()这几个函数貌似都不能正确获得tkinter的句柄

后来在stackoverflow上看到一个列子,使用pywintypes.HANDLE(int(root.frame(), 16))才成功。

原例:https://stackoverflow.com/questions/25602986/using-python-tkinter-how-to-smoothly-move-and-resize-the-non-focusable-window

这里我把原例中创建一个non focusable window的tkinter窗口,修改为把窗口设置样式设置为WS_POPUP

import tkinter as tk
import win32api
import win32con
import pywintypes root = tk.Tk() root.geometry("+0+0")
root.lift() hWindow = pywintypes.HANDLE(int(root.frame(), 16)) win32api.SetWindowLong(hWindow,win32con.GWL_STYLE,win32con.WS_POPUP) root.mainloop()

这个窗口风格,类似overrideredirect(1)

我想实现的功能是在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()

解决方法

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

pywin32获得tkinter窗口句柄,并在上面绘图的更多相关文章

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

    上一篇博文获得主窗口句柄使用的是root.frame或者通过子控件调用master.frame方法,但是子控件本身没有frame方法.那么怎么获得子控件的句柄呢?试过了很多办法,想过把Canvas当作 ...

  2. Window 32位 编程总结

    Lesson01 win32 Window 32位 编程 1.Windows编程基础 2.Windows的字符 3.窗口处理 4.消息处理 5.绘图 6.对话框 7.控件 Win32编程: Windo ...

  3. 【原】使用Tkinter绘制GUI并结合Matplotlib实现交互式绘图

    在数据分析的过程中,往往需要对所建立的模型进行可视化,并调整其中的某些参数. 通常情况下,在Python中可以通过Matplotlib来进行绘制图像.然而该绘制过程是静态的,也就是每次调整完参数需要重 ...

  4. GUI tkinter (Canvas)绘图篇

    from tkinter import * root = Tk()root.title("中国象棋棋盘手绘") can = Canvas(root,width = 400, hei ...

  5. VC++绘图时,利用双缓冲解决屏幕闪烁 转载

    最近做中国象棋,绘制界面时遇到些问题,绘图过程中屏幕闪烁,估计都会想到利用双缓冲来解决问题,但查了下网上双缓冲的资料,发现基本是MFC的,转化为VC++后,大概代码如下: void DrawBmp(H ...

  6. python和pywin32实现窗口查找、遍历和点击

    Pywin32是一个Python库,为python提供访问Windows API的扩展,提供了齐全的windows常量.接口.线程以及COM机制等等. 1.通过类名和标题查找窗口句柄,并获得窗口位置和 ...

  7. Tkinter教程之Canvas篇(1)

    本文转载自:http://blog.csdn.net/jcodeer/article/details/1811803 '''Tkinter教程之Canvas篇(1)'''# 提供可以用来进行绘图的Co ...

  8. 调用API函数,在窗口非客户区绘图(通过GetWindowDC获得整个窗口的DC,就可以随意作画了)

    http://hi.baidu.com/3582077/item/77d3c1ff60f9fa5ec9f33754 调用API函数,在窗口非客户区绘图 GDI+的Graphics类里有个FromHdc ...

  9. matlab的绘图保存

      matlab的绘图和可视化能力是不用多说的,可以说在业内是家喻户晓的.Matlab提供了丰富的绘图函数,比如ez**系类的简易绘图函数,surf.mesh系类的数值绘图函数等几十个.另外其他专业工 ...

随机推荐

  1. Java Break 与 Continue

    章节 Java 基础 Java 简介 Java 环境搭建 Java 基本语法 Java 注释 Java 变量 Java 数据类型 Java 字符串 Java 类型转换 Java 运算符 Java 字符 ...

  2. DNS原理和智能DNS及CDN

    CDN是什么 CDN(Content Delivery Network)是内容分发网络. 作用: 使用户可以就近取的所需要的内容,加速用户访问网站资源的速度.物理距离更近,响应速度更快.拦截部分网络请 ...

  3. JS - 对话框

    1,<span onclick="return confirmAct();">执行操作</span> 2, function confirmAct(){ i ...

  4. Linux系统下的/etc/nsswitch.conf文件

    一.什么是nsswithch.conf(服务搜索顺序)文件呢? nsswitch.conf(name service switch configuration,名字服务切换配置)文件位于/etc目录下 ...

  5. pt-query-digest使用详解

    1.语法及重要选项pt-query-digest [OPTIONS] [FILES] [DSN] --create-review-table 当使用--review参数把分析结果输出到表中时,如果没有 ...

  6. Python序列内单双引的问题——未解决

    在学习python基础的时候,遇到这样一个问题: tuple=(2,2.3,"yeah",5.6,False)list=[True,5,"smile"] 这样输 ...

  7. Springboot Bean循环依赖问题

    参考博客原文地址: https://www.jb51.net/article/168398.htm https://www.cnblogs.com/mianteno/p/10692633.html h ...

  8. 打包APK出现org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':app:lintVitalRelease'.

    AndroidS Studio打包APK时出现问题:org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':a ...

  9. yarn调度器 FairScheduler 与 CapacityScheduler

    yarn FairScheduler 与 CapacityScheduler CapacityScheduler(根据计算能力调度) CapacityScheduler 允许多个组织共享整个集群, 每 ...

  10. NumPy 数组切片

    章节 Numpy 介绍 Numpy 安装 NumPy ndarray NumPy 数据类型 NumPy 数组创建 NumPy 基于已有数据创建数组 NumPy 基于数值区间创建数组 NumPy 数组切 ...