You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用变量存储路径调用win32gui.ExtractIconEx提取exe图标找不到文件

问题原因

  • 核心错误1:如果你的实际执行代码是报错里的win32gui.ExtractIconEx("path", 0),说明你错误将变量名path用引号包裹成了字符串常量,API只会去找名为path的文件,自然找不到。
  • 核心错误2:你处理路径时额外拼接了HTML引号实体",相当于给路径前后加了双引号,Windows系统API无法识别带额外引号包裹的文件路径,硬编码时你没有加引号所以能正常执行。
  • 冗余问题:你在循环内反复读取Filepath.txt,既降低执行效率也容易出现读取异常。
  • 潜在兼容问题:你读取的路径用正斜杠/作为分隔符,部分Windows接口可能出现适配问题。

修复步骤

  1. 传参给win32gui.ExtractIconEx时直接使用变量名,不要用引号包裹变量。
  2. 删除路径的引号拼接逻辑,给ExtractIconEx传入纯净的文件路径,仅给后续os.system调用的路径加引号即可(用于适配带空格的路径)。
  3. 将文件读取操作移到循环外,一次性读取所有路径后再遍历。
  4. 可选:用os.path.normpath将路径转换为Windows标准的反斜杠分隔格式,避免兼容问题。

修复后的核心代码片段

# 提前一次性读取所有路径,避免循环内反复读文件
with open('Filepath.txt', 'r', encoding='utf-8') as f:
    all_lines_variable = [line.rstrip('\n') for line in f.readlines()]
# 提前定义图标缓存列表,避免Tkinter图片被垃圾回收导致不显示
icon_cache = []

for N in range(hor * ver):
    if N >= len(all_lines_variable):
        break
    raw_path = all_lines_variable[N]
    if raw_path.startswith('C:/'):
        # 给ExtractIconEx用的纯净路径,转成标准Windows格式
        icon_path = os.path.normpath(raw_path)
        # 给os.system用的带引号路径,处理路径中的空格
        exec_path = f'"{raw_path}"'
        print(icon_path)
        R = int(N / Density)
        C = int(N % Density)

        name = f'icon {R} {C}.png'
        print(name)
        ico_x = win32api.GetSystemMetrics(win32con.SM_CXICON)
        ico_y = win32api.GetSystemMetrics(win32con.SM_CYICON)

        # 直接传纯净路径变量即可,不要加引号
        large, small = win32gui.ExtractIconEx(icon_path, 0)
        win32gui.DestroyIcon(small[0])

        hdc = win32ui.CreateDCFromHandle(win32gui.GetDC(0))
        hbmp = win32ui.CreateBitmap()
        hbmp.CreateCompatibleBitmap(hdc, ico_x, ico_x)
        hdc = hdc.CreateCompatibleDC()

        hdc.SelectObject(hbmp)
        hdc.DrawIcon((0, 0), large[0])
        hbmp.SaveBitmapFile(hdc, name)

        AppIMG = Image.open(name)
        AppIMG = AppIMG.resize((size, size), Image.NEAREST)
        AppPhoto = ImageTk.PhotoImage(AppIMG)
        # 把图片存入缓存避免被回收
        icon_cache.append(AppPhoto)

        App_button = Button(frame, image=AppPhoto, fg='white', bg='#2e2e2e', relief='flat', borderwidth=1)
        App_button.grid(row=R, column=C, sticky=NSEW)
        # 绑定带引号的执行路径
        App_button.config(command=lambda path=exec_path: open_app(path))

内容的提问来源于stack exchange,提问作者Jochem van Dolder

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 21:09:04