使用变量存储路径调用win32gui.ExtractIconEx提取exe图标找不到文件
问题原因
- 核心错误1:如果你的实际执行代码是报错里的
win32gui.ExtractIconEx("path", 0),说明你错误将变量名path用引号包裹成了字符串常量,API只会去找名为path的文件,自然找不到。 - 核心错误2:你处理路径时额外拼接了HTML引号实体
",相当于给路径前后加了双引号,Windows系统API无法识别带额外引号包裹的文件路径,硬编码时你没有加引号所以能正常执行。 - 冗余问题:你在循环内反复读取
Filepath.txt,既降低执行效率也容易出现读取异常。 - 潜在兼容问题:你读取的路径用正斜杠
/作为分隔符,部分Windows接口可能出现适配问题。
修复步骤
- 传参给
win32gui.ExtractIconEx时直接使用变量名,不要用引号包裹变量。 - 删除路径的引号拼接逻辑,给
ExtractIconEx传入纯净的文件路径,仅给后续os.system调用的路径加引号即可(用于适配带空格的路径)。 - 将文件读取操作移到循环外,一次性读取所有路径后再遍历。
- 可选:用
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
相关产品推荐
相关产品推荐

