内存泄漏/Python windows 7截图

2024-05-01 21:55:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我在双监视器系统(Windows7)上尝试了以下Python代码来反复保存屏幕截图。 它会产生33个14.6MB(总计482MB)的快照,然后崩溃。通过使用processexplorer检查,我可以看到使用的内存量增加到大约500MB。在

我的问题是如何阻止内存泄漏?在

import win32gui, win32ui, win32con, win32api
import time
import os


def my_capture(file_name):
    hwin = win32gui.GetDesktopWindow()
    width = win32api.GetSystemMetrics(win32con.SM_CXVIRTUALSCREEN)
    height = win32api.GetSystemMetrics(win32con.SM_CYVIRTUALSCREEN)
    left = win32api.GetSystemMetrics(win32con.SM_XVIRTUALSCREEN)
    top = win32api.GetSystemMetrics(win32con.SM_YVIRTUALSCREEN)
    hwindc = win32gui.GetWindowDC(hwin)
    srcdc = win32ui.CreateDCFromHandle(hwindc)
    memdc = srcdc.CreateCompatibleDC()
    bmp = win32ui.CreateBitmap()    
    bmp.CreateCompatibleBitmap(srcdc, width, height)
    memdc.SelectObject(bmp)
    memdc.BitBlt((0, 0), (width, height), srcdc, (left, top), win32con.SRCCOPY)
    bmp.SaveBitmapFile(memdc, file_name) # 'screenshot.bmp'


def captureAndSave(i):
    if i < 10:
        tmpStr = "00000" + str(i)
    elif i < 100:
        tmpStr = "0000" + str(i)
    elif i < 1000:
        tmpStr = "000" + str(i)
    elif i < 10000:
        tmpStr = "00" + str(i)
    elif i < 100000:
        tmpStr = "0" + str(i)
    else:
        tmpStr = str(i)

    my_capture(tmpStr + '.bmp')


def myMainLoop():
    i = 0
    while 1:
        i = i + 1
        captureAndSave(i)
        time.sleep(0.2)

#-----------------------------------------------------------------------------

if __name__ == '__main__':
    try:
        myMainLoop()        # capure all monitor windows
    except KeyboardInterrupt:
        pass 

我从:Python windows 7 screenshot without PIL得到基本代码:


Tags: nameimportdefsmelifstrwin32guibmp
1条回答
网友
1楼 · 发布于 2024-05-01 21:55:57

你会想要清理你的位图和分布式控制系统,在位图保存后添加类似的内容

win32gui.DeleteObject(bmp.GetHandle())
memdc.DeleteDC()
srcdc.DeleteDC()
win32gui.ReleaseDC(hwin, hwindc) 

相关问题 更多 >